概述: 用一个 YAML 文件,一键启动 / 停止 / 管理多个容器

# 查看版本
docker compose -v
docker compose version
# 查看服务
docker compose ps
# 后台启动所有服务
docker compose up -d
# 停止所有服务的容器
docker compose stop
# 删除所有服务的容器、网络
docker compose down
# 查看日志
docker compose logs -f
# 重启服务
docker compose restart
# 重建镜像后重新启动(改了 Dockerfile 用这个)
docker compose up -d --build
# 只启动某个服务
docker compose up -d nginx
# 进入容器
docker compose exec 服务名 bash
# 拉取最新镜像
docker compose pull
# 查看服务运行的进程
docker compose top
# 验证 docker-compose.yml 语法是否正确
docker compose config -q
# 停止并删除容器、网络、镜像
docker compose down --rmi all
# 停止并删除容器、网络、卷(数据会删!谨慎)
docker compose down -v
version: '3'
services:
nginx:
image: nginx:alpine
container_name: web-nginx
networks:
- lnmp-net
ports:
- "8080:80"
volumes:
- ./nginx/conf:/etc/nginx/conf.d
- ./nginx/html:/usr/share/nginx/html
restart: always
mysql:
image: mysql:8.0
container_name: data-mysql
networks:
- lnmp-net
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: lnmp
restart: always
php:
image: php:fpm
container_name: php-fpm
networks:
- lnmp-net
volumes:
- ./nginx/html:/var/www/html
restart: always
depends_on:
- mysql
volumes:
mysql-data:
networks:
lnmp-net:
driver: bridge
secrets:
名字:
file: 密码文件
服务里:
secrets:
- 名字
环境变量:
XXX_PASSWORD_FILE: /run/secrets/名字
healthcheck:
test: curl -f http://localhost || exit 1
interval: 5s # 每5秒查一次
timeout: 2s # 超时2秒算失败
retries: 3 # 重试3次
start_period: 10s # 启动后10秒再开始查
test: curl -f http://localhost || exit 1
test: mysql -uroot -p123456 -e "SELECT 1" || exit 1
test: redis-cli ping || exit 1
test: php-fpm -t || exit 1
services:
web:
build: . # 表示在当前目录找 Dockerfile 构建
指定 Dockerfile 文件名
build:
context: . # 构建目录
dockerfile: Dockerfile.php # 指定文件
构建时传参数(ARG)
build:
context: .
args:
- VERSION=8.0
- NAME=test
php:
image: php:fpm
working_dir: /var/www/html # 一进容器就在这里
entrypoint = 主程序(发动机)
command = 命令参数(油门)
固定程序用 entrypoint
临时命令用 command
entrypoint: nginx -g "daemon off;"
或
entrypoint: ["nginx", "-g", "daemon off;"]
command = 容器启动后执行什么命令
覆盖镜像默认命令
想让容器干嘛就写啥
command: php -S 0.0.0.0:8000
或
command: ["php", "-S", "0.0.0.0:8000"]
# 顶层定义:声明有哪些配置
configs:
nginx_conf: # 配置名(自定义)
file: ./nginx.conf # 宿主机文件路径
services:
nginx:
image: nginx
configs:
- source: nginx_conf # 对应顶层config名
target: /etc/nginx/nginx.conf # 容器内路径
uid: "101" # 可选:文件所有者UID
gid: "101" # 可选:文件所有者GID
mode: 0444 # 可选:权限(默认只读0444){insert\_element\_2\_}
✅ 安全:不让容器用 root 乱跑命令
✅ 权限最小化:避免黑客拿到高权限
✅ 解决宿主机文件权限问题(最常用!)
✅ 符合生产规范
# 用户名
user: nginx
# UID
user: 101
# UID:GID
user: "101:101"
给容器开启最高权限(特权模式),让容器几乎拥有和宿主机一样的权限。
默认容器是受限的,加了 privileged: true 后:
/dev/*场景:
/dev 下设备services:
test:
image: ubuntu
privileged: true
command: sleep infinity
需要已装 Docker Engine
docker --version
二进制安装
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
官方源安装
# 1. 安装 yum-utils(提供 yum-config-manager)
sudo yum install -y yum-utils
# 2. 添加 Docker 官方 YUM 源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo3
# 阿里云 Docker 源(国内首选)
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# yum 安装
sudo yum install -y docker-compose-plugin