如果你和我一样,前 18 天已经掌握了 Docker 基础操作,那今天这篇笔记绝对能帮你突破 “单容器局限”—— 我用一天时间实战了多服务协同部署,从 Docker Compose 到网络配置,再到数据持久化,每一步都踩过坑、找到解,现在整理成可直接复用的操作指南。

一、用 Docker Compose 搭起 “Flask+MySQL+Redis” 架构

以前启动多个容器,得逐个敲命令,还得记端口和依赖关系,今天用 Docker Compose 彻底解放双手。先上核心的docker-compose.yml代码,关键配置我都标了注释:

TypeScript取消自动换行复制


对应的.env文件要单独创建,存放敏感信息,格式超简单:

TypeScript取消自动换行复制


这里踩过一个大坑:一开始没加service_healthy条件,Web 服务启动时 MySQL 还在初始化,直接报 “连接拒绝”。加上健康检查后,Web 服务会等 MySQL 能正常 ping 通才启动,问题直接解决。执行docker-compose up -d,3 个服务一次性启动,用docker-compose ps就能看到所有容器状态,比之前高效太多。

二、自定义网络:让容器 “叫名字” 就能通信

之前用默认bridge网络时,容器间只能通过 IP 访问,换个环境 IP 变了就得改配置。今天创建的my-app-network自定义网络,支持 “服务名通信”——Flask 代码里连接 MySQL,不用写172.17.0.2,直接写mysql就行,示例代码如下:

TypeScript取消自动换行复制


想查看网络详情,执行docker network inspect my-app-network,能看到每个容器的 IP、MAC 地址,甚至连网关信息都一目了然。如果需要跨主机通信,试试macvlan模式,只需在networks里加一段配置:

TypeScript取消自动换行复制

networks:

my-macvlan:

driver: macvlan

driver_opts:

parent: eth0 # 宿主机网卡

ipam:

config:

- subnet: 192.168.1.0/24 # 与宿主机同网段

gateway: 192.168.1.1


不过要注意,用macvlan得先在宿主机执行ip link set eth0 promisc on关闭网卡混杂模式,不然容器可能连不上网。

三、数据持久化:别让容器删了你的数据

数据丢了可是大事,今天对比了两种持久化方案:

  • bind mount:直接挂载宿主机目录,比如- ./mysql-data:/var/lib/mysql,优点是方便查看数据,但宿主机目录变了就会出问题;
  • volume:用 Docker 管理的命名卷,像上面配置里的mysql-data,数据存在/var/lib/docker/volumes/mysql-data/_data,安全性更高,还支持跨容器共享。

给 Redis 配tmpfs挂载也很实用,临时数据存在内存里,读写速度比磁盘快 10 倍以上,适合缓存这类不需要持久化的数据。执行docker volume ls能看到所有命名卷,docker volume rm mysql-data可以删除不用的卷,清理空间很方便。

最后总结

今天最大的收获,是从 “会用 Docker” 变成 “能用 Docker 搭架构”。Docker Compose 解决了多服务部署的繁琐,自定义网络让容器通信更灵活,数据卷则保障了生产环境的数据安全。下一步我打算学 Docker Swarm,试试多主机容器编排,如果你也在学 Docker,欢迎评论区交流踩坑经验,一起进步!