06Docker-Compose和微服务部署

Docker-Compose

概述

Docker Compose通过一个单独的docker-compose.yml模板文件来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署

  • 一般一个docker-compose.yml对应完整的项目,项目中的服务和中间件对应不同的容器

Compose文件实质就是集成了多个docker run命令,只是语法变成通过指令定义集群中的每个容器运行时的参数信息

docker run 参数 docker compose 指令 说明
--name container_name 容器名称
-p ports 端口映射
-e environment 环境变量
-v volumes 数据卷配置
--network networks 网络
-d 不需要指定, 默认就是后台运行 运行方式
EXPOSE 在微服务集群部署中,像MySQL和Reids等中间件仅仅是供给给集群内的服务使用的,所以不需要对外暴露端口 暴露端口

安装DockerCompose

在Linux中使用命令去github下载DockerCompose安装包并修改文件权限(下载速度可能较慢),可以自己在浏览器中下载安装包上传到/usr/local/bin目录

bash 复制代码
# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 修改文件权限
chmod +x /usr/local/bin/docker-compose
# 检测docker-compose是否安装成功
docker-compose

设置DockerCompose自动补全功能,如果出现错误Failed connect to raw.githubusercontent.com:443; Connection refused就修改hosts文件

bash 复制代码
# 自动补全的命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
# 出现错误后需要修改自己的hosts文件(重启一下网络systemctl start network),再配置自动补全的命令
echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts
# 如出现TCP connection reset by peer错误需要重复发起命令多试几次

DockerCompose命令

docker compose [OPTIONS] [COMMAND]: OPTIONS和COMMAND都是可选参数,常见命令参考官方文档

类型 参数或指令 说明
Options -f 指定compose文件的路径和名称,如果文件在当前目录且名称为docker-compose.yml则不用指定
-p 指定project名称, project就是当前compose文件中设置的多个service的集合
Commands up 创建并启动所有service容器
down 停止并移除所有容器、网络
ps 列出所有启动的容器
logs 查看指定容器的日志
stop 停止容器
start 启动容器
restart 重启容器
top 查看运行的进程
exec 在指定的运行中容器中执行命令

部署微服务集群

单体项目部署

基于docker-compose.yml文件一键部署项目

shell 复制代码
# 1.进入root目录
cd /root

# 2.删除旧容器
docker rm -f $(docker ps -qa)

# 3.删除hmall镜像
docker rmi hmall

# 4.清空MySQL数据
rm -rf mysql/data

# 5.启动所有, -d参数是后台启动
docker compose up -d
# 结果:
[+] Building 15.5s (8/8) FINISHED
 => [internal] load build definition from Dockerfile                                    0.0s
 => => transferring dockerfile: 358B                                                    0.0s
 => [internal] load .dockerignore                                                       0.0s
 => => transferring context: 2B                                                         0.0s
 => [internal] load metadata for docker.io/library/openjdk:11.0-jre-buster             15.4s
 => [1/3] FROM docker.io/library/openjdk:11.0-jre-buster@sha256:3546a17e6fb4ff4fa681c3  0.0s
 => [internal] load build context                                                       0.0s
 => => transferring context: 98B                                                        0.0s
 => CACHED [2/3] RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo   0.0s
 => CACHED [3/3] COPY hm-service.jar /app.jar                                           0.0s
 => exporting to image                                                                  0.0s
 => => exporting layers                                                                 0.0s
 => => writing image sha256:32eebee16acde22550232f2eb80c69d2ce813ed099640e4cfed2193f71  0.0s
 => => naming to docker.io/library/root-hmall                                           0.0s
[+] Running 4/4
 ✔ Network hmall    Created                                                             0.2s
 ✔ Container mysql  Started                                                             0.5s
 ✔ Container hmall  Started                                                             0.9s
 ✔ Container nginx  Started                                                             1.5s

# 6.查看镜像
docker compose images
# 结果
CONTAINER           REPOSITORY          TAG                 IMAGE ID            SIZE
hmall               root-hmall          latest              32eebee16acd        362MB
mysql               mysql               latest              3218b38490ce        516MB
nginx               nginx               latest              605c77e624dd        141MB

# 7.查看容器
docker compose ps
# 结果
NAME                IMAGE               COMMAND                  SERVICE             CREATED             STATUS              PORTS
hmall               root-hmall          "java -jar /app.jar"     hmall               54 seconds ago      Up 52 seconds       0.0.0.0:8080->8080/tcp, :::8080->8080/tcp
mysql               mysql               "docker-entrypoint.s..."   mysql               54 seconds ago      Up 53 seconds       0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
nginx               nginx               "/docker-entrypoint...."   nginx               54 seconds ago      Up 52 seconds       80/tcp, 0.0.0.0:18080-18081->18080-18081/tcp, :::18080-18081->18080-18081/tcp

定义docker-compose.yml文件指定要创建的容器

sql 复制代码
version: "3.8"

services:
  mysql: # 创建mysql容器的参数信息
    image: mysql# 镜像名称
    container_name: mysql# 容器名称
    ports:# 端口映射
      - "3306:3306"
    environment:# 环境变量
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123
    volumes:# 数据卷挂载
      - "./mysql/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
      - "./mysql/init:/docker-entrypoint-initdb.d"
    networks:
      - hm-net
  hmall: # 创建Java应用容器的参数信息
    build: # 基于Dockerfile文件构建自定义镜像
       context: .
       dockerfile: Dockerfile
    container_name: hmall
    ports:
      - "8080:8080"
    networks:
      - hm-net
    depends_on: # 依赖容器,创建容器时会先创建依赖的容器
      - mysql
  nginx:
    image: nginx
    container_name: nginx
    ports:
      - "18080:18080"
      - "18081:18081"
    volumes:
      - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
      - "./nginx/html:/etc/nginx/html"
    depends_on:
      - hmall # 前端依赖后端
    networks:
      - hm-net
