数据卷与网络
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 编排实操
💬 评论