networking

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Docker 容器网络

Docker 容器网络

概述

概述

容器网络模式、跨主机通信等技能。
容器网络模式、跨主机通信等技能。

网络驱动

网络驱动

网络类型

网络类型

bash
undefined
bash
undefined

bridge(默认)- 单主机容器通信

bridge(默认)- 单主机容器通信

host - 共享主机网络

host - 共享主机网络

none - 无网络

none - 无网络

overlay - 跨主机通信(Swarm)

overlay - 跨主机通信(Swarm)

macvlan - 分配 MAC 地址

macvlan - 分配 MAC 地址

undefined
undefined

查看网络

查看网络

bash
undefined
bash
undefined

列出网络

列出网络

docker network ls
docker network ls

网络详情

网络详情

docker network inspect bridge docker network inspect network_name
docker network inspect bridge docker network inspect network_name

查看容器网络

查看容器网络

docker inspect container_name --format '{{json .NetworkSettings.Networks}}'
undefined
docker inspect container_name --format '{{json .NetworkSettings.Networks}}'
undefined

Bridge 网络

Bridge 网络

默认 bridge

默认 bridge

bash
undefined
bash
undefined

容器使用默认 bridge

容器使用默认 bridge

docker run -d --name web nginx
docker run -d --name web nginx

查看 IP

查看 IP

docker inspect web --format '{{.NetworkSettings.IPAddress}}'
docker inspect web --format '{{.NetworkSettings.IPAddress}}'

默认 bridge 容器间通过 IP 通信

默认 bridge 容器间通过 IP 通信

不支持容器名解析

不支持容器名解析

undefined
undefined

自定义 bridge

自定义 bridge

bash
undefined
bash
undefined

创建网络

创建网络

docker network create mynet docker network create --driver bridge --subnet 172.20.0.0/16 mynet
docker network create mynet docker network create --driver bridge --subnet 172.20.0.0/16 mynet

使用自定义网络

使用自定义网络

docker run -d --name web --network mynet nginx docker run -d --name api --network mynet myapi
docker run -d --name web --network mynet nginx docker run -d --name api --network mynet myapi

自定义网络支持容器名解析

自定义网络支持容器名解析

docker exec api ping web
undefined
docker exec api ping web
undefined

连接多个网络

连接多个网络

bash
undefined
bash
undefined

创建网络

创建网络

docker network create frontend docker network create backend
docker network create frontend docker network create backend

容器连接多个网络

容器连接多个网络

docker run -d --name app --network frontend myapp docker network connect backend app
docker run -d --name app --network frontend myapp docker network connect backend app

断开网络

断开网络

docker network disconnect frontend app
undefined
docker network disconnect frontend app
undefined

Host 网络

Host 网络

bash
undefined
bash
undefined

使用主机网络

使用主机网络

docker run -d --network host nginx
docker run -d --network host nginx

容器直接使用主机端口

容器直接使用主机端口

无需端口映射

无需端口映射

性能最好,但端口可能冲突

性能最好,但端口可能冲突

undefined
undefined

None 网络

None 网络

bash
undefined
bash
undefined

无网络

无网络

docker run -d --network none myapp
docker run -d --network none myapp

完全隔离,无网络访问

完全隔离,无网络访问

适用于安全敏感场景

适用于安全敏感场景

undefined
undefined

端口映射

端口映射

bash
undefined
bash
undefined

映射端口

映射端口

docker run -d -p 8080:80 nginx # HOST:CONTAINER docker run -d -p 80:80 -p 443:443 nginx # 多端口 docker run -d -p 127.0.0.1:8080:80 nginx # 绑定特定 IP docker run -d -P nginx # 随机端口
docker run -d -p 8080:80 nginx # HOST:CONTAINER docker run -d -p 80:80 -p 443:443 nginx # 多端口 docker run -d -p 127.0.0.1:8080:80 nginx # 绑定特定 IP docker run -d -P nginx # 随机端口

查看端口映射

查看端口映射

docker port container_name
undefined
docker port container_name
undefined

DNS 配置

DNS 配置

bash
undefined
bash
undefined

自定义 DNS

自定义 DNS

docker run -d --dns 8.8.8.8 nginx docker run -d --dns 8.8.8.8 --dns 8.8.4.4 nginx
docker run -d --dns 8.8.8.8 nginx docker run -d --dns 8.8.8.8 --dns 8.8.4.4 nginx

自定义主机名

自定义主机名

docker run -d --hostname myhost nginx
docker run -d --hostname myhost nginx

添加 hosts 记录

添加 hosts 记录

docker run -d --add-host db:192.168.1.100 nginx
undefined
docker run -d --add-host db:192.168.1.100 nginx
undefined

网络别名

网络别名

bash
undefined
bash
undefined

创建网络

创建网络

docker network create mynet
docker network create mynet

使用别名

使用别名

docker run -d --name web --network mynet --network-alias webserver nginx
docker run -d --name web --network mynet --network-alias webserver nginx

其他容器可通过别名访问

其他容器可通过别名访问

docker run --rm --network mynet busybox ping webserver
undefined
docker run --rm --network mynet busybox ping webserver
undefined

Overlay 网络(Swarm)

Overlay 网络(Swarm)

bash
undefined
bash
undefined

初始化 Swarm

初始化 Swarm

docker swarm init
docker swarm init

创建 overlay 网络

创建 overlay 网络

