数据卷与网络

04 篇结尾埋了个坑:容器一删,里面的数据全没。本篇填这个坑——数据怎么留住(卷),顺带讲清盒子之间怎么通信(网络)。这两块是 Docker 从"玩具"变"生产工具"的分水岭。

一、容器数据为什么靠不住

容器的设计哲学是用完即扔docker rm 掉的容器,它里面的读写层一起陪葬。数据库数据、上传的文件、配置修改——凡是想留下的,都不能只存在容器里。

再次出发组 拓展局域网思路 的 NAT 生存法则第一条就是"数据挂载 (Volume) 是核心":❌ docker run -d my-app vs ✅ docker run -d -v /root/docker_data/app:/data my-app。本篇把这个法则讲透。

二、两种挂载方式:volume 与 bind mount

# 方式一:volume(Docker 管理的数据卷)
docker run -d -v mydata:/var/lib/mysql --name db mysql:8

# 方式二:bind mount(宿主机目录直挂)
docker run -d -v /root/docker_data/app:/data --name app my-app
维度 volume(命名卷) bind mount(目录挂载)
位置 Docker 统一管理(/var/lib/docker/volumes/ 宿主机任意目录
由谁指定 Docker 自动创建 必须自己给绝对路径
适合 数据库数据等"Docker 全托管" 配置文件、需要经常手动看的目录
可移植性 好(不依赖具体路径) 依赖宿主机路径存在

实操感受一下:

docker volume create mydata     # 也可以不建,run 时 -v 会自动建
docker volume ls                # 看所有卷
docker volume inspect mydata    # 看卷在宿主机的真实位置
docker volume rm mydata         # 删除卷(被容器占用会拒绝)
💡直觉记忆

-v 冒号左边是宿主机、右边是容器内。左边是"名字"就是 volume,左边是"/开头的路径"就是 bind mount。再次出发组的"数据目录规划"(/opt/stacks/root/docker_data/)全是 bind mount 路线——图的就是备份脚本直接打包目录、换服务器打包带走。

三、容器网络:默认隔离,映射通信

端口映射:-p 的原理(简述)

容器网络默认跑在 bridge(网桥)上,是一个被隔离的小局域网(通常是 172.17.0.x)。外部进不来,所以需要 -p 8080:80——daemon 在宿主机上做了端口转发(底层靠 iptables DNAT 规则,原理知道即可,不用背)。

docker run -d -p 8080:80 nginx      # 宿主 8080 → 容器 80
docker run -d -p 127.0.0.1:8080:80 nginx   # 只允许本机访问(配合 Tunnel 的安全写法)
docker port <容器名>                 # 查看容器的端口映射表

127.0.0.1 前缀这个写法值得单独记住:不暴露公网、只给本机,Tunnel/反代走 localhost 回源——再次出发组所有服务的 Tunnel 配置默认就是这个姿势。

容器互联:同网络直接喊名字

同一自定义网络里的容器,直接用容器名当域名互相访问

docker network create lab
docker run -d --name web --network lab nginx
docker run -d --name db  --network lab mysql:8
# web 容器里可以直接连 db:3306 —— "db" 就是 DNS 名

这是 Compose 的底层机制:Compose 默认给一组服务建同一个网络,所以 yaml 里数据库地址写服务名就行,不用查 IP(容器重启 IP 会变,靠名字最稳)。

三种网络模式速览

模式 说明 场景
bridge 默认;隔离小局域网 + -p 映射 绝大多数场景
host 容器直接用宿主机网络栈,-p 失效 追求极致性能、少折腾
none 无网络 离线任务/安全沙箱

数据和网络两块拼图补齐,下一步就是把这些散装知识串成流水线——一个 yaml 描述所有服务,一条命令全部拉起:Compose 编排实操


⬅️ Dockerfile 构建镜像 🏠 00-网络与项目 ➡️ Compose 编排实操