什么是 Docker Compose?
Docker Compose 是 Docker 官方推出的开源项目,用于快速编排和管理多个 Docker 容器的应用程序。它允许用户通过一个 YAML 格式的配置文件 docker-compose.yml
来定义和运行多个相关联的应用容器,从而实现对容器的统一管理和编排。
Docker Compose 的核心概念
- 项目(Project) :由一组关联的应用容器组成的一个完整业务单元。项目在
docker-compose.yml
文件中定义。 - 服务(Service) :一个应用的容器,可以包括若干运行相同镜像的容器实例。每个服务可以看作是项目中的一个独立组件。
- 容器(Container) :实际运行的服务实例。
主要功能
- 容器编排:通过
docker-compose.yml
文件定义容器之间的依赖关系、网络连接、卷等配置,从而实现容器的自动化启动和管理。 - 生命周期管理:支持启动、停止、重建服务,查看服务状态,流式传输日志输出,以及在服务上运行一次性命令。
- 多环境支持:适用于开发、测试、生产等多种环境。
docker-compose.yml文件结构与示例
docker-compose.yml文件中:顶级元素有六类:
- name工程名
- services服务定义
- networks网络定义
- volumes卷定义
- configs配置
- secrets敏感类配置
关于docker-compose.yml文件的具体说明请参阅官网:https://docs.docker.com/reference/compose-file/
下面以编配一个mysql数据库和wordpress博客作为例,展示docker-compose.yml文件内容:
#定义COMPOSE的工程名。该工程名会赋值给环境变量COMPOSE_PROJECT_NAME
name: p_myblog#服务定义:下面分别定义名为mysql和wordpress的两个服务
#mysql应先于wordpress启动,所以wordpress依赖于mysql
services:mysql:container_name: cntr_mysqlimage: mysql:8.4.3ports:- "3306:3306"environment:- MYSQL_ROOT_PASSWORD=root123- MYSQL_USER=wordpress- MYSQL_PASSWORD=wp456- MYSQL_DATABASE=db_wordpressvolumes:- v-mysqldata:/var/lib/mysql- /app/mysqlconf:/etc/mysql/conf.drestart: alwaysnetworks:- net-for-blogwordpress:image: wordpressports:- "9898:80"environment:WORDPRESS_DB_HOST: cntr_mysqlWORDPRESS_DB_USER: wordpressWORDPRESS_DB_PASSWORD: wp456WORDPRESS_DB_NAME: db_wordpressvolumes:- v-wordpress:/var/www/htmlrestart: alwaysnetworks:- net-for-blogdepends_on:- mysql#卷定义:服务所需要的卷映射都需要在此定义(目录挂载无需在此定义)
volumes:v-mysqldata:v-wordpress:#网络定义:
networks:net-for-blog:
docker compose命令
1、根据yaml创建容器,并运行容器
#选项-f指定yaml文件名, 选项-d指定容器为后台运行
docker compose -f docker-compose.yml up -d
执行结果如下截图,浏览器访问http://192.168.43.201:9898/ 可以打开WordPress博客页面。
注意:
1、对于网络和卷,是以“工程名_指定名”作为最后的名称。
2、在docker-compose.yml文件中,指定了mysql的容器名。但没有指定wordpress的容器名,因此它自动以“工程名-服务名-序号”生成了容器名。
2、修改yaml后,仅reCreate重新构建涉及变化的容器,并运行容器
对docker-compose.yml文件中wordpress的端口暴露映射配置改为:2828:80
然后执行以下命令(与上面完全一样)
#选项-f指定yaml文件名, 选项-d指定容器为后台运行
docker compose -f docker-compose.yml up -d
执行完成后,可以看到它聪明的识别出变化部分:服务mysql因没有变,所以没有重建也没有重启。只对涉及变化的wordpress进行了reCreate重建并重新启动。
3、查看由compose编配的容器(各种状态)
#只列出由compose编配的容器状态(非compose编排的容器不会展示)
docker compose ps -a
4、停止由compose编配的容器
#停止由compose编配的容器(非compose编排的容器不会停止)
docker compose -f docker-compose.yml stop
5、启动由compose编配的容器
#启动由compose编配的容器(非compose编排的容器不会启动)
docker compose -f docker-compose.yml start
6、停止并删除由compose编配的容器
#停止并删除由compose编配的容器
docker compose -f docker-compose.yml down
注意:
1、删除了容器、网络。
2、卷(以及挂载目录)没有被删除,在宿主机上依然存在。若下次通过up命令运行时,卷(以及挂载目录)已存在的数据仍可以继续使用。