网络基础 #
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支持的各种网络类型。