一、概述
docker-compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排,轻松高效地管理容器,定义运行多个容器。
docker-compose 将所管理的容器分为三层:工程(project)、服务(service)以及容器(container)。
- docker-compose 运行目录下的所有文件(docker-compose.yml 文件、extends 文件或环境变量等)组成一个工程,默认工程名为当前目录名。
- 一个工程中可以包含多个服务,每个服务定义容器运行的镜像、参数、依赖。
- 一个服务中可以包含多个容器实例,docker-compose 并未解决负载均衡,需要借助其他工具(如 consul)实现服务发现及负载均衡。
- docker-compose 的工程配置文件默认是
docker-compose.yml
,可通过环境变量COMPOSE_FILE
或-f
参数自定义配置文件,实现多个相关服务及容器的定义。
官方文档:https://docs.docker.com/compose/
GitHub 主页:https://github.com/docker/compose/releases/
以前写过一篇基础文章,有兴趣可参考:Docker三剑客之Compose
二、Compose 和 Docker 兼容性
Compose 文件格式有多个版本:1、2、2.x 和 3.x。
下面表格展示了不同 Compose 文件版本所支持的 Docker 发行版(具体版本请参考官方文档)。
三、安装 Docker
安装 yum-config-manager 配置工具
yum -y install yum-utils
建议使用阿里云 yum 源(推荐)
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装 docker-ce 版本
yum install -y docker-ce
启动 Docker 并设置开机启动
systemctl enable --now docker docker --version
四、安装 docker-compose
官方安装教程:https://docs.docker.com/compose/install/other/
curl -SL https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose docker-compose --version
五、环境变量
1)在 docker-compose.yml 文件中直接设置环境变量:
services: web: image: nginx environment: MY_VAR: my_value
2)从 .env 文件中读取环境变量:
services: web: image: nginx env_file: - .env
3)使用 shell 环境变量:
$ export MY_VAR=my_value $ docker-compose up
docker-compose.yml 中引用 shell 环境变量:
services: web: image: nginx environment: MY_VAR: ${MY_VAR}
六、字段详解 示例
version、services 示例:
version: '3' services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine"
build 示例:
services: web: build: ./my-web-app
build 和 image 同时写:
version: '3.8' services: web: build: ./web image: myapp/web:latest
网络定义:
networks: my-network: driver: bridge
数据卷定义:
volumes: my-volume: driver: local
端口配置:
ports: - "8080:80"
expose 示例:
version: '3' services: web: image: myapp:latest expose: - "8000" - "8080"
depends_on 示例:
depends_on: - db
restart 示例:
version: '3' services: web: image: myapp:latest restart: always
command 多种写法:
字符串:
command: python manage.py runserver 0.0.0.0:8000
列表:
command: - python - manage.py - runserver - 0.0.0.0:8000
shell:
# command: sh -c "python manage.py runserver 0.0.0.0:8000" command: ["sh","-c","python manage.py runserver 0.0.0.0:8000"]
healthcheck 示例:
healthcheck: test: ["CMD", "curl", "-f", "http://localhost/health"] interval: 30s timeout: 10s retries: 3
configs 示例:
configs: - source: my-config target: /etc/nginx/conf.d/default.conf
secrets 示例:
secrets: - db_password
hostname 和 container_name 示例:
version: '3' services: web: image: myapp:latest container_name: myapp
user 示例:
version: "3" services: web: image: nginx user: nginx:nginx
在这个示例中,web 服务的容器名称被设置为 myapp。
总之,hostname 和 container_name 都是用于定义容器的标识符,但是 hostname 用于容器内部的标识,container_name 用于 Docker 主机上的标识。
user 字段说明
在 Docker Compose 中,user
字段用于指定容器中运行进程的用户和用户组,类似于 docker run --user
。
有以下三种形式:
user:group
(推荐),以用户和用户组身份运行:
version: "3" services: web: image: nginx user: nginx:nginx
uid:gid
,以用户ID和组ID身份运行:
version: "3" services: web: image: nginx user: "1000:1000"
- 只指定用户:
version: "3" services: web: image: nginx user: nginx
注意:使用
user
字段后,容器中的所有进程将以指定用户身份运行,提升安全性,避免以 root 身份运行带来的安全风险。
deploy 示例
deploy: replicas: 3 resources: limits: cpus: '0.5' memory: '256M' reservations: cpus: '0.25' memory: '128M'
七、port 和 expose 区别
ports
和 expose
都用于暴露端口,但含义不同:
ports
将容器端口映射到宿主机端口,允许外部访问。expose
只是告诉 Docker 该端口会被暴露给其他容器,不映射到宿主机。
ports 示例:
version: "3" services: web: image: nginx ports: - "8080:80"
expose 示例:
version: "3" services: db: image: mysql expose: - "3306" web: image: nginx expose: - "80"
八、configs 与 secrets 区别
version: '3.7' services: web: image: nginx:latest ports: - 80:80 configs: - source: nginx_conf target: /etc/nginx/nginx.conf secrets: - source: db_password target: /run/secrets/db_password configs: nginx_conf: file: ./nginx.conf secrets: db_password: file: ./db_password.txt
九、挂载
1)命名卷挂载
version: "3.7" services: app: image: myapp:latest volumes: - myapp_data:/app/data volumes: myapp_data:
2)主机目录挂载
version: "3.7" services: app: image: myapp:latest volumes: - /host/data:/app/data
十、网络
1)bridge 网络类型
version: '3' services: web: build: . ports: - "80:80" db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: example
2)host 网络类型
version: '3' services: web: build: . network_mode: host
3)none 网络类型
version: '3' services: worker: build: . network_mode: none
4)自定义网络
version: '3' services: web: image: nginx networks: - my_network networks: my_network: driver: bridge
在这个示例中,
web
服务被连接到my_network
网络,而不是默认的网络。该网络使用bridge
驱动,这是 Docker Compose 默认的网络类型。
📁 Compose 项目目录说明:
Compose 项目目录是包含 docker-compose.yml
文件的目录。通常结构如下:
myapp/ ├── docker-compose.yml ├── app/ │ ├── Dockerfile │ └── app.py └── data/
在此示例中:
myapp
是项目目录名。docker-compose.yml
是定义服务的 Compose 文件。app/
存放应用代码和构建文件。
十一、域名解析(DNS)
在 Docker Compose 中,容器可以通过 服务名或容器名 相互访问,无需使用 IP 地址。
示例说明:
- Compose 会为每个服务自动创建 DNS 记录。
- 默认网络名为
<projectname>_default
。 - 可使用以下命令查看服务的 DNS 名称:
docker-compose runnslookup
示例:
docker-compose run web nslookup web
输出结果类似:
Server: 127.0.0.11 Address 1: 127.0.0.11 Name: web Address 1: 172.18.0.2
说明 web
服务的 DNS 名称为 "web"
,可直接通过该名称访问。
十二、健康检查(Healthcheck)
Docker Compose 支持为服务定义健康检查,用于确认服务是否正常运行。
1)基本语法:
healthcheck: test: ["CMD-SHELL", "command"] interval: 30s timeout: 10s retries: 3
参数说明:
test
:执行的检测命令。interval
:检测间隔,默认 30s。timeout
:检测超时,默认 30s。retries
:最大重试次数,默认 3。
2)三种写法示例:
① 字符串形式:
healthcheck: test: curl --fail http://localhost:80 || exit 1 interval: 30s timeout: 10s retries: 5
② 数组形式(CMD):
healthcheck: test: ["CMD", "curl", "--fail", "http://localhost:80"] interval: 30s timeout: 10s retries: 5
③ Shell 形式(推荐):
healthcheck: test: ["CMD-SHELL", "curl --fail http://localhost:80 || exit 1"] interval: 30s timeout: 10s retries: 5
3)示例:
version: "3" services: web: image: nginx ports: - "80:80" healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 1m timeout: 10s retries: 3
启动服务:
docker-compose up
查看健康状态:
docker-compose ps
输出示例:
Name Command State Ports webapp_web_1 nginx -g daemon off; Up (healthy) 0.0.0.0:80->80/tcp
十三、常用命令
- docker-compose up:启动并创建所有服务 - docker-compose down:停止并删除服务与网络 - docker-compose ps:显示服务状态 - docker-compose logs:查看容器日志 - docker-compose build:构建镜像 - docker-compose pull:拉取镜像 - docker-compose restart:重启服务 - docker-compose stop:停止服务 - docker-compose start:启动服务 - docker-compose exec:在容器中执行命令 - docker-compose run :运行一次性命令 - docker-compose config:检查配置语法并显示合并后的配置
评论(0)
暂无评论