【docker】docker-compose部署应用教程
简单介绍
什么是 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
version: '3'
services:
test:
image: "test:1.0"
container_name: test
restart: always
ports:
- 28080:8080
volumes:
- ./data/:/app
environment:
- TZ=Asia/Shanghai
networks:
- test
networks:
test:
external: true
这个 docker-compose.yml 文件定义了一个基于 test:1.0 镜像的单服务应用,配置了容器的基本运行参数、网络、存储等信息。我们逐行拆解每个配置的含义和作用:
1.version: ‘3’:用于指定 Docker Compose 配置文件的版本
2.services 部分:定义容器服务
services 是 Compose 配置的核心,用于定义一个或多个容器服务。这里只定义了一个名为 test 的服务
image: "test:1.0":指定当前服务使用的镜像为 test:1.0,若镜像本地不存在,Compose 会自动从 Docker Hub 或配置的私有仓库拉取
container_name: test:指定容器启动后的名称为 test
restart: always:配置容器的重启策略为 always(总是重启),无论容器因何种原因停止,Docker 都会自动重启该容器
ports: - "28080:8080":配置端口映射,将宿主机的 28080 端口与容器内的 8080 端口绑定,外部访问宿主机的 28080 端口时,请求会被转发到容器内的 8080 端口
volumes: - ./data/:/app:配置数据卷挂载,将宿主机当前目录下的 data 文件夹挂载到容器内的 /app 目录,作用是数据持久化,容器删除后,./data/ 中的数据会保留在宿主机,避免数据丢失
environment: - TZ=Asia/Shanghai:配置容器内的环境变量,这里设置时区为 Asia/Shanghai(北京时间)
networks: - test:指定当前服务(test 容器)加入下面 networks 部分定义的 test 网络
3.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-f620fc48fe62 这个宿主机桥接接口对应的 Docker 自定义网络
docker0 是 Docker 自带的默认网络,安装 Docker 后自动创建,所有未指定网络的容器会默认连接到这个桥
根据当前目录下的 docker-compose.yml 配置文件,创建并启动所有定义的服务容器,且容器会在后台运行 docker-compose up -d
Compose 会自动完成:创建网络,创建并启动各服务容器,挂载卷,设置容器之间的通信,实时监控容器状态,所有容器会自动加入同一个默认网络,可直接通过服务名通信
但是此时查看日志会看到报错

在前面的 Dockerfile 定义了 ADD ./mavenspringboot-1.0-SNAPSHOT.jar /app/mavenspringboot-1.0-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,就成功了,之后继续执行docker logs -f [容器id]就可以访问项目了

http://<宿主机地址>:28080/[接口路径] 就可以访问到该页面了

更新脚本
若更改 JAR 包,编写更新脚本,实现一键更新 vi build.sh
#!/bin/bash
echo "停用所有容器"
docker-compose down
echo "构建镜像"
docker build -t test:1.0.1 .
echo "运行容器"
docker-compose up -d
sh build.sh 运行,用在这种方式需要jar包在当前目录下,而不是/data目录

更多推荐
所有评论(0)