经过前 17 天的基础学习,今天正式进入 Docker 进阶实战环节,核心围绕多容器协同部署与生产环境优化展开,通过实际案例掌握 Docker Compose 的深度应用,解决了此前单容器运行时的诸多痛点。
一、Docker Compose 实战:搭建多服务应用
上午重点实践了用 Docker Compose 编排 Web 应用、数据库与缓存服务的完整架构。以 “Flask + MySQL + Redis” 组合为例,编写docker-compose.yml文件时,首次尝试了服务依赖配置与环境变量分离。通过depends_on字段指定 Web 服务依赖于 MySQL 和 Redis,确保容器启动顺序无误;同时将数据库密码、Redis 端口等敏感信息写入.env文件,在 YML 中用${变量名}引用,既避免了明文暴露,又方便环境切换。
启动服务时遇到一个关键问题:MySQL 容器启动后立即执行初始化脚本,但 Web 服务因连接过早失败。查阅文档后发现,需在 Web 服务中添加健康检查机制,通过healthcheck字段配置curl命令检测 MySQL 端口,只有当数据库完全就绪后,Web 服务才开始启动。这一细节让我意识到,生产环境中容器间的依赖不仅是 “启动顺序”,更要确保 “服务可用性”。
二、Docker 网络深度配置
下午深入学习 Docker 网络模式,重点突破了自定义桥接网络与跨主机通信。此前使用默认bridge网络时,容器间需通过 IP 地址访问,灵活性差。今天创建自定义网络my-app-network后,容器可直接通过服务名(如mysql)通信,实现了 “服务发现” 功能。通过docker network inspect命令查看网络详情,清晰看到各容器的 IP 分配与连接状态,进一步理解了 Docker 网络的隔离与互联机制。
针对跨主机通信需求,尝试了macvlan网络模式。将宿主机网卡配置为父接口,为容器分配与宿主机同网段的真实 IP,实现了容器与外部设备的直接通信,这为后续部署分布式应用奠定了基础。但实践中发现,macvlan需关闭宿主机的网卡混杂模式,且存在 IP 冲突风险,需结合 DHCP 或固定 IP 规划使用。
三、数据卷与持久化优化
最后聚焦数据持久化问题,对比了volume与bind mount的差异。在 MySQL 服务中,使用命名卷mysql-data挂载数据目录,通过docker volume inspect查看卷的存储路径,发现数据实际保存在宿主机/var/lib/docker/volumes/目录下,相比bind mount更安全,避免了因宿主机目录结构变化导致的数据丢失。同时,为 Redis 配置了tmpfs挂载,将临时数据存储在内存中,提升了缓存服务的读写性能,这一优化方案在高并发场景中极具实用价值。
今日总结
第 18 天的学习让我从 “单容器操作” 转向 “多容器架构设计”,深刻体会到 Docker Compose 在简化部署流程中的作用,以及网络、数据卷配置对生产环境稳定性的影响。后续需进一步实践 Docker Swarm 或 Kubernetes,探索容器编排的更高级用法,为大规模应用部署做好准备。