
Docker Compose 是 Docker 官方提供的用于定义和运行多容器 Docker 应用程序的工具,它通过一个简单的 YAML 文件来配置应用的服务、网络和卷,极大简化了多容器应用的部署与管理流程。
Docker Compose 解决了多容器应用管理中的几个关键问题:
1、环境一致性:通过 YAML 文件定义的环境配置可以在开发、测试和生产环境中保持一致,消除“在我机器上能运行”的问题
2、一键部署:只需一个 docker-compose up 命令即可启动所有相关服务
3、服务编排:轻松定义服务间的依赖关系和启动顺序
4、资源隔离:每个服务运行在独立容器中,避免依赖冲突
Docker Compose 特别适合以下场景:
Docker Compose 包含在 Docker Desktop 中,Linux 用户需要单独安装:
#Bash
# 下载最新版Docker Compose
sudo curl -L " https://github.com/docker/compose/releases/download/v2.10.2/docker-compose-$ (uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose验证安装:
#Bash
docker-compose --version一个典型的 docker-compose.yml 文件包含以下主要部分:
#YAML
version: '3.8' # 指定使用的Compose文件格式版本
services: # 定义各个服务容器
web: # 服务名称
image: nginx:latest # 使用的Docker镜像
ports: # 端口映射
- "80:80" # 主机端口:容器端口
volumes: # 数据卷挂载
- ./html:/usr/share/nginx/html # 本地目录:容器目录
db:
image: postgres:13
environment: # 环境变量
POSTGRES_PASSWORD: example
volumes:
- db_data:/var/lib/postgresql/data # 命名卷
volumes: # 声明命名卷
db_data:每个服务对应一个容器,主要配置项包括:
Docker Compose 默认会为应用创建专用网络,服务间可通过服务名相互访问:
#YAML
services:
web:
networks:
- app-network
db:
networks:
- app-network
networks:
app-network:
driver: bridge使用 volumes 实现数据持久化,避免容器重启后数据丢失:
#YAML
services:
db:
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:通过 depends_on 控制服务启动顺序:
#YAML
services:
web:
depends_on:
- db
db:
image: mysql:5.7#YAML
version: "3.8"
services:
nginx:
image: nginx:latest
container_name: my-nginx
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html:ro
restart: always创建html目录和index.html文件:
#Bash
mkdir html
echo "<h1>Hello Docker Nginx!</h1>" > html/index.html启动服务:
#Bash
docker-compose up -d复制Nginx默认配置到本地进行修改:
#Bash
mkdir -p ~/nginx/conf
docker run --name tmp-nginx -d nginx
docker cp tmp-nginx:/etc/nginx/nginx.conf ~/nginx/conf/
docker cp tmp-nginx:/etc/nginx/conf.d ~/nginx/conf/
docker rm -f tmp-nginx更新docker-compose.yml:
#YAML
services:
nginx:
volumes:
- ~/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- ~/nginx/conf/conf.d:/etc/nginx/conf.d为Nginx添加HTTPS支持:
#YAML
services:
nginx:
ports:
- "80:80"
- "443:443"
volumes:
- ./ssl:/etc/nginx/ssl配置SSL服务器块:
#nginx
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
location / {
root /usr/share/nginx/html;
index index.html;
}
}Docker Compose 提供了一系列管理命令:
命令 | 描述 |
|---|---|
docker-compose up -d | 启动所有服务(后台模式) |
docker-compose down | 停止并移除所有容器 |
docker-compose ps | 查看运行中的服务 |
docker-compose logs -f | 查看实时日志 |
docker-compose restart | 重启服务 |
docker-compose exec nginx bash | 进入容器终端 |
docker-compose build | 重新构建服务镜像 |
1. 多服务编排
典型的多服务应用(如LAMP环境)配置示例,包含PHPMyAdmin管理工具:
#YAML
version: '3.8'
services:
apache:
image: php:8.0-apache
ports:
- "8080:80"
volumes:
- ./src:/var/www/html
depends_on:
- mysql
networks:
- app_network
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: app_db
MYSQL_USER: app_user
MYSQL_PASSWORD: userpassword
volumes:
- mysql_data:/var/lib/mysql
ports:
- "3306:3306"
networks:
- app_network
phpmyadmin:
image: phpmyadmin/phpmyadmin
ports:
- "8081:80"
environment:
PMA_HOST: mysql
PMA_USER: root
PMA_PASSWORD: rootpassword
depends_on:
- mysql
networks:
- app_network
networks:
app_network:
volumes:
mysql_data:这个配置定义了三个服务:
1、Apache/PHP服务,映射到主机的8080端口,挂载本地 src 目录到容器
2、MySQL服务,设置了root密码和初始数据库,使用命名卷持久化数据
3、PHPMyAdmin服务,连接到MySQL服务,提供数据库管理界面
通过 depends_on 确保MySQL在其他服务之前启动,所有服务连接到同一个自定义网络 app_network ,使它们可以通过服务名相互访问。
对于Web应用,通常需要编排前端、后端和数据库服务。以下是一个典型配置:
#YAML
version: '3.8'
services:
frontend:
image: nginx:latest
ports:
- "3000:80"
volumes:
- ./frontend/dist:/usr/share/nginx/html
- ./frontend/nginx.conf:/etc/nginx/nginx.conf
depends_on:
- backend
networks:
- app_network
backend:
build: ./backend
ports:
- "5000:5000"
environment:
- DATABASE_URL=postgres://appuser:password@db:5432/appdb
depends_on:
- db
networks:
- app_network
db:
image: postgres:13
environment:
POSTGRES_USER: appuser
POSTGRES_PASSWORD: password
POSTGRES_DB: appdb
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- app_network
networks:
app_network:
volumes:
postgres_data:这个配置展示了更复杂的场景:
使用 –scale 参数扩展服务实例:
#Bash
docker-compose up --scale web=3 -d为服务添加健康检查:
#YAML
services:
db:
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 3Docker Compose支持使用环境变量动态配置服务:
#YAML
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_DATABASE: ${DB_NAME}可以在 .env 文件中定义这些变量:
DB_ROOT_PASSWORD=secret
DB_NAME=appdb通过多个Compose文件管理不同环境配置:
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -ddocker-compose.prod.yml 可以覆盖或扩展基础配置,如更改端口、调整资源限制等。
为服务设置CPU和内存限制:
#YAML
services:
backend:
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
memory: 256MDocker Compose 通过简化的YAML配置和强大的命令行工具,使多容器应用的管理变得高效而可靠。无论是开发环境的快速搭建,还是生产环境的服务编排Docker Compose 都能提供一致的体验和可靠的表现,灵活运用 Docker Compose 管理各种复杂的容器化应用场景。
1、版本控制:将docker-compose.yml纳入版本控制,确保团队环境一致,合理的项目结构有助于维护:
project/
├── docker-compose.yml
├── .env
├── frontend/
│ ├── Dockerfile
│ └── ...
├── backend/
│ ├── Dockerfile
│ └── ...
└── db/
└── init.sql2、最小化镜像:使用官方镜像或构建最小化自定义镜像;
3、环境变量:敏感信息通过环境变量传递,避免硬编码;
4、日志管理:配置适当的日志驱动和轮转策略及相关监控;
5、资源限制:为服务设置CPU和内存限制,防止单个服务耗尽资源;
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!