跳转至

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. 存储驱动选择

docker info | grep "Storage Driver"  # 查看当前存储驱动
# overlay2 — 推荐,性能最好
# btrfs/zfs — 适合需要快照功能的场景

常见报错

报错信息原因解决方法
port is already allocated端口被占lsof -i :端口 找占用进程
network xxx not found网络不存在docker network create xxx
volume in use卷被容器使用先停止使用该卷的容器
Permission denied on mount挂载权限不足检查主机目录权限,或用 :z 后缀
name resolution failureDNS 解析失败确保容器在同一个自定义网络

速查表

# === 网络命令 ===
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 年