前言
在前几章中,我们学习了 Dockerfile 和单容器的管理。 然而,在实际应用中,我们往往需要同时管理多个容器,Docker Compose 就是解决这一问题的强大工具。
Docker Compose 通过定义一个 docker-compose.yml 文件来管理多容器应用,让我们能够以 声明式配置 启动、停止和管理整个应用栈。 本篇将详细讲解如何使用 Docker Compose 构建 LNMP 环境(Linux + Nginx + MySQL + PHP),以及如何用它进行 微服务架构的快速部署。
一、Docker Compose 简介
Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。 通过 Compose,我们可以:
使用一个配置文件定义多个服务(容器)
通过一个命令启动所有服务
方便地管理容器间的依赖和网络配置
1️⃣ Docker Compose 工作原理
docker-compose.yml:配置文件,定义服务、网络、卷等。
docker-compose 命令:用于启动、停止、重启、删除服务。
二、安装 Docker Compose
在大多数 Docker 环境中,Docker Compose 默认已安装。如果没有安装,可以手动安装:
1️⃣ 安装 Docker Compose
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
验证安装:
docker-compose --version
三、编写 docker-compose.yml 文件
3.1 配置文件结构
Docker Compose 的配置文件通常由三个主要部分组成:
| 部分 | 描述 |
|---|---|
| services | 定义容器服务,所有运行的容器都要在此部分列出 |
| volumes | 定义持久化数据卷 |
| networks | 定义服务间通信网络 |
3.2 编写 LNMP 环境配置
以下是一个典型的 LNMP 环境配置:
version: '3'
services:
nginx:
image: nginx:latest
container_name: nginx
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
- ./nginx.conf:/etc/nginx/nginx.conf
networks:
- lnmp_network
mysql:
image: mysql:5.7
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- mysql_data:/var/lib/mysql
networks:
- lnmp_network
php:
image: php:7.4-fpm
container_name: php
volumes:
- ./html:/var/www/html
networks:
- lnmp_network
networks:
lnmp_network:
driver: bridge
volumes:
mysql_data:
四、启动和管理多容器应用
4.1 启动所有服务
在包含 docker-compose.yml 文件的目录中执行以下命令启动容器:
docker-compose up -d
✅ 参数说明:
-d:后台运行容器
4.2 查看容器状态
docker-compose ps
4.3 查看服务日志
docker-compose logs
查看特定服务日志:
docker-compose logs nginx
4.4 停止和删除服务
停止服务:
docker-compose down
如果希望删除卷(清理数据):
docker-compose down -v
4.5 重启服务
docker-compose restart
五、Docker Compose 实战:LNMP 环境部署
5.1 创建项目目录
mkdir -p /opt/lnmp && cd /opt/lnmp
在该目录下创建 docker-compose.yml 和 nginx.conf 文件。
5.2 创建 Nginx 配置文件
nginx.conf 文件内容:
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
include fastcgi_params;
}
}
5.3 创建 HTML 文件
在 ./html 目录中创建一个简单的 index.php 文件:
5.4 启动服务
docker-compose up -d
5.5 测试部署
访问 http://localhost:8080,你应该可以看到 PHP 信息页面,表示 LNMP 环境成功搭建。
六、Docker Compose 配置优化
6.1 使用 .env 文件配置环境变量
在 docker-compose.yml 文件中使用环境变量来配置服务:
version: '3'
services:
nginx:
image: nginx:latest
container_name: nginx
ports:
- "${NGINX_PORT}:80"
volumes:
- ./html:/usr/share/nginx/html
- ./nginx.conf:/etc/nginx/nginx.conf
networks:
- lnmp_network
然后创建一个 .env 文件,定义环境变量:
NGINX_PORT=8080
使用
.env文件可以方便地配置不同环境下的服务变量。
6.2 使用 build 构建自定义镜像
如果你需要自定义镜像,可以在 docker-compose.yml 中使用 build:
services:
nginx:
build:
context: ./nginx
dockerfile: Dockerfile
container_name: nginx
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
networks:
- lnmp_network
✅ 这将从
./nginx/Dockerfile构建一个镜像,替代默认的nginx:latest。
七、Docker Compose 微服务部署案例
以下是一个典型的 微服务架构,包含 Nginx、Node.js、MongoDB:
version: '3'
services:
nginx:
image: nginx:latest
container_name: nginx
ports:
- "8080:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
networks:
- app_network
nodeapp:
image: node:14
container_name: nodeapp
build:
context: ./nodeapp
ports:
- "3000:3000"
networks:
- app_network
depends_on:
- mongodb
mongodb:
image: mongo:latest
container_name: mongodb
volumes:
- mongodb_data:/data/db
networks:
- app_network
networks:
app_network:
driver: bridge
volumes:
mongodb_data:
7.1 项目结构:
myapp/
├── docker-compose.yml
├── nodeapp/
│ ├── Dockerfile
│ ├── app.js
│ └── package.json
└── nginx.conf
八、Docker Compose 扩展:多容器自动化部署
8.1 多容器的自动化扩展
使用 scale 命令扩展服务实例:
docker-compose up -d --scale nodeapp=3
这将扩展 nodeapp 服务为 3 个实例。
九、总结
通过本篇学习,你应掌握以下技能:
✅ 使用 Docker Compose 管理多容器应用
✅ 配置并启动 LNMP 环境
✅ 构建微服务架构的多容器应用
✅ 使用 .env 文件与构建自定义镜像
✅ 实践 Docker Compose 扩展与自动化部署
浙公网安备 33010602011771号