SuperAPI AI Directory

networking

Deployment & operations

View repository

Updated 10-16 03:42

About this skill

Docker Container Networking

Overview

Skills such as container network modes and cross-host communication.

Network Drivers

Network Types

# bridge(默认)- 单主机容器通信
# host - 共享主机网络
# none - 无网络
# overlay - 跨主机通信(Swarm)
# macvlan - 分配 MAC 地址

View Networks

# 列出网络
docker network ls

# 网络详情
docker network inspect bridge
docker network inspect network_name

# 查看容器网络
docker inspect container_name --format '{{json .NetworkSettings.Networks}}'

Bridge Network

Default bridge

# 容器使用默认 bridge
docker run -d --name web nginx

# 查看 IP
docker inspect web --format '{{.NetworkSettings.IPAddress}}'

# 默认 bridge 容器间通过 IP 通信
# 不支持容器名解析

Custom bridge

# 创建网络
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 exec api ping web

Connecting Multiple Networks

# 创建网络
docker network create frontend
docker network create backend

# 容器连接多个网络
docker run -d --name app --network frontend myapp
docker network connect backend app

# 断开网络
docker network disconnect frontend app

Host Network

# 使用主机网络
docker run -d --network host nginx

# 容器直接使用主机端口
# 无需端口映射
# 性能最好,但端口可能冲突

None Network

# 无网络
docker run -d --network none myapp

# 完全隔离,无网络访问
# 适用于安全敏感场景

Port Mapping

# 映射端口
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

DNS Configuration

# 自定义 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 --hostname myhost nginx

# 添加 hosts 记录
docker run -d --add-host db:192.168.1.100 nginx

Network Aliases

# 创建网络
docker network create mynet

# 使用别名
docker run -d --name web --network mynet --network-alias webserver nginx

# 其他容器可通过别名访问
docker run --rm --network mynet busybox ping webserver

Overlay Network (Swarm)

# 初始化 Swarm
docker swarm init

# 创建 overlay 网络
docker network create -d overlay myoverlay

# 创建可附加的 overlay(非 Swarm 服务也可使用)
docker network create -d overlay --attachable myoverlay

# 在服务中使用
docker service create --name web --network myoverlay nginx

Macvlan Network

# 创建 macvlan 网络
docker network create -d macvlan \
    --subnet=192.168.1.0/24 \
    --gateway=192.168.1.1 \
    -o parent=eth0 \
    mymacvlan

# 使用 macvlan
docker run -d --network mymacvlan --ip 192.168.1.100 nginx

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

Network Diagnostics

Diagnostics in Containers

# 进入容器
docker exec -it container_name sh

# 网络工具
apt-get update && apt-get install -y iputils-ping curl netcat-openbsd

# 或使用 netshoot
docker run -it --network container:target_container nicolaka/netshoot

Common Diagnostic Commands

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

# 查看网络中的容器
docker network inspect mynet -f '{{range .Containers}}{{.Name}} {{.IPv4Address}}{{"\n"}}{{end}}'

# 测试连通性
docker exec container1 ping container2
docker exec container1 curl http://container2:80

Common Scenarios

Scenario 1: Communication Between Containers

# 创建网络
docker network create app-network

# 启动数据库
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

Scenario 2: Isolating Frontend and Backend

# 创建网络
docker network create frontend
docker network create backend

# 前端只在 frontend
docker run -d --name nginx --network frontend -p 80:80 nginx

# 后端连接两个网络
docker run -d --name api --network frontend myapi
docker network connect backend api

# 数据库只在 backend
docker run -d --name db --network backend postgres

Scenario 3: Debugging Network Issues

# 使用 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

Scenario 4: Limiting Network Bandwidth

# 使用 tc 限制带宽(需要 NET_ADMIN 权限)
docker run -d --cap-add NET_ADMIN myapp

# 在容器内
tc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms

Troubleshooting

Issue Troubleshooting Method
Containers cannot communicate Check whether they are on the same network
DNS resolution fails Check whether a custom network is used
Port cannot be accessed Check port mapping and firewall
Poor network performance Consider using the host network
# 检查网络配置
docker network inspect network_name

# 检查容器网络
docker inspect container_name | jq '.[0].NetworkSettings'

# 检查 iptables 规则
iptables -L -n -t nat