Docker Compose配置详解
1. 什么是Docker Compose?
Docker Compose是一种用于定义和运行多容器Docker应用程序的工具。通过一个docker-compose.yml
文件,你可以配置应用程序的所有服务(例如,Web服务器、数据库、缓存)并轻松管理它们。
2. 基本Docker Compose命令
docker-compose up
:启动并运行docker-compose.yml
文件中定义的容器。docker-compose down
:停止并删除由docker-compose up
创建的容器、网络和卷。docker-compose build
:构建或重新构建服务。docker-compose stop
:停止运行中的容器,但不删除它们。docker-compose restart
:重启服务。docker-compose logs
:显示所有服务或特定服务的日志。docker-compose ps
:列出容器。docker-compose exec
:在运行的容器中执行命令。docker-compose run
:对服务运行一次性命令。
3. Docker Compose文件结构 (docker-compose.yml
)
docker-compose.yml
文件是你定义应用程序服务、网络和卷的地方。下面是一个基本结构:
version: '3.8' # Compose文件版本
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./web:/usr/share/nginx/html
environment:
- NGINX_HOST=localhost
- NGINX_PORT=80
db:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: example_db
MYSQL_USER: user
MYSQL_PASSWORD: password
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
4. 常见配置选项
a. version
指定Docker Compose文件格式的版本。常用版本为3.8
,3.7
等。
b. services
定义要运行的容器。每个服务运行一个镜像,可以定义端口、卷和环境变量。
c. image
指定要使用的服务镜像。你可以使用预构建的镜像,也可以通过Dockerfile
构建自己的镜像。
d. build
指定一个目录从Dockerfile
构建镜像:
build:
context: .
dockerfile: Dockerfile
e. ports
将容器端口映射到主机端口:
ports:
- "80:80" # 主机:容器
f. volumes
将主机路径或命名卷挂载到容器内部路径:
volumes:
- ./web:/usr/share/nginx/html
g. environment
为容器设置环境变量:
environment:
- MYSQL_ROOT_PASSWORD=example
h. networks
定义服务的自定义网络:
networks:
frontend:
backend:
5. 高级配置示例
a. 链接服务
你可以使用depends_on
指令将服务链接在一起:
services:
web:
image: nginx
depends_on:
- db
db:
image: mysql
b. 定义自定义网络
version: '3.8'
services:
web:
image: nginx
networks:
- frontend
db:
image: mysql
networks:
- backend
networks:
frontend:
backend:
c. 使用多个Compose文件
你可以将配置拆分为多个文件:
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up
d. Compose中的环境变量
你可以使用.env
文件设置docker-compose.yml
中使用的变量:
version: '3.8'
services:
web:
image: nginx
ports:
- "${HOST_PORT}:80"
.env
文件:
HOST_PORT=8080
e. 健康检查
你可以为服务定义健康检查,确保它们正常工作:
services:
web:
image: nginx
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
6. 与Docker Swarm一起使用Docker Compose
Docker Compose可以与Docker Swarm一起使用,在集群上部署多容器应用程序:
docker stack deploy -c docker-compose.yml my_stack
7. 最佳实践
- 保持
docker-compose.yml
简洁:使用多个文件来分离开发和生产配置。 - 版本控制:将你的
docker-compose.yml
放入版本控制系统中,以管理跨环境的配置。 - 使用命名卷:确保数据在容器重启后依然存在。
version: '3.8' # 指定Compose文件的版本
services: # 定义多个服务
web: # Web服务,通常是前端或后端的应用
image: nginx:latest # 使用Nginx镜像
ports:
- "80:80" # 将容器的80端口映射到主机的80端口
volumes:
- ./web:/usr/share/nginx/html # 挂载本地目录到容器中
environment:
- NGINX_HOST=localhost # 设置环境变量
- NGINX_PORT=80
networks:
- frontend # 连接到前端网络
depends_on:
- app # 该服务将在'app'服务启动后才启动
restart: always # 在容器崩溃后总是重启
app: # 应用服务,可以是任何语言的后端服务
build: # 从Dockerfile构建镜像
context: ./app # Dockerfile所在的目录
dockerfile: Dockerfile # 使用的Dockerfile名称
ports:
- "3000:3000" # 将容器的3000端口映射到主机的3000端口
volumes:
- ./app:/usr/src/app # 挂载本地代码目录到容器中
environment:
- NODE_ENV=development # 设置环境变量
- PORT=3000
networks:
- frontend # 连接到前端网络
- backend # 连接到后端网络
depends_on:
- db # 该服务将在'db'服务启动后才启动
restart: on-failure # 仅在容器非正常退出时重启
db: # 数据库服务,使用MySQL
image: mysql:5.7 # 使用MySQL 5.7镜像
volumes:
- db_data:/var/lib/mysql # 持久化MySQL数据到命名卷
environment:
MYSQL_ROOT_PASSWORD: example # MySQL root用户的密码
MYSQL_DATABASE: example_db # 自动创建的数据库名称
MYSQL_USER: user # 创建的用户名称
MYSQL_PASSWORD: password # 用户密码
networks:
- backend # 连接到后端网络
restart: unless-stopped # 仅在手动停止时不重启
volumes: # 定义命名卷,用于数据持久化
db_data: # MySQL数据卷
networks: # 定义自定义网络
frontend: # 前端网络,连接web和app服务
backend: # 后端网络,连接app和db服务