前言
在前几章中,我们学习了 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 文件:
<?php phpinfo(); ?>
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 扩展与自动化部署
6万+

被折叠的 条评论
为什么被折叠?



