Skip to content

网络与存储

Docker 网络

网络模式

bash
# 查看网络
docker network ls

# 创建网络
docker network create mynetwork

四种网络模式:

模式说明使用场景
bridge默认模式,容器有独立网络命名空间单主机容器通信
host共享主机网络命名空间高性能场景
none无网络隔离环境
container与另一容器共享网络容器关联

Bridge 网络

bash
# 创建自定义 bridge 网络
docker network create --driver bridge mybridge

# 运行容器并连接到网络
docker run -d --name app1 --network mybridge myapp
docker run -d --name app2 --network mybridge myapp

# 容器间通过容器名通信(DNS 自动解析)
# app1 可以 ping app2

原理:

┌─────────────────────────────────────────────────┐
│                    Host                          │
│  ┌───────────────────────────────────────────┐  │
│  │              docker0 (网桥)                │  │
│  │        IP: 172.17.0.1                      │  │
│  └───────────────────────────────────────────┘  │
│            ▲                     ▲              │
│     ┌──────┴──────┐        ┌─────┴──────┐      │
│     │ Container 1 │        │ Container 2 │      │
│     │ 172.17.0.2  │        │ 172.17.0.3  │      │
│     └─────────────┘        └─────────────┘      │
└─────────────────────────────────────────────────┘

Host 网络

bash
# 容器直接使用主机网络(无隔离)
docker run --network host myapp

Port 映射

bash
# 容器端口映射到主机
docker run -d -p 8080:3000 myapp
# 访问 http://localhost:8080 → 容器 3000 端口

# 随机端口
docker run -d -P myapp

# 绑定特定 IP
docker run -d -p 127.0.0.1:8080:3000 myapp

Docker 存储

数据卷(Volume)

bash
# 创建数据卷
docker volume create myvolume

# 查看数据卷
docker volume ls
docker volume inspect myvolume

# 挂载数据卷
docker run -d -v myvolume:/app/data myapp
docker run -d -v /host/path:/app/data myapp  # 绑定挂载

# 删除数据卷
docker volume rm myvolume
docker volume prune  # 清理未使用的

Volume 原理:

┌─────────────────────────────────────────────────┐
│                     Host                         │
│  ┌───────────────────────────────────────────┐  │
│  │  /var/lib/docker/volumes/myvolume/_data   │  │ ← 容器数据持久化位置
│  └───────────────────────────────────────────┘  │
│                         ▲                        │
│                         │ 挂载                   │
│  ┌───────────────────────────────────────────┐  │
│  │              Container                     │  │
│  │              /app/data                     │  │
│  └───────────────────────────────────────────┘  │
└─────────────────────────────────────────────────┘

绑定挂载(Bind Mount)

bash
# 挂载主机目录到容器
docker run -d -v /home/user/data:/app/data myapp

# 只读挂载
docker run -d -v /home/user/config:/app/config:ro myapp

tmpfs 挂载

bash
# 数据存储在内存中
docker run --tmpfs /app/tmp myapp

存储驱动

bash
# 查看存储驱动
docker info | grep "Storage Driver"

# 常用驱动
# overlay2 - 默认,适合大多数场景
# device mapper - RHEL/CentOS
# vfs - 简单,但不推荐生产使用

容器间通信

同一网络内

bash
# 创建网络
docker network create app-network

# 启动服务
docker run -d --name mysql --network app-network \
  -e MYSQL_ROOT_PASSWORD=123456 mysql:8

docker run -d --name app --network app-network \
  -e DB_HOST=mysql myapp

# 在 app 容器内可以直接访问 mysql:3306

跨主机通信

bash
# 使用 overlay 网络(Docker Swarm)
docker network create \
  --driver overlay \
  --attachable \
  my-overlay-network

面试高频题

Q1: Docker 有哪几种网络模式?

答案: 四种

  • bridge:默认模式,容器有独立网络空间,通过网桥通信
  • host:共享主机网络命名空间,性能好但无隔离
  • none:禁用网络
  • container:与其他容器共享网络命名空间

Q2: 容器间如何通过容器名通信?

答案:

  1. 将容器连接到同一自定义 bridge 网络
  2. Docker 内置 DNS 会自动解析容器名到对应 IP
bash
docker network create mynet
docker run -d --name svc1 --network mynet img
docker run -d --name svc2 --network mynet img
# svc2 可以 ping svc1

Q3: Docker 数据持久化有哪几种方式?

答案:

  1. Volume:Docker 管理,适合生产环境
  2. Bind Mount:挂载主机目录,适合开发环境
  3. tmpfs:内存存储,适合敏感数据

Q4: 容器删了数据还在吗?

答案:

  • 默认情况下,容器的可写层数据会随容器删除而丢失
  • 使用 Volume 或 Bind Mount 可以实现数据持久化

前端面试知识库