docker network create -d overlay myoverlay
docker network create -d overlay myoverlay

创建可附加的 overlay(非 Swarm 服务也可使用)

创建可附加的 overlay(非 Swarm 服务也可使用)

docker network create -d overlay --attachable myoverlay
docker network create -d overlay --attachable myoverlay

在服务中使用

在服务中使用

docker service create --name web --network myoverlay nginx
undefined
docker service create --name web --network myoverlay nginx
undefined

Macvlan 网络

Macvlan 网络

bash
undefined
bash
undefined

创建 macvlan 网络

创建 macvlan 网络

docker network create -d macvlan
--subnet=192.168.1.0/24
--gateway=192.168.1.1
-o parent=eth0
mymacvlan
docker network create -d macvlan
--subnet=192.168.1.0/24
--gateway=192.168.1.1
-o parent=eth0
mymacvlan

使用 macvlan

使用 macvlan

docker run -d --network mymacvlan --ip 192.168.1.100 nginx
docker run -d --network mymacvlan --ip 192.168.1.100 nginx

容器获得独立 MAC 地址,可直接在物理网络通信

容器获得独立 MAC 地址,可直接在物理网络通信

undefined
undefined

网络诊断

网络诊断

容器内诊断

容器内诊断

bash
undefined
bash
undefined

进入容器

进入容器

docker exec -it container_name sh
docker exec -it container_name sh

网络工具

网络工具

apt-get update && apt-get install -y iputils-ping curl netcat-openbsd
apt-get update && apt-get install -y iputils-ping curl netcat-openbsd

或使用 netshoot

或使用 netshoot

docker run -it --network container:target_container nicolaka/netshoot
undefined
docker run -it --network container:target_container nicolaka/netshoot
undefined

常用诊断命令

常用诊断命令

bash
undefined
bash
undefined

查看容器 IP

查看容器 IP

docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name

查看网络中的容器

查看网络中的容器

docker network inspect mynet -f '{{range .Containers}}{{.Name}} {{.IPv4Address}}{{"\n"}}{{end}}'
docker network inspect mynet -f '{{range .Containers}}{{.Name}} {{.IPv4Address}}{{"\n"}}{{end}}'

测试连通性

测试连通性

docker exec container1 ping container2 docker exec container1 curl http://container2:80
undefined
docker exec container1 ping container2 docker exec container1 curl http://container2:80
undefined

常见场景

常见场景

场景 1:容器间通信

场景 1:容器间通信

bash
undefined
bash
undefined

创建网络

创建网络

docker network create app-network
docker network create app-network

启动数据库

启动数据库

docker run -d --name db --network app-network postgres
docker run -d --name db --network app-network postgres

启动应用(通过容器名访问数据库)

启动应用(通过容器名访问数据库)

docker run -d --name app --network app-network
-e DATABASE_URL=postgres://db:5432/mydb
myapp
undefined
docker run -d --name app --network app-network
-e DATABASE_URL=postgres://db:5432/mydb
myapp
undefined

场景 2:隔离前后端

场景 2:隔离前后端

bash
undefined
bash
undefined

创建网络

创建网络

docker network create frontend docker network create backend
docker network create frontend docker network create backend

前端只在 frontend

前端只在 frontend

docker run -d --name nginx --network frontend -p 80:80 nginx
docker run -d --name nginx --network frontend -p 80:80 nginx

后端连接两个网络

后端连接两个网络

docker run -d --name api --network frontend myapi docker network connect backend api
docker run -d --name api --network frontend myapi docker network connect backend api

数据库只在 backend

数据库只在 backend

docker run -d --name db --network backend postgres
undefined
docker run -d --name db --network backend postgres
undefined

场景 3:调试网络问题

场景 3:调试网络问题

bash
undefined
bash
undefined

使用 netshoot 调试

使用 netshoot 调试

docker run -it --rm --network container:target nicolaka/netshoot
docker run -it --rm --network container:target nicolaka/netshoot

常用命令

常用命令

ip addr ss -tlnp curl -v http://service:port tcpdump -i eth0 nslookup service_name
undefined
ip addr ss -tlnp curl -v http://service:port tcpdump -i eth0 nslookup service_name
undefined

场景 4:限制网络带宽

场景 4:限制网络带宽

bash
undefined
bash
undefined

使用 tc 限制带宽(需要 NET_ADMIN 权限)

使用 tc 限制带宽(需要 NET_ADMIN 权限)

docker run -d --cap-add NET_ADMIN myapp
docker run -d --cap-add NET_ADMIN myapp

在容器内

在容器内

tc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms
undefined
tc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms
undefined

故障排查

故障排查

问题排查方法
容器间无法通信检查是否在同一网络
DNS 解析失败检查是否使用自定义网络
端口无法访问检查端口映射、防火墙
网络性能差考虑使用 host 网络
bash
undefined
问题排查方法
容器间无法通信检查是否在同一网络
DNS 解析失败检查是否使用自定义网络
端口无法访问检查端口映射、防火墙
网络性能差考虑使用 host 网络
bash
undefined

检查网络配置

检查网络配置

docker network inspect network_name
docker network inspect network_name

检查容器网络

检查容器网络

docker inspect container_name | jq '.[0].NetworkSettings'
docker inspect container_name | jq '.[0].NetworkSettings'

检查 iptables 规则

检查 iptables 规则

iptables -L -n -t nat
undefined
iptables -L -n -t nat
undefined