前言

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

本文使用的为docker compose v2,版本为v2.28.1,v1已经停止维护了(docker compose的版本为2.x.x就是v2,v1的命令使用-连接的,如v1:docker-compose up v2:docker compose up)。

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~