Docker Compose是Docker官方的多容器编排工具,2026年已成为单机多容器应用部署的标准方案。从简单的Web+数据库双容器应用,到包含Nginx、应用、数据库、缓存、消息队列的完整技术栈,Docker Compose能让你用一个YAML文件定义和管理所有容器,一条命令启动整个应用。本文将详细介绍Docker Compose的核心概念、配置语法和实战案例,帮你从零开始掌握多容器编排技术。
一、Docker Compose基础概念与安装
Docker Compose是用于定义和运行多容器Docker应用的工具,通过YAML文件配置应用的服务、网络和卷,然后使用一条命令创建并启动所有服务。核心概念:1. 服务(Service):一个容器的定义,包括镜像、端口、环境变量、卷挂载、依赖关系等,一个服务可以运行多个容器副本(通过deploy.replicas配置);2. 项目(Project):一组相关联的服务,由一个docker-compose.yml文件定义,项目名称默认是目录名,可通过-p参数指定;3. 网络(Network):容器之间通信的虚拟网络,Compose默认创建一个项目级别的bridge网络,同一项目的服务可以通过服务名互相访问;4. 卷(Volume):持久化存储,用于保存数据库数据、应用上传文件等,容器删除后数据不丢失;5. 配置文件:默认文件名docker-compose.yml,也支持docker-compose.yaml、compose.yml、compose.yaml,可通过-f参数指定多个配置文件;6. 版本:Compose文件格式有多个版本(v1、v2、v3),2026年推荐使用最新的Compose Specification(不再标注version字段),兼容v2和v3的特性。安装方式:1. Docker Desktop:Windows和macOS安装Docker Desktop后自带Compose插件,命令为docker compose(注意是空格不是横杠);2. Linux:安装Docker Engine后,可通过apt install docker-compose-plugin安装Compose插件(docker compose命令),或下载独立二进制docker-compose(旧版横杠命令);3. 验证安装:docker compose version,返回版本信息表示安装成功。Compose的优势:1. 单文件定义整个应用栈,配置即代码,便于版本管理和复用;2. 一条命令启动/停止/重建所有服务,操作简单;3. 自动创建网络,服务之间通过服务名通信,无需手动配置IP;4. 支持环境变量、配置文件、密钥管理,灵活适配不同环境;5. 支持健康检查、依赖顺序、重启策略,保障服务稳定运行;6. 与Docker Swarm、Kubernetes兼容,Compose文件可直接部署到Swarm,或通过Kompose转换为Kubernetes清单。
二、docker-compose.yml配置语法详解
docker-compose.yml是Compose的核心配置文件,使用YAML格式,定义应用的所有服务、网络和卷。顶层字段:1. services:服务定义,每个键是服务名,值是该服务的配置;2. networks:网络定义,配置自定义网络;3. volumes:卷定义,声明命名卷;4. configs:配置文件管理(Swarm模式);5. secrets:密钥管理(Swarm模式)。服务常用配置项:1. image:使用的镜像,如nginx:latest、mysql:8.0;2. build:从Dockerfile构建镜像,可指定context(构建上下文)和dockerfile(Dockerfile路径),与image二选一或同时使用(同时使用时构建后打标签为image指定的名称);3. container_name:容器名称,不指定时自动生成(项目名_服务名_序号);4. ports:端口映射,格式为”宿主机端口:容器端口”,如”8080:80″,可指定协议”8080:80/tcp”;5. expose:暴露端口但不映射到宿主机,仅容器间访问;6. environment:环境变量,支持字典格式(KEY: VALUE)或列表格式(- KEY=VALUE);7. env_file:从文件加载环境变量,如.env或config/app.env;8. volumes:卷挂载,支持命名卷(vol_name:/container/path)、绑定挂载(/host/path:/container/path)、tmpfs(tmpfs:/container/path),可设置只读(:ro);9. networks:连接的网络,可指定别名(aliases);10. depends_on:服务依赖,指定启动顺序,但不会等待依赖服务就绪(需配合healthcheck和condition: service_healthy);11. healthcheck:健康检查,定义测试命令、间隔、超时、重试次数,如test: [“CMD”, “curl”, “-f”, “http://localhost”],interval: 30s,timeout: 10s,retries: 3;12. restart:重启策略,可选no、always、on-failure、unless-stopped;13. command:覆盖容器默认启动命令;14. entrypoint:覆盖容器默认入口点;15. working_dir:工作目录;16. user:运行用户;17. privileged:特权模式;18. cap_add/cap_drop:添加/删除Linux能力;19. logging:日志配置,如driver: json-file,options: max-size: “10m”, max-file: “3”;20. deploy:Swarm部署配置(副本数、资源限制、更新策略、放置约束等),docker compose up时忽略,仅docker stack deploy使用。网络配置:默认创建bridge网络,可自定义driver(bridge、overlay、macvlan等)、ipam(IP地址管理)、external(使用外部已存在网络)。卷配置:默认创建本地卷,可指定driver(local、nfs、cifs等)、driver_opts(驱动选项)、external(使用外部卷)。YAML注意事项:1. 缩进用2个空格,不能用Tab;2. 字符串包含特殊字符(冒号、井号等)时用引号包裹;3. 列表用- 开头;4. 注释用#开头;5. 支持环境变量替换,如${MYSQL_ROOT_PASSWORD},从.env文件或shell环境读取。
三、实战案例一:WordPress+MySQL博客平台
WordPress是最流行的建站程序,使用Docker Compose部署WordPress+MySQL是最经典的入门案例。完整的docker-compose.yml配置:services: db: image: mysql:8.0 container_name: wp_db restart: always environment: MYSQL_ROOT_PASSWORD: rootpass123 MYSQL_DATABASE: wordpress MYSQL_USER: wpuser MYSQL_PASSWORD: wppass123 volumes: – db_data:/var/lib/mysql healthcheck: test: [“CMD”, “mysqladmin”, “ping”, “-h”, “localhost”] interval: 10s timeout: 5s retries: 5 wordpress: image: wordpress:php8.2-apache container_name: wp_app restart: always depends_on: db: condition: service_healthy ports: – “8080:80” environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wpuser WORDPRESS_DB_PASSWORD: wppass123 WORDPRESS_DB_NAME: wordpress volumes: – wp_data:/var/www/html volumes: db_data: wp_data: 配置说明:1. db服务使用mysql:8.0镜像,设置root密码、数据库名、普通用户和密码,数据持久化到命名卷db_data,配置健康检查确保MySQL就绪;2. wordpress服务使用wordpress:php8.2-apache镜像,依赖db服务且等待其健康(condition: service_healthy),映射8080端口,配置数据库连接信息(主机名为服务名db),网站数据持久化到命名卷wp_data;3. 顶层声明db_data和wp_data两个命名卷。部署步骤:1. 创建项目目录mkdir wordpress && cd wordpress;2. 创建docker-compose.yml文件,写入上述配置;3. 启动服务docker compose up -d(-d后台运行);4. 查看状态docker compose ps,确认两个服务状态为healthy/running;5. 查看日志docker compose logs -f(跟踪日志);6. 浏览器访问http://服务器IP:8080,进入WordPress安装页面,完成安装;7. 停止服务docker compose down(停止并删除容器,卷保留);8. 完全清理docker compose down -v(同时删除卷,数据丢失)。进阶优化:1. 环境变量外置:创建.env文件存储密码,docker-compose.yml中用${VAR}引用,避免敏感信息硬编码;2. Nginx反向代理:添加Nginx服务作为反向代理,配置HTTPS(Let’s Encrypt证书),将WordPress放在内网;3. Redis缓存:添加Redis服务,安装Redis Object Cache插件,提升WordPress性能;4. 备份:配置定时任务备份db_data卷和wp_data卷到云存储;5. 资源限制:通过deploy.resources.limits限制CPU和内存使用,防止单个服务占用过多资源。这个案例展示了Docker Compose最核心的功能:多服务定义、依赖管理、数据持久化、健康检查、端口映射,是学习Compose的最佳入门案例。
四、实战案例二:LNMP Web开发环境
LNMP(Linux+Nginx+MySQL+PHP)是经典的Web技术栈,使用Docker Compose搭建LNMP开发环境,能快速创建一致的开发环境,避免”在我机器上能跑”的问题。完整的docker-compose.yml配置:services: nginx: image: nginx:1.25-alpine container_name: lnmp_nginx restart: always ports: – “80:80” – “443:443” volumes: – ./nginx/conf.d:/etc/nginx/conf.d – ./nginx/nginx.conf:/etc/nginx/nginx.conf – ./www:/var/www/html – ./nginx/logs:/var/log/nginx depends_on: – php – mysql networks: – lnmp_net php: build: context: ./php dockerfile: Dockerfile container_name: lnmp_php restart: always volumes: – ./www:/var/www/html – ./php/php.ini:/usr/local/etc/php/php.ini depends_on: – mysql networks: – lnmp_net mysql: image: mysql:8.0 container_name: lnmp_mysql restart: always ports: – “3306:3306” environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: appdb volumes: – mysql_data:/var/lib/mysql – ./mysql/init:/docker-entrypoint-initdb.d healthcheck: test: [“CMD”, “mysqladmin”, “ping”, “-h”, “localhost”] interval: 10s timeout: 5s retries: 5 networks: – lnmp_net phpmyadmin: image: phpmyadmin/phpmyadmin:latest container_name: lnmp_pma restart: always ports: – “8080:80” environment: PMA_HOST: mysql PMA_PORT: 3306 depends_on: – mysql networks: – lnmp_net volumes: mysql_data: networks: lnmp_net: driver: bridge 配置说明:1. nginx服务使用alpine轻量镜像,挂载配置目录、网站根目录、日志目录,依赖php和mysql;2. php服务从本地Dockerfile构建(可安装pdo_mysql、mysqli、gd、redis等扩展),挂载网站根目录和php.ini,依赖mysql;3. mysql服务映射3306端口,挂载初始化SQL脚本目录(容器首次启动时自动执行),配置健康检查;4. phpmyadmin服务提供Web数据库管理界面,连接mysql服务;5. 所有服务连接到自定义bridge网络lnmp_net,通过服务名互相通信;6. 目录结构:项目目录下创建nginx/conf.d、nginx/logs、www、php、mysql/init等目录,分别存放Nginx配置、Nginx日志、网站文件、PHP Dockerfile、MySQL初始化脚本。部署步骤:1. 创建项目目录和子目录;2. 编写php/Dockerfile,如FROM php:8.2-fpm-alpine,RUN docker-php-ext-install pdo_mysql mysqli gd;3. 编写nginx/conf.d/default.conf,配置PHP解析(fastcgi_pass php:9000);4. 编写docker-compose.yml;5. 启动docker compose up -d –build(–build强制重新构建php镜像);6. 访问http://localhost验证Nginx,http://localhost:8080访问phpMyAdmin;7. 在www目录放入PHP文件,如phpinfo(),验证PHP解析。开发环境优势:1. 环境一致,团队成员使用相同的Compose配置,避免环境差异;2. 快速切换PHP/MySQL/Nginx版本,修改镜像标签重新构建即可;3. 隔离性好,不同项目使用不同的Compose项目,互不干扰;4. 易于清理,docker compose down -v一键清理所有资源;5. 与生产环境一致,可使用相同的Compose配置部署到生产VPS。注意事项:1. 开发环境可映射本地代码目录到容器,修改代码实时生效;2. 生产环境建议将代码构建到镜像中,不使用绑定挂载;3. 数据库端口不要映射到公网,开发环境可映射,生产环境仅内网访问;4. 敏感信息使用.env文件,不要提交到版本控制。
五、实战案例三:ELK日志分析栈
ELK(Elasticsearch+Logstash+Kibana)是流行的日志分析平台,使用Docker Compose一键部署ELK栈,能快速搭建日志收集、存储、分析和可视化环境。完整的docker-compose.yml配置:services: elasticsearch: image: elasticsearch:8.14.0 container_name: elk_es restart: always environment: – discovery.type=single-node – xpack.security.enabled=false – “ES_JAVA_OPTS=-Xms2g -Xmx2g” ulimits: memlock: soft: -1 hard: -1 volumes: – es_data:/usr/share/elasticsearch/data ports: – “9200:9200” healthcheck: test: [“CMD-SHELL”, “curl -f http://localhost:9200/_cluster/health || exit 1”] interval: 30s timeout: 10s retries: 5 networks: – elk_net logstash: image: logstash:8.14.0 container_name: elk_logstash restart: always volumes: – ./logstash/pipeline:/usr/share/logstash/pipeline – ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml ports: – “5044:5044” – “9600:9600” environment: – “LS_JAVA_OPTS=-Xms512m -Xmx512m” depends_on: elasticsearch: condition: service_healthy networks: – elk_net kibana: image: kibana:8.14.0 container_name: elk_kibana restart: always ports: – “5601:5601” environment: – ELASTICSEARCH_HOSTS=http://elasticsearch:9200 depends_on: elasticsearch: condition: service_healthy networks: – elk_net filebeat: image: elastic/filebeat:8.14.0 container_name: elk_filebeat restart: always user: root volumes: – ./filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro – /var/lib/docker/containers:/var/lib/docker/containers:ro – /var/run/docker.sock:/var/run/docker.sock:ro depends_on: – logstash networks: – elk_net volumes: es_data: networks: elk_net: driver: bridge 配置说明:1. elasticsearch服务单节点模式(discovery.type=single-node),关闭安全功能(测试环境),设置JVM堆内存2G,设置memlock无限制(ES要求),数据持久化到es_data卷,映射9200端口,配置健康检查;2. logstash服务挂载管道配置目录(定义input/filter/output)和主配置文件,映射5044端口(接收Beats数据)和9600端口(监控API),设置JVM内存,依赖ES健康;3. kibana服务映射5601端口,配置ES地址为http://elasticsearch:9200,依赖ES健康;4. filebeat服务以root用户运行,挂载filebeat.yml配置(只读)、Docker容器日志目录(只读)、Docker套接字(只读),自动收集所有容器的日志发送到Logstash;5. 所有服务连接到elk_net网络。Logstash管道配置示例(logstash/pipeline/logstash.conf):input { beats { port => 5044 } } filter { if [container][name] { mutate { add_field => { “container_name” => “%{[container][name]}” } } } } output { elasticsearch { hosts => [“http://elasticsearch:9200”] index => “docker-logs-%{+YYYY.MM.dd}” } } Filebeat配置示例(filebeat/filebeat.yml):filebeat.inputs: – type: container paths: – /var/lib/docker/containers/*/*.log processors: – add_docker_metadata: ~ output.logstash: hosts: [“logstash:5044”] 部署步骤:1. 创建项目目录和子目录(logstash/pipeline、logstash/config、filebeat);2. 编写上述配置文件;3. 启动docker compose up -d;4. 等待所有服务启动(ES首次启动较慢,约1-2分钟);5. 访问http://服务器IP:5601进入Kibana;6. 在Kibana中创建索引模式(docker-logs-*),查看容器日志;7. 创建可视化图表和仪表盘。注意事项:1. Elasticsearch对内存要求较高,建议VPS至少4核8G,JVM堆内存设为物理内存的50%但不超过32G;2. 需要设置vm.max_map_count=262144(宿主机sysctl -w vm.max_map_count=262144,永久写入/etc/sysctl.conf),否则ES启动失败;3. 生产环境开启X-Pack Security,配置用户名密码和TLS加密;4. 生产环境使用ES集群(至少3节点),单节点仅适合测试和小规模;5. 日志量大时在Filebeat和Logstash之间加入Kafka作为消息队列,缓冲流量;6. 配置索引生命周期管理(ILM),自动删除过期日志,控制磁盘使用。
六、Docker Compose高级技巧与最佳实践
掌握Docker Compose的高级技巧,能让你的多容器部署更高效、更安全、更可靠。高级技巧:1. 多环境配置:使用多个Compose文件叠加,基础配置docker-compose.yml,开发环境覆盖docker-compose.override.yml(自动加载),生产环境docker-compose.prod.yml,启动时docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d,后加载的文件覆盖前面的配置;2. 环境变量与.env文件:在项目根目录创建.env文件,定义变量如MYSQL_VERSION=8.0、DB_PASSWORD=xxx,docker-compose.yml中用${VAR}或$VAR引用,支持${VAR:-default}设置默认值,不同环境使用不同的.env文件;3. 配置扩展(extends):使用x-前缀定义可复用的配置片段,如x-logging: &default-logging driver: json-file options: max-size: “10m” max-file: “3”,然后在服务中用<<: *default-logging引用,减少重复配置;4. 健康检查与依赖等待:为依赖服务配置healthcheck,被依赖服务用depends_on: condition: service_healthy等待依赖就绪,避免应用启动时数据库未就绪导致连接失败;也可以使用wait-for-it.sh或dockerize等工具在容器启动脚本中等待依赖;5. 资源限制:通过deploy.resources.limits限制CPU和内存(需docker compose --compatibility up启用,或使用cgroup v2原生支持),如deploy: resources: limits: cpus: '0.5' memory: 512M,防止单个服务占用过多资源影响其他服务;6. 日志管理:配置logging驱动和选项,限制日志文件大小和数量,避免日志占满磁盘,如logging: driver: json-file options: max-size: "10m" max-file: "3";也可使用fluentd、syslog等远程日志驱动,集中收集日志;7. 网络安全:使用自定义bridge网络,不使用默认网络;敏感服务(数据库、缓存)不映射端口到宿主机,仅容器间访问;使用external网络连接不同Compose项目的服务;8. 镜像管理:使用固定版本标签(如mysql:8.0.36)而非latest,避免意外升级导致不兼容;使用私有镜像仓库(Harbor、阿里云ACR)存储自定义镜像;定期更新基础镜像获取安全补丁;9. 数据备份:命名卷数据定期备份,可使用docker run --rm -v vol_name:/data -v $(pwd):/backup alpine tar czf /backup/vol_backup.tar.gz -C /data .命令备份卷,或使用docker-volume-backup等工具自动化备份;10. 一键更新:docker compose pull拉取最新镜像,docker compose up -d重建变更的服务,实现零停机更新(配合健康检查和滚动更新);11. 调试技巧:docker compose logs服务名查看特定服务日志;docker compose exec服务名命令进入容器执行命令(如docker compose exec db mysql -u root -p);docker compose run --rm服务名命令启动一次性容器执行命令后删除;docker compose config验证和查看合并后的完整配置;12. 与CI/CD集成:在GitHub Actions/GitLab CI中使用docker compose构建测试环境,运行自动化测试,测试通过后构建镜像推送到仓库,部署到生产VPS。最佳实践总结:1. 配置即代码,docker-compose.yml纳入版本控制,.env文件不提交(加入.gitignore),提供.env.example模板;2. 单一职责,每个容器只运行一个进程,不同应用使用不同的Compose项目;3. 无状态化,应用容器无状态,数据存放在卷或外部服务,便于水平扩展和迁移;4. 健康检查,所有服务配置健康检查,依赖服务等待就绪;5. 最小权限,容器不以root运行(使用user指定非root用户),不使用privileged模式,只挂载必要的卷;6. 敏感信息管理,密码、密钥使用.env或Docker Secrets,不硬编码在Compose文件中;7. 资源限制,所有服务配置CPU和内存限制,防止资源争抢;8. 日志轮转,配置日志大小限制,避免磁盘占满;9. 定期更新,定期更新镜像和Compose配置,获取安全补丁和新功能;10. 文档化,在项目README中说明如何启动、停止、备份、调试,便于团队协作。Docker Compose是单机多容器部署的最佳工具,掌握这些技巧能让你在VPS上高效部署和管理复杂的应用栈,是每个开发者和运维人员的必备技能。
更多Docker Compose教程和靠谱云服务器推荐,欢迎访问主机测评网zhujishang.com,我们持续更新容器化部署教程、VPS性能评测和云服务器选购指南,帮你选到最适合的Docker部署主机方案。




