Docker 网络与存储¶
一句话概述:Docker 网络决定容器之间和容器与外界怎么通信,Docker 存储决定容器数据怎么持久化保存,是容器化应用的两大核心基础设施。
核心知识点¶
| 概念 | 白话解释 |
|---|---|
| Bridge Network | 桥接网络 = 同一台主机上容器之间的内部网络(默认) |
| Host Network | 主机网络 = 容器直接用主机的网络,不隔离 |
| Overlay Network | 覆盖网络 = 跨多台主机的容器网络 |
| None Network | 无网络 = 容器完全没网络(安全隔离) |
| Volume | 卷 = Docker 管理的持久化存储(推荐方式) |
| Bind Mount | 绑定挂载 = 直接映射主机目录到容器 |
| tmpfs Mount | 临时文件系统 = 存在内存中,容器停止就没了 |
网络部分¶
1. 网络类型与操作¶
# 查看网络
docker network ls # 列出所有网络
docker network inspect bridge # 查看 bridge 网络详情
# 创建自定义网络
docker network create mynet # 创建桥接网络
docker network create --driver overlay swarm-net # 创建覆盖网络(Swarm)
docker network create --subnet=172.20.0.0/16 custom-net # 指定子网
# 容器连接到网络
docker run -d --name web --network mynet nginx # 启动时指定网络
docker network connect mynet existing-container # 连接已运行的容器
docker network disconnect mynet container-name # 断开连接
# 同一个自定义网络中的容器可以用容器名互相访问
docker run -d --name db --network mynet postgres # 数据库加入 mynet
# web 容器可以用 "db" 作为主机名访问 PostgreSQL
2. 端口映射¶
docker run -d -p 8080:80 nginx # 主机8080 → 容器80
docker run -d -p 127.0.0.1:8080:80 nginx # 只绑定本机
docker run -d -P nginx # 随机映射所有 EXPOSE 端口
docker port container-name # 查看端口映射
3. DNS 和服务发现¶
# 自定义网络自带 DNS 服务发现
docker network create app-net # 创建网络
docker run -d --name api --network app-net myapi # 启动 API
docker run -d --name web --network app-net myweb # 启动 Web
# web 容器内可以直接 ping api(用容器名作为主机名)
docker exec web ping api # 自动解析到 api 容器的 IP
# 网络别名
docker run -d --name db1 --network app-net --network-alias database postgres
docker run -d --name db2 --network app-net --network-alias database postgres
# 访问 "database" 会轮询到 db1 或 db2(简单负载均衡)
存储部分¶
1. 三种存储方式对比¶
# === Volume(推荐:Docker 管理的存储) ===
docker volume create mydata # 创建卷
docker run -d -v mydata:/app/data nginx # 挂载卷
docker volume ls # 列出所有卷
docker volume inspect mydata # 查看卷详情
docker volume rm mydata # 删除卷
docker volume prune # 删除未使用的卷
# === Bind Mount(绑定挂载:映射主机目录) ===
docker run -d -v /host/path:/container/path nginx # 绝对路径
docker run -d -v $(pwd)/data:/app/data nginx # 当前目录下的 data
# 只读挂载
docker run -d -v /host/data:/app/data:ro nginx # 容器只能读不能写
# === tmpfs(临时内存存储) ===
docker run -d --tmpfs /app/tmp nginx # 容器中 /app/tmp 存在内存里
2. 数据备份与恢复¶
# 备份卷数据
docker run --rm \
-v mydata:/source:ro \
-v $(pwd):/backup \
busybox tar czf /backup/mydata-backup.tar.gz -C /source .
# 用 busybox 容器把 mydata 卷打包成 tar.gz
# 恢复卷数据
docker run --rm \
-v mydata:/target \
-v $(pwd):/backup \
busybox tar xzf /backup/mydata-backup.tar.gz -C /target
# 从 tar.gz 解压到卷中
3. 生信数据存储方案¶
# docker-compose.yml — 生信分析数据管理
services:
analysis:
image: biocontainers/samtools:v1.19
volumes:
- raw_data:/data/raw:ro # 原始数据只读
- results:/data/results # 结果可写
- ./scripts:/scripts:ro # 脚本只读
- reference:/data/ref:ro # 参考基因组只读
working_dir: /data
volumes:
raw_data: # 原始测序数据
driver: local
driver_opts:
type: none
o: bind
device: /mnt/sequencing/raw # 挂载本地大容量存储
results: # 分析结果
reference: # 参考基因组
高级用法¶
1. 自定义网络隔离¶
# docker-compose.yml — 前后端网络隔离
services:
nginx:
image: nginx
networks: [frontend, backend] # 同时在两个网络
api:
image: myapi
networks: [backend] # 只在后端网络
db:
image: postgres
networks: [backend] # 只在后端网络
# 外部无法直接访问数据库,必须通过 nginx → api → db
networks:
frontend: # 前端网络(对外)
backend: # 后端网络(内部)
internal: true # 不允许访问外网
2. 存储驱动选择¶
常见报错¶
| 报错信息 | 原因 | 解决方法 |
|---|---|---|
port is already allocated | 端口被占 | lsof -i :端口 找占用进程 |
network xxx not found | 网络不存在 | docker network create xxx |
volume in use | 卷被容器使用 | 先停止使用该卷的容器 |
Permission denied on mount | 挂载权限不足 | 检查主机目录权限,或用 :z 后缀 |
name resolution failure | DNS 解析失败 | 确保容器在同一个自定义网络 |
速查表¶
# === 网络命令 ===
docker network ls # 列出网络
docker network create <name> # 创建网络
docker network inspect <name> # 查看网络详情
docker network connect <net> <ctn> # 连接容器到网络
docker network disconnect <net> <ctn> # 断开连接
docker network rm <name> # 删除网络
docker network prune # 删除未使用的网络
# === 存储命令 ===
docker volume ls # 列出卷
docker volume create <name> # 创建卷
docker volume inspect <name> # 查看卷详情
docker volume rm <name> # 删除卷
docker volume prune # 删除未使用的卷
# === 挂载语法 ===
-v name:/path # 命名卷
-v /host:/path # 绑定挂载
-v /host:/path:ro # 只读挂载
--mount type=volume,src=n,dst=/p # 详细语法
--mount type=bind,src=/h,dst=/p # 绑定挂载详细语法
--mount type=tmpfs,dst=/p # tmpfs 详细语法
参考:Docker 网络文档 | Docker 存储文档 | 更新于 2026 年