一、安装
1. docker compose 1.x
docker compose 1.x 是相对独立的命令,命令行方式如:docker-compose --version
curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
root@localhost:~# docker-compose --version
docker-compose version 1.25.5, build 8a1c60f6
2. docker compose 2.x
docker compose v2 被规划为 Docker CLI 的一部分,命令行方式如 docker compose version
虽然 docker compose v2 版本已经推出,但是 docker 官方表示不会放弃对 1.x 版本的支持
root@localhost:~# docker info
Client: Docker Engine - Community
Version: 24.0.7
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.11.2
Path: /usr/libexec/docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: v2.21.0
Path: /usr/libexec/docker/cli-plugins/docker-compose
root@localhost:~# docker compose version
Docker Compose version v2.21.0
3.compose file format 版本与 docker 版本关系
https://docs.docker.com/compose/compose-file/compose-file-v3/
Compose file format | Docker Engine release |
---|---|
Compose specification | 19.03.0+ |
3.8 | 19.03.0+ |
3.7 | 18.06.0+ |
3.6 | 18.02.0+ |
3.5 | 17.12.0+ |
3.4 | 17.09.0+ |
3.3 | 17.06.0+ |
3.2 | 17.04.0+ |
3.1 | 1.13.1+ |
3.0 | 1.13.0+ |
2.4 | 17.12.0+ |
2.3 | 17.06.0+ |
2.2 | 1.13.0+ |
2.1 | 1.12.0+ |
2.0 | 1.10.0+ |
1.12 之后,Docker 提供了 HEALTHCHECK 指令,通过该指令指定一行命令,用这行命令来判断容器主进程的服务状态是否还正常,从而比较真实的反应容器实际状态
当在一个镜像指定了 HEALTHCHECK 指令后,用其启动容器,初始状态会为 starting,在 HEALTHCHECK 指令检查成功后变为 healthy,如果连续一定次数失败,则会变为 unhealthy
二、docker-compose命令
docker-compose
的使用非常类似于 docker
命令的使用,但是需要注意的是大部分的 compose
命令都需要到docker-compose.yml
文件所在的目录下才能执行
- docker-compose up -d [service_name] 在后台启动容器并使它们保持运行。
- docker-compose exec service_name bash 登录到service_name容器中
- docker-compose ps [service_name]查看compose服务状态
- docker-compose start [service_name] 启动compose服务
- docker-compose stop [service_name] 停止compose服务
- docker-compose restart [service_name] 重启compose服务
- docker-compose rm [service_name]删除停止的compose服务
- docker-compose logs [service_name] 查看日志
- docker-compose logs -f [service_name] 查看实时日志
三、docker-compose.yml文件
bridge 模式
docker-compose.yml
version: '2'
services:
mysql:
# 镜像
image: mysql:8.0
# 自定义容器名称
container_name: mysql_container
# 自定义主机名
hostname: mysql_hostname
# 启动端口映射 (外部:内部)
ports:
- 3306:3306
# 设置环境变量
environment:
- MYSQL_ROOT_PASSWORD=123456
# 将主机名和ip写入容器中的hosts文件
extra_hosts:
- www.abc.com:127.0.0.1
# 当前容器启动前,必须等待以下服务启动完毕之后才能启动
depends_on:
- nginx
nginx:
hostname: nginx_test
image: nginx:1.19.0
ports:
- 80:80
没有自定义网络名,实际使用的网络是:<当前路径名_default>
网络定义后缀
version: '2'
networks:
mynet:
driver: bridge
ipam:
config:
- subnet: 10.0.3.0/24
services:
mysql:
# 镜像
image: mysql:8.0
# 自定义容器名称
container_name: mysql_container
# 自定义主机名
hostname: mysql_hostname
# 启动端口映射 (外部:内部)
ports:
- 3306:3306
# 设置环境变量
environment:
- MYSQL_ROOT_PASSWORD=123456
# 将主机名和ip写入容器中的hosts文件
extra_hosts:
- www.abc.com:127.0.0.1
# 当前容器启动前,必须等待以下服务启动完毕之后才能启动
depends_on:
- nginx
networks:
mynet:
ipv4_address: 10.0.3.101
nginx:
hostname: nginx_test
image: nginx:1.19.0
ports:
- 80:80
networks:
mynet:
ipv4_address: 10.0.3.102
定义网络名为 mynet,那么最终生产的网络名为:<当前路径名_mynet>
version: '2'
networks:
baseNet:
external:
name: path_mynet
services:
mysql:
# 镜像
image: mysql:8.0
# 自定义容器名称
container_name: mysql_container
# 自定义主机名
hostname: mysql_hostname
# 启动端口映射 (外部:内部)
ports:
- 3306:3306
# 设置环境变量
environment:
- MYSQL_ROOT_PASSWORD=123456
# 将主机名和ip写入容器中的hosts文件
extra_hosts:
- www.abc.com:127.0.0.1
# 当前容器启动前,必须等待以下服务启动完毕之后才能启动
depends_on:
- nginx
networks:
- path_mynet
nginx:
hostname: nginx_test
image: nginx:1.19.0
ports:
- 80:80
networks:
- path_mynet
external 使用已经存在的网络
host 模式
version: '2'
services:
nginx:
hostname: nginx_test
image: nginx:1.19.0
restart: always
network_mode: host