目录
1. 介绍
docker-compose主要负责对单服务器上的多个Docker容器进行编排
一般一个容器中只运行一个服务。Compose允许用户通过一个单独的docker-compose.yml模板文件,来定义一组相关联的容器为一个项目(project)。可以同时启动、停止多个容器,还能解决容器启动的先后顺序
2. docker-compose的下载和卸载
[root@docker ~]#
[root@docker ~]# wget https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64
[root@docker ~]#
[root@docker ~]# mv docker-compose-linux-x86_64 docker-compose
[root@docker ~]#
[root@docker ~]# chmod +x docker-compose
[root@docker ~]#
[root@docker ~]# mv docker-compose /usr/libexec/docker/cli-plugins
[root@docker ~]#
[root@docker ~]# docker compose version
Docker Compose version v2.5.0
[root@docker ~]#
3. compose使用的步骤
- 从仓库拉取镜像或编写Dockerfile构建镜像
- 编写docker-compose.yml定义一个完整的业务
- 执行docker-compose up命令启动一个项目的多个服务
4. docker-compose常用命令
- docker-compose -h:查看帮助
- docker-compose up:启动当前docker-compose的所有服务
- docker-compose up -d:以后台方式启动当前docker-compose的所有服务
- docker-compose down:停止并删除当前docker-compose的容器、网络、卷、镜像
- docker-compose exec docker-compose.yml里面的service id /bin/bash:进入容器实例内部
- docker-compose ps:展示当前docker-compose编排的运行的所有容器
- docker-compose top:展示当前docker-compose编排的容器进程
- docker-compose logs docker-compose.yml里面的service id:查看容器输出日志
- docker-compose config:检查docker-compose.yml的配置是否正确
- docker-compose config -q:检查docker-compose.yml的配置是否正确,有问题才有输出
- docker-compose restart:重启当前docker-compose的所有服务
- docker-compose start:启动当前docker-compose的所有服务
- docker-compose stop:停止当前docker-compose的所有服务
5. docker-compose.yml编写
docker-compose的两个重要概念:
- 一个项目(project)是一组关联的容器组成的完整业务
- 一个服务(service)是提供一个服务的容器
目标:假设mysql和redis构成一个完整的业务,这就是一个项目。但必须先启动mysql再启动redis,而且它们处于一个自定义的network下。如果项目中有自定义的镜像,可以先编写Dockerfile生成镜像
docker-compose.yml内容如下。其中service的名称不能冲突。network会自动创建
[root@docker ~]#
[root@docker ~]# mkdir my_compose
[root@docker ~]#
[root@docker ~]# cd my_compose/
[root@docker my_compose]#
[root@docker my_compose]# cat docker-compose.yml
services:
redis:
image: redis
ports:
- "6379:6379"
privileged: true
volumes:
- /root/redis/data:/data
networks:
- my_network
command: redis-server --bind 0.0.0.0 --port 6379 --appendonly yes --cluster-enabled yes
depends_on:
- mysql
mysql:
image: mysql
container_name: my_mysql
environment:
MYSQL_ROOT_PASSWORD: 'Root_123'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'test_db'
MYSQL_USER: 'bulut'
MYSQL_PASSWORD: 'Bulut_123'
ports:
- "3306:3306"
volumes:
- /root/mysql/log:/var/log/mysql
- /root/mysql/data:/var/lib/mysql
- /root/mysql/conf:/etc/mysql/conf.d
networks:
- my_network
# 兼容mysql 8.0以下的密码认证
command: --default-authentication-plugin=mysql_native_password
networks:
my_network:
[root@docker my_compose]#
[root@docker my_compose]# docker compose config -q
[root@docker my_compose]#
6. 使用docker compose命令进行一键启动和停止
启动。可以看到network的name添加了项目的目录作为前缀,service如果没有指定container_name也会添加项目的目录作为前缀
[root@docker my_compose]#
[root@docker my_compose]# docker compose up -d
[+] Running 3/3
⠿ Network my_compose_my_network Created 0.1s
⠿ Container my_mysql Started 0.6s
⠿ Container my_compose-redis-1 Started 1.3s
[root@docker my_compose]#
[root@docker my_compose]# docker network ls
NETWORK ID NAME DRIVER SCOPE
11634c75f412 bridge bridge local
fc720e541b06 host host local
6295427e8bc7 my_compose_my_network bridge local
fa2400985f50 none null local
[root@docker my_compose]#
[root@docker my_compose]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b5b82b44ab05 redis "docker-entrypoint.s…" 9 seconds ago Up 7 seconds 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp my_compose-redis-1
71e61fe64ba1 mysql "docker-entrypoint.s…" 9 seconds ago Up 8 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp my_mysql
[root@docker my_compose]#
停止
[root@docker my_compose]#
[root@docker my_compose]# docker compose stop
[+] Running 2/2
⠿ Container my_compose-redis-1 Stopped 0.3s
⠿ Container my_mysql Stopped 1.6s
[root@docker my_compose]#
[root@docker my_compose]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b5b82b44ab05 redis "docker-entrypoint.s…" 4 minutes ago Exited (0) 13 seconds ago my_compose-redis-1
71e61fe64ba1 mysql "docker-entrypoint.s…" 4 minutes ago Exited (0) 12 seconds ago my_mysql
[root@docker my_compose]#