最实用的 Docker 知识(二)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

4. Docker-Compose

当我们部署一个微服务项目时里面的一个一个服务需要单独部署那么有没有一种办法帮助我们快速合并部署呢有那就是使用 Docker-Compose 进行编排部署
Docker Compose 可以基于 Compose 文件帮我们快速的部署分布式应用而无需手动一个个创建和运行容器
![image.png](https://img-blog.csdnimg.cn/img_convert/95900a372b9b5e470b6a6d204ccde424.png#averageHue=#61605f&clientId=u8c786143-1287-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=521&id=u80074277&margin=[object Object]&name=image.png&originHeight=704&originWidth=782&originalType=binary&ratio=1&rotation=0&showTitle=false&size=254459&status=done&style=none&taskId=ua77cbdca-dcac-4895-bbb8-150ca6be803&title=&width=579.2593001796087)

4.1 docker-compose 文件

Compose 文件是一个文本文件通过指令定义集群中的每个容器如何运行。格式如下

version: "3.8"
services:
 mysql:
   image: mysql:5.7.25
   environment:
    MYSQL_ROOT_PASSWORD: 123 
   volumes:
    - "/tmp/mysql/data:/var/lib/mysql"
    - "/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf"
 web:
   build: .
   ports:
    - "8090:8090"

上面的 Compose 文件就描述一个项目其中包含两个容器

  • mysql一个基于mysql:5.7.25 镜像构建的容器并且挂载了两个目录
  • web一个基于 docker build 临时构建的镜像容器映射端口时8090

DockerCompose 的详细语法参考官网https://docs.docker.com/compose/compose-file/
其实 DockerCompose 文件可以看做是将多个 docker run 命令写到一个文件只是语法稍有差异

4.2 实战🔥🔥🔥

在实战前我们需要安装 docker-compsoe这里直接去官网进行安装即可
需求将之前学习的 cloud-demo 微服务集群利用 DockerCompose 部署
实现思路
① 编写 docker-compose 文件
② 修改自己的 cloud-demo 项目将数据库、nacos 地址都命名为 docker-compose 中的服务名
③ 使用 maven 打包工具将项目中的每个微服务都打包为 app.jar
④ 将打包好的 app.jar 拷贝到 cloud-demo 中的每一个对应的子目录中
⑤ 将 cloud-demo 上传至虚拟机利用 docker-compose up -d 来部署
docker-coompose 文件

version: "3.0"

services:
  nacos:
    image: nacos/nacos-server:1.4.1
    environment:
      MODE: standalone
    ports:
      - "8848:8848"
  mysql:
    image: mysql:5.6
    environment:
      MYSQL_ROOT_PASSWORD: 806823
    volumes:
      - "/tmp/mysql/data:/var/lib/mysql"
      - "/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/my.cnf"
    ports:
      - "3306:3306"
  userservice:
    build: ./user-service
    depends_on:
      - nacos
      - mysql
    ports:
      - "8081:8081"
  orderservice:
    build: ./order-service
    depends_on:
      - nacos
      - mysql
    ports:
      - "8080:8080"
  gateway:
    build: ./gateway
    depends_on:
      - nacos
      - mysql
    ports:
      - "10010:10010"

![image.png](https://img-blog.csdnimg.cn/img_convert/c31041e878730535986b51d3be84ae46.png#averageHue=#fcfbfa&clientId=u8c786143-1287-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=179&id=u39a85011&margin=[object Object]&name=image.png&originHeight=241&originWidth=1174&originalType=binary&ratio=1&rotation=0&showTitle=false&size=20854&status=done&style=none&taskId=ua4a7244f-965c-4cb0-964e-416c8b054e0&title=&width=869.6296910624816)
每个微服务目录下如下所示
![image.png](https://img-blog.csdnimg.cn/img_convert/a42ce714c7199b94f47820b9b7aaf0f1.png#averageHue=#fcfbfb&clientId=u8c786143-1287-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=79&id=u3c8ddd5c&margin=[object Object]&name=image.png&originHeight=106&originWidth=1061&originalType=binary&ratio=1&rotation=0&showTitle=false&size=8615&status=done&style=none&taskId=u14d64853-d609-415c-a66b-d0d4a304cd7&title=&width=785.925981445735)
Dockerfile 文件如下所示

FROM java:8-alpine
COPY ./app.jar /tmp/app.jar
ENTRYPOINT java -jar /tmp/app.jar

修改微服务配置
因为微服务将来要部署为 docker 容器而容器之间互联不是通过 IP 地址而是通过容器名。这里我们将order-service、user-service、gateway 服务的 mysql、nacos 地址都修改为基于容器名的访问。
如下所示

spring:
  datasource:
    url: jdbc:mysql://mysql:3306/cloud_order?useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver
  application:
    name: orderservice
  cloud:
    nacos:
      server-addr: nacos:8848 # nacos服务地址

所有连接 mysql 的地方都要修改为 mysql 的容器名称(需要添加端口号)
所有连接 nacos 的地方都要修改为 nacos 的容器名称(需要添加端口号)

打包
接下来需要将我们的每个微服务都打包。因为之前查看到Dockerfile中的jar包名称都是 app.jar因此我们的每个微服务都需要用这个名称。
可以通过修改pom.xml中的打包名称来实现每个微服务都需要修改

<build>
  <!-- 服务打包的最终名称 -->
  <finalName>app</finalName>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
  </plugins>
</build>

拷贝 jar 包到部署目录下部署即可
然后进入文件下输入命令

docker-compose up -d

![image.png](https://img-blog.csdnimg.cn/img_convert/a6117b8424f120390008f37c083e11a1.png#averageHue=#0a0907&clientId=u8c786143-1287-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=290&id=ufa18eae4&margin=[object Object]&name=image.png&originHeight=392&originWidth=2013&originalType=binary&ratio=1&rotation=0&showTitle=false&size=58846&status=done&style=none&taskId=ud317bfd6-2d72-47aa-8f69-2f80186b01f&title=&width=1491.1112164469978)
但是此时我们访问路径发现访问不同这时我们可以通过日志查看情况如下所示
![image.png](https://img-blog.csdnimg.cn/img_convert/2bcb347a828351bc0b0511368a8ae900.png#averageHue=#110e0c&clientId=u8c786143-1287-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=170&id=u5f0c7bed&margin=[object Object]&name=image.png&originHeight=230&originWidth=2282&originalType=binary&ratio=1&rotation=0&showTitle=false&size=49292&status=done&style=none&taskId=u4a526b45-e113-4549-8d79-532eebebe33&title=&width=1690.3704897824387)
通过日志发现我们的 user-service、order-service、gateway 都没有启动成功这是因为我们在编排部署时可能会有发生错误我们重新启动这三个微服务即可
![image.png](https://img-blog.csdnimg.cn/img_convert/87c111d676f171659f8ff908bd88d622.png#averageHue=#181512&clientId=u8c786143-1287-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=27&id=ub56f1caa&margin=[object Object]&name=image.png&originHeight=37&originWidth=1301&originalType=binary&ratio=1&rotation=0&showTitle=false&size=4695&status=done&style=none&taskId=ufb3a364b-8675-40ce-86ea-9aee8430135&title=&width=963.7037717821878)
然后把我们的数据库文件导入进行访问如下所示
![image.png](https://img-blog.csdnimg.cn/img_convert/1396556e1f720167dab651fe2a316cda.png#averageHue=#fdfdfc&clientId=u8c786143-1287-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=290&id=u6eb3ff41&margin=[object Object]&name=image.png&originHeight=391&originWidth=1476&originalType=binary&ratio=1&rotation=0&showTitle=false&size=50120&status=done&style=none&taskId=u3747e711-16c3-44e0-b232-2638d9c5e03&title=&width=1093.3334105691847)
![image.png](https://img-blog.csdnimg.cn/img_convert/4b3022f6bc7320cb998e5a9756b6068a.png#averageHue=#fefdfc&clientId=u8c786143-1287-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=186&id=udb99ffdd&margin=[object Object]&name=image.png&originHeight=251&originWidth=1252&originalType=binary&ratio=1&rotation=0&showTitle=false&size=32748&status=done&style=none&taskId=u7058c1d0-5bcd-493e-a8ab-41ea07abb49&title=&width=927.4074729218287)
![image.png](https://img-blog.csdnimg.cn/img_convert/93f93834ec082e6f59be1cebe13dcbab.png#averageHue=#fefdfc&clientId=u8c786143-1287-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=189&id=u2703460f&margin=[object Object]&name=image.png&originHeight=255&originWidth=1265&originalType=binary&ratio=1&rotation=0&showTitle=false&size=32454&status=done&style=none&taskId=u85648bc4-6e1f-482b-90ca-f8e963f7852&title=&width=937.0371032317199)
![image.png](https://img-blog.csdnimg.cn/img_convert/5c61f16a4ecba35f9b3731b4e3eb9f9f.png#averageHue=#fdfdfc&clientId=u8c786143-1287-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=310&id=u64d182df&margin=[object Object]&name=image.png&originHeight=418&originWidth=1265&originalType=binary&ratio=1&rotation=0&showTitle=false&size=47883&status=done&style=none&taskId=u72097175-da78-498c-ba67-fece47913d9&title=&width=937.0371032317199)
部署成功都可进行访问

5. Docker 镜像仓库

首先我们要了解为什么要搭建镜像仓库这是为了我们后期全自动化部署做准备
![image.png](https://img-blog.csdnimg.cn/img_convert/f6cd450cb8dbc0bf9657491fe3030db5.png#averageHue=#fbf6f2&clientId=u8c786143-1287-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=459&id=u0e4d0f7e&margin=[object Object]&name=image.png&originHeight=620&originWidth=1468&originalType=binary&ratio=1&rotation=0&showTitle=false&size=141270&status=done&style=none&taskId=uc2e3ad9b-d20b-4d48-a253-ec15af7953d&title=&width=1087.4074842246362)

5.1 搭建镜像仓库

简化版镜像仓库
Docker 官方的 Docker Registry 是一个基础版本的 Docker 镜像仓库具备仓库管理的完整功能但是没有图形化界面

docker run -d \
    --restart=always \
    --name registry	\
    -p 5000:5000 \
    -v registry-data:/var/lib/registry \
    registry

命令中挂载了一个数据卷 registry-data 到容器内的 /var/lib/registry 目录这是私有镜像库存放数据的目录。
访问 http://YourIp:5000/v2/_catalog 可以查看当前私有镜像服务中包含的镜像
带有图形化界面版本

version: '3.0'
services:
  registry:
    image: registry
    volumes:
      - ./registry-data:/var/lib/registry
  ui:
    image: joxit/docker-registry-ui:static
    ports:
      - 8080:80
    environment:
      - REGISTRY_TITLE=我的私有仓库
      - REGISTRY_URL=http://registry:5000
    depends_on:
      - registry

配置 Docker 信任地址
我们的私服采用的是 http 协议默认不被 Docker 信任所以需要做一个配置

# 打开要修改的文件
vim /etc/docker/daemon.json
# 添加内容
"insecure-registries":["http://192.168.80.128:5000"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker

5.2 拉取、推送镜像

推送镜像到私有镜像服务必须先 tag步骤如下
① 重新 tag 本地镜像名称前缀为私有仓库的地址192.168.80.128:5000/

docker tag nginx:latest 192.168.80.128:5000/nginx:1.0 

② 推送镜像

docker push 192.168.80.128:5000/nginx:1.0 

③ 拉取镜像

docker pull 192.168.80.128:5000/nginx:1.0 

设置容器开启自启

docker update --restart=always 容器名称

更多知识在我的语雀知识库https://www.yuque.com/ambition-bcpii/muziteng

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Docker