Docker学习路径——10、Docker Compose 一站式编排:从入门到生产级部署
Docker Compose 一站式编排从入门到生产级部署在微服务架构中单个应用往往由多个相互依赖的容器组成如 Web 服务器 数据库 缓存。手动管理这些容器docker run启动、依赖顺序、网络配置既繁琐又易错。Docker Compose 应运而生——它用声明式 YAML 文件定义整个应用栈实现“一键部署、一键销毁”。为什么必须用 Compose✅简化复杂度10 行 YAML 替代 10 条docker run命令✅依赖管理自动处理启动顺序如 DB 先于 Web 启动✅环境一致性开发、测试、生产环境配置统一✅资源隔离每个项目独立网络/卷避免冲突一、核心概念解析1. 三大核心要素要素说明示例Project项目一组关联服务的集合my-web-appService服务单个容器实例的配置模板web,db,redisCompose File定义项目的 YAML 文件docker-compose.yml2. 工作流程docker-compose.ymlDocker Compose解析配置创建网络拉取镜像启动容器按依赖顺序启动二、安装与验证安装步骤Linux# 下载二进制文件sudocurl-Lhttps://github.com/docker/compose/releases/latest/download/docker-compose-$(uname-s)-$(uname-m)-o/usr/local/bin/docker-compose# 添加执行权限sudochmodx /usr/local/bin/docker-compose# 创建软链接sudoln-s/usr/local/bin/docker-compose /usr/bin/docker-compose# 验证安装docker-compose--version# 输出Docker Compose version v2.24.5替代方案若 GitHub 下载慢可从 DaoCloud 镜像 获取三、Compose 文件深度解析基础结构v3.8 规范version:3.8# 指定 Compose 文件版本services:web:# 服务名自定义image:nginx:alpineports:-80:80networks:-app-netdb:image:mysql:5.7environment:MYSQL_ROOT_PASSWORD:examplevolumes:-db-data:/var/lib/mysql# 定义命名卷volumes:db-data:# 定义自定义网络networks:app-net:driver:bridge关键字段详解字段作用最佳实践image指定镜像优先使用带 tag 的镜像如redis:7.0build从 Dockerfile 构建与image二选一ports端口映射生产环境慎用建议仅暴露必要端口volumes数据卷挂载用命名卷替代绑定挂载更便携environment环境变量敏感信息用env_file或 secretsdepends_on启动依赖注意仅控制启动顺序不等待服务就绪networks网络连接必须先定义网络⚠️depends_on陷阱它只保证容器启动顺序不等待服务真正可用解决方案在应用代码中添加重试逻辑或使用healthcheck四、实战案例修复你的 Compose 文件你提供的配置存在几个关键问题以下是修正版修正后的 docker-compose.ymlversion:3.8services:# Tomcat 服务原 cenos 名称有误tomcat:image:billygoo/tomcat8-jdk8container_name:test01ports:-8080:8080# 添加端口映射否则无法外部访问networks:-xn_networkdepends_on:-redis-mysql# 添加健康检查确保 Tomcat 就绪healthcheck:test:[CMD,curl,-f,http://localhost:8080]interval:30stimeout:10sretries:3redis:image:redis# 修正拼写原 images → imageports:-6379:6379volumes:-/opt/redis/redis.conf:/etc/redis/redis.conf:ro# 只读挂载配置-redis-data:/data# 使用命名卷更安全networks:-xn_networkcommand:redis-server /etc/redis/redis.conf# Redis 健康检查healthcheck:test:[CMD,redis-cli,ping]interval:10stimeout:5sretries:3mysql:image:mysql:5.7# 修正拼写environment:MYSQL_ROOT_PASSWORD:123456MYSQL_DATABASE:db2021MYSQL_USER:xnMYSQL_PASSWORD:123456volumes:-mysql-data:/var/lib/mysql# 命名卷-/opt/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf:ro# 配置文件路径修正networks:-xn_network# MySQL 健康检查healthcheck:test:[CMD,mysqladmin,ping,-h,localhost]interval:10stimeout:5sretries:3# 定义命名卷避免直接挂载宿主机路径volumes:redis-data:mysql-data:# 定义网络networks:xn_network:driver:bridge关键修正点拼写错误images→image端口映射为 Tomcat 添加8080:8080数据卷优化使用命名卷redis-data,mysql-data替代直接挂载配置文件挂载为只读:ro健康检查确保服务真正就绪后再启动依赖服务配置路径MySQL 配置应放在/etc/mysql/conf.d/五、常用命令速查命令作用场景docker-compose up -d后台启动所有服务部署应用docker-compose down停止并删除容器/网络清理环境docker-compose logs -f web实时查看日志调试docker-compose exec db mysql -u root -p进入容器执行命令数据库操作docker-compose config验证 YAML 语法部署前检查docker-compose ps查看服务状态监控项目命名默认以目录名为项目名可通过-p指定docker-compose-pmyapp up-d六、高级技巧1. 环境变量分离创建.env文件DB_PASSWORDsupersecret REDIS_HOSTredis在 compose 文件中引用environment:MYSQL_ROOT_PASSWORD:${DB_PASSWORD}2. 多环境配置docker-compose.yml基础配置docker-compose.override.yml开发环境覆盖自动加载docker-compose.prod.yml生产环境配置# 生产环境启动docker-compose-fdocker-compose.yml-fdocker-compose.prod.yml up-d3. 扩展服务Scale# 启动 3 个 Redis 实例需无状态服务docker-composeup--scaleredis3-d七、生产环境最佳实践1. 安全加固敏感信息使用 Docker secretsSwarm 模式或 HashiCorp Vault最小权限容器以非 root 用户运行网络隔离前端/后端服务分属不同网络2. 资源限制services:web:deploy:# 仅 Swarm 模式有效resources:limits:cpus:0.5memory:512M# Compose 模式用以下方式mem_limit:512mcpus:0.53. 监控集成挂载/var/run/docker.sock给监控容器使用 Prometheus cAdvisor 收集指标八、常见问题排查Q1服务启动顺序问题现象Web 服务因 DB 未就绪而崩溃解决方案添加healthcheck在应用代码中实现连接重试使用wait-for-it.sh脚本GitHub 链接Q2卷权限错误现象MySQL 容器因权限拒绝启动解决方案# 初始化卷权限dockerrun--rm-vmysql-data:/var/lib/mysql alpinechown-R999:999 /var/lib/mysqlQ3网络 DNS 解析失败现象容器内无法通过服务名访问其他服务检查点# 进入容器检查 DNSdocker-composeexecwebcat/etc/resolv.conf# 应包含 nameserver 127.0.0.11Docker 内置 DNS九、总结Compose 黄金法则明确依赖用depends_onhealthcheck双保险持久化数据数据库必须用命名卷配置分离敏感信息绝不硬编码资源限制防止单个服务耗尽资源版本锁定Compose 文件指定version行动清单将现有docker run命令迁移至 Compose为团队制定 Compose 文件规范在 CI/CD 中集成docker-compose config验证掌握 Docker Compose你就拥有了高效管理多容器应用的核心能力。下一步我们将探索如何用Docker Swarm或Kubernetes实现集群化部署
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2561685.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!