前言

上一期我们简单介绍了 Dockerfile 及对应使用方法,本地项目打包成镜像并上传到 docker 仓库。那么本期继续对 Docker 进行深入,了解 Docker Compose 多容器编排的处理。

本文使用的为 docker compose v2,版本为 v2.28.1,v1 已经停止维护了

Docker Compose 简单认识

Docker Compose 用于定义和运行多容器 Docker 应用的工具,通过一个 docker-compose.yml 文件来配置应用服务,简化了多容器环境的管理。很多复杂的项目往往需要各种各样的中间件,在以前我们需要手动一个一个配置,而现在,我们只需要执行别人写好的 docker-compose 文件即可完成各种组件和环境的引入。

安装 Docker Compose

mac&windows

mac 与 windows 的 Docker Compose 包含在 Docker 桌面端,直接安装桌面端 Docker 即可。

linux

执行下面命令将 Docker 安装在 /usr/local/bin 目录下,其中版本号是可以自由变更的,这里我用的最新的版本,当然你可以去对应的 GitHub 地址更换为自己想要的版本 DockerCompose 发布地址

命令解析:

curl:调用命令行工具 curl

-L:如果请求的资源被重定向到另一个 URL,curl 将自动跟随重定向

-o /usr/local/bin/docker-compose:将下载的文件保存到 /usr/local/bin/ 目录,并命名为 docker-compose

1
sudo curl -L "https://github.com/docker/compose/releases/download/v2.28.1/docker-compose-linux-amd64" -o /usr/local/bin/docker-compose

添加对应的执行权限

1
sudo chmod +x /usr/local/bin/docker-compose

验证安装版本

1
docker compose version

Docker Compose 常用命令

docker compose up: 启动并运行 Docker Compose 定义的所有服务

docker compose down: 停止并删除运行中的容器、网络、镜像和卷

docker compose start: 启动已停止的服务容器

docker compose stop: 停止运行中的服务容器

docker compose restart: 重启服务容器

docker compose ps: 列出与当前项目关联的所有容器

docker compose logs: 查看服务的输出日志

docker compose -p mycompose logs nacos:在名为 mycompose 的容器组中,查看 nacos 服务的日志。

docker compose config: 验证和查看 Compose 文件的配置

docker compose exec: 在运行的容器中执行命令

docker compose -p mycompose exec db bash:在名为 mycompose 的容器组中,进入 db 服务容器内。

docker compose version: 查看当前版本

Docker Compose 示例(本地项目与已有网络)

下面是一个简单的配置示例,注意,Docker compose 的 yml 文件名必须为 docker-compose.yml!这个因为用的是我本地的项目,所以参考一下即可,第二个示例可以实际运行。

下面对其中部分进行更细致的关系解释:

  1. 配置文件中的服务名是可以自定义的,如 web、db、redis 等
  2. 如果想将我们自己的项目加入到 docker compose,有 2 种方法,第一种是直接使用 build 命令,其中 context 是上下文路径,会在构建 web 服务时,将该路径作为构建时的工作目录,同时 dockerfile 需要设置为对应的 dockerfile 位置及名字(这里我没写 Dockerfile 的路径原因是默认会在上下文中找)。第二种是提前将自己的项目上传到 Docker 仓库,使用镜像来创建,在第二个示例会展示这种方法。
  3. depends_on 为依赖其他服务,例如 web 依赖于 db 和 redis,那么在 db 和 redis 启动后,web 才会启动
  4. 服务中 volumes 所挂载的卷,如果为名字的话,并且在 volumes 有定义(倒数第八行),那么有 Docker 自动创建并管理。通过下面 2 个命令来查看具体信息:docker volume ls, docker volume inspect '${name}'
  5. 网络可以在 yml 中定义一个新的直接使用,也可以使用已有的网络。第一个例子是使用已有网络,第二个示例则是创建一个新的网络
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
version: '3.8'  # 指定使用的Docker Compose版本
services: # 定义服务部分
web: # web服务
build: # 构建上下文
context: /Users/sora33/JavaCode/sora33 # 选择当前目录为上下文路径
dockerfile: Dockerfile # 指定使用的Dockerfile文件
ports: # 暴露端口
- "1234:1234" # 将主机的1234端口映射到容器的1234端口
depends_on: # 定义依赖的服务
- db # web服务依赖于db服务
- redis # web服务依赖于redis服务
networks: # 定义网络连接
- sora33network # 连接到名为sora33network的网络

db: # 数据库服务
image: mysql:latest # 使用MySQL最新版
volumes: # 定义挂载卷
- db-data:/var/lib/mysql # 将主机的db-data目录挂载到容器内
ports: # 暴露端口
- "3310:3306" # 将主机的3310端口映射到容器的3306端口
environment: # 设置环境变量
MYSQL_ROOT_PASSWORD: example # MySQL root用户的密码
MYSQL_DATABASE: mydatabase # 要创建的数据库名称
MYSQL_USER: user # 要创建的普通用户
MYSQL_PASSWORD: password # 普通用户的密码
networks: # 定义网络连接
- sora33network # 连接到名为sora33network的网络

redis: # Redis服务
image: redis:latest # 使用最新版本的Redis
ports: # 暴露端口
- "6333:6379" # 将主机的6333端口映射到容器的6379端口
networks: # 定义网络连接
- sora33network # 连接到名为sora33network的网络

volumes: # 定义卷部分
web-data: # 定义名为web-data的卷
db-data: # 定义名为db-data的卷

# 表示已有网络,不再次创建
networks:
sora33network:
external: true

Docker Compose 示例(自有镜像与新建网络)

这个示例我使用我自己的仓库,同时,网络使用的是内部网络。

使用 docker compose -p mydocker up -d 来启动该容器组并命名为 mydocker,这里命名不可以包含大写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
version: '3.8'
services:
web:
# 直接使用我已经上传到Docker仓库的镜像
image: sora33/dockertest:v1.0
container_name: web
ports:
- "1234:1234"
depends_on:
- db
- redis
volumes:
- /Users/sora33/docker/test:/home
networks:
- backend

db:
image: mysql:latest
container_name: mysqlDB
environment:
MYSQL_ROOT_PASSWORD: root33
MYSQL_DATABASE: sora33test
ports:
- "3310:3306"
volumes:
- db_data:/var/lib/mysql
networks:
- backend

redis:
image: redis:latest
container_name: redisDB
ports:
- "6333:6379"
volumes:
- redis_data:/data
networks:
- backend

volumes:
db_data:
redis_data:

# 创建一个名为backend的新网络
networks:
backend:

启动成功后,可以自己尝试连接 MySQL 与 Redis,端口号分别为 3310 和 6333。web 服务则可以通过 127.0.0.1:1234/ai/A 来访问验证。

结束语

以上就是 Docker Compose 的认识与部署,现在越来越多的项目使用 Docker Compose 部署,如果掌握了这种方法,对于部署的我们来说也是越来越简单。希望通过本文,可以帮助大家更好的理解 Docker Compose~