一、概述
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)
暂无评论