DockerCompose与多容器编排
DockerCompose与多容器编排
- DockerCompose
- docker-compose.yml文件
- 更新脚本
DockerCompose
什么是 Docker Compose?
Docker Compose 是 Docker 官方提供的多容器应用管理工具,它可以通过一个 YAML 配置文件(通常命名为 docker-compose.yml)定义多个容器的服务、网络、存储等配置,然后通过一条命令就能批量创建、启动、停止这些容器,极大简化了多容器应用的部署和管理流程。
为什么需要 Docker Compose?
当应用依赖多个组件时,手动管理这些容器会非常繁琐,每个容器需要单独用 docker run 启动,还要配置端口映射、环境变量、网络连接,容器间有依赖关系,手动启动容易出错,重启、停止时需要逐个操作,效率低。而 Docker Compose 可以解决这些问题,通过一个配置文件声明所有容器的信息和关系,用简单的命令一键启动所有服务,实现 “配置即代码” 的管理方式。
我们接着上一篇博客 Dockerfile镜像构建 的内容进行操作
docker-compose.yml文件
在 test 目录下编写 docker-compose.yml 文件 vi docker-compose.yml

这个 docker-compose.yml 文件定义了一个基于 test:1.0 镜像的单服务应用,配置了容器的基本运行参数、网络、存储等信息。我们逐行拆解每个配置的含义和作用:
- version: ‘3’:用于指定 Docker Compose 配置文件的版本
- services 部分:定义容器服务
services 是 Compose 配置的核心,用于定义一个或多个容器服务。这里只定义了一个名为 test 的服务
image: "test:1.0":指定当前服务使用的镜像为 test:1.0,若镜像本地不存在,Compose 会自动从 Docker Hub 或配置的私有仓库拉取
container_name: test:指定容器启动后的名称为 test
restart: always:配置容器的重启策略为 always(总是重启),无论容器因何种原因停止,Docker 都会自动重启该容器
ports: - "18080:8080":配置端口映射,将宿主机的 18080 端口与容器内的 8080 端口绑定,外部访问宿主机的 18080 端口时,请求会被转发到容器内的 8080 端口
volumes: - ./data/:/app:配置数据卷挂载,将宿主机当前目录下的 data 文件夹挂载到容器内的 /app 目录,作用是数据持久化,容器删除后,./data/ 中的数据会保留在宿主机,避免数据丢失
environment: - TZ=Asia/Shanghai:配置容器内的环境变量,这里设置时区为 Asia/Shanghai(北京时间)
networks: - test:指定当前服务(test 容器)加入下面 networks 部分定义的 test 网络 - networks 部分:定义网络配置
networks 用于声明服务使用的网络,这里定义了一个名为 test 的网络
test: external: true
表示 test 网络是已经存在于 Docker 环境中的网络,Compose 在启动服务时,会直接使用已有的 test 网络,而不会尝试创建新网络。
为什么需要创建一个公共网络?
通常用于多个 Compose 项目共享同一网络的场景。例如:项目 A 的数据库服务和项目 B 的 API 服务需要通信,可提前创建一个公共网络 test,让两个项目的服务都加入该网络,实现跨项目通信。容器间的通信依赖网络,加入同一网络的容器可通过 “服务名” 或 “容器名” 互相访问,无需知道对方的 IP 地址。
手动创建名为 test 的 docker 网络组,执行 docker network create test
查看所有网络接口信息 ifconfig

执行创建名为 test 的 docker 网络组这个命令,就是创建了 br-cd3cac47dc55 这个宿主机桥接接口对应的 Docker 自定义网络
docker0 是 Docker 自带的默认网络,安装 Docker 后自动创建,所有未指定网络的容器会默认连接到这个桥
根据当前目录下的 docker-compose.yml 配置文件,创建并启动所有定义的服务容器,且容器会在后台运行 docker-compose up -d
Compose 会自动完成:创建网络,创建并启动各服务容器,挂载卷,设置容器之间的通信,实时监控容器状态,所有容器会自动加入同一个默认网络,可直接通过服务名通信
但是此时查看日志会看到报错

在前面的 Dockerfile 定义了 ADD ./docker-0.0.1-SNAPSHOT.jar /app/docker-0.0.1-SNAPSHOT.jar,执行时机是镜像构建时,将宿主机当前目录下的 Java 应用 JAR 包复制到镜像 /app 目录下了,但 docker-compose.yml 中又定义了 volumes: - ./data/:/app,执行时机是容器启动时,这样容器启动后,docker-compose.yml 的 volumes: - ./data/:/app 会覆盖 Dockerfile 中 ADD 到镜像 /app 目录的 JAR 包,最终容器内 /app 目录的内容由宿主机 ./data/ 目录决定,而非镜像中复制的 JAR 包
所以我们需要在当前目录下创建 data 文件夹,并且需要将 JAR 包上传到该文件夹下
此时需要执行 docker-compose down 停止并清理容器服务
再重新创建并启动 docker-compose up -d,就成功了

http://<宿主机地址>:18080 就可以访问到该页面了,但我这里 controller 层接口路径带了 /test,所以我的访问路径是 http://<宿主机地址>:18080/test

更新脚本
若更改 JAR 包,编写更新脚本,实现一键更新 vi build.sh
#!/bin/bash
echo "停用所有容器"
docker-compose down
echo "构建镜像"
docker build -t test:1.0 .
echo "运行容器"
docker-compose up -d
sh build.sh 运行