networks: # 需要创建的网络
  hm-net:
    name: hmall

微服务部署步骤

第一步: 在cloud-demo项目中编写docker-compose文件构建镜像并运行容器

shell 复制代码
version: "3.2"
services:
  nacos: # 注册中心和配置中心
    image: nacos/nacos-server # 基于nacos/nacos-server镜像构建
    environment: # 环境变量
      MDOE: standalone # 单点模式启动
    ports: # 端口映射,暴露了8848端口
      - "8848:8848"
    mysql:
      image: mysql:5.7.25 # 基于5.7.25版本的MySQL镜像构建
      environment:
        MYSQL_ROOT_PASSWORD: 123456 # 设置数据库root账户的密码
      volumes: # 数据卷挂载,这里挂载了mysql的data和conf目录
        - "$PWD/mysql/data:/var/lib/mysql"  # $PWD用于获取当前文件所在的目录
        - "$PWD/mysql/conf:/etc/mysql/conf.d"
    # 微服务不需要暴露端口,如果暴露了端口网关的身份认证和权限校验就形同虚设了
    userservice: # 基于Dockerfile文件临时构建
      build: ./user-service 
    orderservice: # 基于Dockerfile文件临时构建
      build: ./order-service
    # 网关需要暴露端口,它是其他微服务的入口
    gateway: # 基于Dockerfile文件临时构建
      build: ./gateway
      ports:
        - "10010:10010"

第二步: 使用Docker Compose部署时, 所有的服务之间都可以用服务名互相访问,那么就可以修改cloud-demo项目中所有服务的yml配置文件

  • 将数据库,nacos地址URL中的localhost重命名为docker-compose中的服务名
yml 复制代码
spring:
  cloud:
    nacos:
      # server-addr: localhost:80 #Nacos地址
      server-addr: nacos:8848 # 使用compose中的服务名来互相访问,用nacos替换localhost
      config:
        file-extension: yaml # 文件后缀名

第三步: 使用maven打包工具, 在每一个服务的pom.xml文件指定将微服务打包为app.jar(打包名需要与Dockerfile文件中一致)

xml 复制代码
<build>
    <!--指定服务打包的最终名称-->
    <finalName>app</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

第四步: 将打包好的app.jar和Dockerfile构建镜像文件拷贝到cloud-demo目录中对应的gateway, order-service, user-service子目录中

bash 复制代码
FROM openjdk:8
COPY ./app.jar /tmp/app.jar
ENTERPOINT java -jar /tmp/app.jar

第五步: 将cloud-demo项目文件夹上传至虚拟机得到最终的目录结构

properties 复制代码
cloud-demo
- gateway
  - app.jar
  - Dockerfile.yml
- order-service
  - app.jar
  - Dockerfile.yml
- user-service
  - app.jar
  - Dockerfile.yml
- mysql
  - data
  - conf
- docker-compose.yml

第六步: 执行docker-compose up -d命令部署项目,docker-compose logs -f查看日志

  • nacos连接失败是由于nacos启动较慢,userservice在nacos之前启动会导致userservice注册失败
BASH 复制代码
# 后台创建镜像部署容器
docker-compose up -d

# 查看日志发现阿里巴巴nacos连接失败
docker-compose logs -f
com.alibaba.nacos.api.exception.NacosException: failed to req API:/nacos/v1/ns/instance/list after all servers([nacos:8848]) tried: java.net.ConnectException: Connection refused (Connection refused)

# 建议nacos单独先启动其他服务后启动,此时可以重启gateway userservice orderservice服务
docker-compose restart gateway userservice orderserivce 

# 再次查看查看userservice启动日志
docker-compose logs -f userservice

第七步: 打开浏览器访问http://虚拟机IP地址/user/1?authorization=admin查看数据

相关推荐
南客先生1 小时前
音视频项目在微服务领域的趋势场景题深度解析
java·微服务·面试·性能优化·音视频·高并发
angushine1 小时前
SpringBoot多工程项目微服务install时如何不安装到本地仓库
spring boot·后端·微服务
王中阳Go1 小时前
最新字节跳动运维云原生面经分享
运维·后端·云原生·面试·golang
阿湯哥2 小时前
外部访问 Kubernetes 集群中 MQ 服务的方案
云原生·容器·kubernetes
南客先生3 小时前
SpringBoot、微服务与AI场景题深度解析
微服务·面试·springboot·ai技术
PolarisHuster3 小时前
如何查看k8s获取系统是否清理过docker镜像
docker·容器·kubernetes
matrixlzp3 小时前
K8S Secret 快速开始
云原生·容器·kubernetes
一只特立独行的猫4 小时前
Docker与Vmware网络模式的对别
网络·docker·容器
GoodStudyAndDayDayUp5 小时前
docker拉取国内镜像
运维·docker·容器
中草药z5 小时前
【Docker】Docker拉取部分常用中间件
运维·redis·mysql·docker·容器·nacos·脚本