网络基础 #

Docker网络概述 #

为什么需要容器网络? #

text
┌─────────────────────────────────────────────────────┐
│                   容器网络需求                       │
├─────────────────────────────────────────────────────┤
│                                                     │
│  1. 容器间通信                                      │
│  2. 容器与外部网络通信                              │
│  3. 服务发现                                        │
│  4. 负载均衡                                        │
│  5. 网络隔离                                        │
│  6. 安全访问控制                                    │
│                                                     │
└─────────────────────────────────────────────────────┘

Docker网络模型(CNM) #

Docker使用Container Network Model(CNM)作为网络模型:

text
┌─────────────────────────────────────────────────────┐
│                   CNM 架构                           │
├─────────────────────────────────────────────────────┤
│                                                     │
│  ┌─────────────────────────────────────────────┐   │
│  │              Network (网络)                  │   │
│  │  ┌─────────────────────────────────────┐    │   │
│  │  │         Sandbox (沙箱)               │    │   │
│  │  │  ┌─────────────────────────────┐    │    │   │
│  │  │  │      Endpoint (端点)         │    │    │   │
│  │  │  └─────────────────────────────┘    │    │   │
│  │  └─────────────────────────────────────┘    │   │
│  └─────────────────────────────────────────────┘   │
│                                                     │
│  Sandbox: 容器的网络栈配置                          │
│  Endpoint: 连接沙箱和网络的接口                     │
│  Network: 一组可相互通信的端点                      │
│                                                     │
└─────────────────────────────────────────────────────┘

默认网络 #

查看网络 #

bash
# 列出所有网络
docker network ls

# 查看网络详情
docker network inspect bridge

三种默认网络 #

text
┌─────────────────────────────────────────────────────┐
│                   默认网络类型                       │
├─────────────────────────────────────────────────────┤
│                                                     │
│  bridge   - 默认桥接网络                            │
│  host     - 使用宿主机网络                          │
│  none     - 无网络                                  │
│                                                     │
└─────────────────────────────────────────────────────┘

bridge网络 #

bash
# 使用默认bridge网络
docker run -d --name web1 nginx
docker run -d --name web2 nginx

# 查看容器IP
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web1
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web2

# 容器间通过IP通信
docker exec web1 ping -c 3 <web2-ip>

host网络 #

bash
# 使用host网络
docker run -d --name web-host --network host nginx

# 容器直接使用宿主机端口
# 无需端口映射
curl http://localhost:80

none网络 #

bash
# 使用none网络(无网络)
docker run -d --name isolated --network none alpine sleep 1000

# 验证无网络
docker exec isolated ip addr

网络操作 #

创建网络 #

bash
# 创建桥接网络
docker network create mynetwork

# 创建指定子网的网络
docker network create --subnet=172.20.0.0/16 mynetwork

# 创建指定网关的网络
docker network create \
  --subnet=172.20.0.0/16 \
  --gateway=172.20.0.1 \
  mynetwork

# 创建指定IP范围的网络
docker network create \
  --subnet=172.20.0.0/16 \
  --ip-range=172.20.1.0/24 \
  mynetwork

查看网络 #

bash
# 列出网络
docker network ls

# 查看网络详情
docker network inspect mynetwork

# 格式化输出
docker network inspect --format '{{.IPAM.Config}}' mynetwork

删除网络 #

bash
# 删除网络
docker network rm mynetwork

# 删除所有未使用的网络
docker network prune

容器连接网络 #

运行时指定网络 #

bash
# 指定网络
docker run -d --name web --network mynetwork nginx

# 指定IP地址
docker run -d \
  --name web \
  --network mynetwork \
  --ip 172.20.0.10 \
  nginx

# 指定网络别名
docker run -d \
  --name web \
  --network mynetwork \
  --network-alias webserver \
  nginx

连接/断开网络 #

bash
# 连接运行中容器到网络
docker network connect mynetwork mycontainer

# 断开容器网络
docker network disconnect mynetwork mycontainer

# 连接时指定IP
docker network connect --ip 172.20.0.20 mynetwork mycontainer

网络配置 #

daemon.json配置 #

json
// /etc/docker/daemon.json
{
  "bip": "172.17.0.1/16",
  "default-address-pools": [
    {
      "base": "172.17.0.0/16",
      "size": 24
    }
  ],
  "dns": ["8.8.8.8", "8.8.4.4"],
  "dns-search": ["example.com"]
}

容器DNS配置 #

bash
# 设置DNS服务器
docker run --dns 8.8.8.8 --dns 8.8.4.4 nginx

# 设置DNS搜索域
docker run --dns-search example.com nginx

# 设置主机名
docker run --hostname myhost nginx

# 添加hosts条目
docker run --add-host myhost:192.168.1.100 nginx

端口映射 #

端口映射类型 #

bash
# 映射指定端口
docker run -p 8080:80 nginx

# 映射多个端口
docker run -p 8080:80 -p 8443:443 nginx

# 映射到指定IP
docker run -p 127.0.0.1:8080:80 nginx

# 映射UDP端口
docker run -p 53:53/udp nginx

# 随机端口映射
docker run -P nginx

查看端口映射 #

bash
# 查看容器端口映射
docker port mycontainer

# 查看特定端口
docker port mycontainer 80

EXPOSE vs -p #

text
┌─────────────────────────────────────────────────────┐
│               EXPOSE vs -p                          │
├─────────────────────────────────────────────────────┤
│                                                     │
│  EXPOSE (Dockerfile):                               │
│  - 文档化端口                                        │
│  - 不实际发布端口                                    │
│  - 用于-P随机映射                                   │
│                                                     │
│  -p (docker run):                                   │
│  - 实际发布端口                                      │
│  - 映射到宿主机                                      │
│  - 外部可访问                                        │
│                                                     │
└─────────────────────────────────────────────────────┘

网络调试 #

查看网络配置 #

bash
# 查看容器网络配置
docker inspect --format '{{json .NetworkSettings}}' mycontainer | jq

# 查看容器IP
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mycontainer

# 查看容器网络模式
docker inspect --format '{{.HostConfig.NetworkMode}}' mycontainer

网络诊断命令 #

bash
# 进入容器执行网络命令
docker exec mycontainer ping -c 3 google.com
docker exec mycontainer curl -I http://localhost:80
docker exec mycontainer netstat -tlnp
docker exec mycontainer ss -tlnp

# 使用网络工具容器
docker run --rm --network mynetwork nicolaka/netshoot ping -c 3 web
docker run --rm --network mynetwork nicolaka/netshoot curl -I http://web
docker run --rm --network mynetwork nicolaka/netshoot nslookup web

小结 #

本节学习了Docker网络的基础知识:

  • Docker网络模型(CNM)
  • 默认网络类型
  • 网络的基本操作
  • 容器连接网络
  • 端口映射

下一步 #

接下来,让我们学习 网络类型,深入了解Docker支持的各种网络类型。