$npx -y skills add chaterm/terminal-skills --skill networkingDocker 容器网络
| 1 | # Docker 容器网络 |
| 2 | |
| 3 | ## 概述 |
| 4 | 容器网络模式、跨主机通信等技能。 |
| 5 | |
| 6 | ## 网络驱动 |
| 7 | |
| 8 | ### 网络类型 |
| 9 | ```bash |
| 10 | # bridge(默认)- 单主机容器通信 |
| 11 | # host - 共享主机网络 |
| 12 | # none - 无网络 |
| 13 | # overlay - 跨主机通信(Swarm) |
| 14 | # macvlan - 分配 MAC 地址 |
| 15 | ``` |
| 16 | |
| 17 | ### 查看网络 |
| 18 | ```bash |
| 19 | # 列出网络 |
| 20 | docker network ls |
| 21 | |
| 22 | # 网络详情 |
| 23 | docker network inspect bridge |
| 24 | docker network inspect network_name |
| 25 | |
| 26 | # 查看容器网络 |
| 27 | docker inspect container_name --format '{{json .NetworkSettings.Networks}}' |
| 28 | ``` |
| 29 | |
| 30 | ## Bridge 网络 |
| 31 | |
| 32 | ### 默认 bridge |
| 33 | ```bash |
| 34 | # 容器使用默认 bridge |
| 35 | docker run -d --name web nginx |
| 36 | |
| 37 | # 查看 IP |
| 38 | docker inspect web --format '{{.NetworkSettings.IPAddress}}' |
| 39 | |
| 40 | # 默认 bridge 容器间通过 IP 通信 |
| 41 | # 不支持容器名解析 |
| 42 | ``` |
| 43 | |
| 44 | ### 自定义 bridge |
| 45 | ```bash |
| 46 | # 创建网络 |
| 47 | docker network create mynet |
| 48 | docker network create --driver bridge --subnet 172.20.0.0/16 mynet |
| 49 | |
| 50 | # 使用自定义网络 |
| 51 | docker run -d --name web --network mynet nginx |
| 52 | docker run -d --name api --network mynet myapi |
| 53 | |
| 54 | # 自定义网络支持容器名解析 |
| 55 | docker exec api ping web |
| 56 | ``` |
| 57 | |
| 58 | ### 连接多个网络 |
| 59 | ```bash |
| 60 | # 创建网络 |
| 61 | docker network create frontend |
| 62 | docker network create backend |
| 63 | |
| 64 | # 容器连接多个网络 |
| 65 | docker run -d --name app --network frontend myapp |
| 66 | docker network connect backend app |
| 67 | |
| 68 | # 断开网络 |
| 69 | docker network disconnect frontend app |
| 70 | ``` |
| 71 | |
| 72 | ## Host 网络 |
| 73 | |
| 74 | ```bash |
| 75 | # 使用主机网络 |
| 76 | docker run -d --network host nginx |
| 77 | |
| 78 | # 容器直接使用主机端口 |
| 79 | # 无需端口映射 |
| 80 | # 性能最好,但端口可能冲突 |
| 81 | ``` |
| 82 | |
| 83 | ## None 网络 |
| 84 | |
| 85 | ```bash |
| 86 | # 无网络 |
| 87 | docker run -d --network none myapp |
| 88 | |
| 89 | # 完全隔离,无网络访问 |
| 90 | # 适用于安全敏感场景 |
| 91 | ``` |
| 92 | |
| 93 | ## 端口映射 |
| 94 | |
| 95 | ```bash |
| 96 | # 映射端口 |
| 97 | docker run -d -p 8080:80 nginx # HOST:CONTAINER |
| 98 | docker run -d -p 80:80 -p 443:443 nginx # 多端口 |
| 99 | docker run -d -p 127.0.0.1:8080:80 nginx # 绑定特定 IP |
| 100 | docker run -d -P nginx # 随机端口 |
| 101 | |
| 102 | # 查看端口映射 |
| 103 | docker port container_name |
| 104 | ``` |
| 105 | |
| 106 | ## DNS 配置 |
| 107 | |
| 108 | ```bash |
| 109 | # 自定义 DNS |
| 110 | docker run -d --dns 8.8.8.8 nginx |
| 111 | docker run -d --dns 8.8.8.8 --dns 8.8.4.4 nginx |
| 112 | |
| 113 | # 自定义主机名 |
| 114 | docker run -d --hostname myhost nginx |
| 115 | |
| 116 | # 添加 hosts 记录 |
| 117 | docker run -d --add-host db:192.168.1.100 nginx |
| 118 | ``` |
| 119 | |
| 120 | ## 网络别名 |
| 121 | |
| 122 | ```bash |
| 123 | # 创建网络 |
| 124 | docker network create mynet |
| 125 | |
| 126 | # 使用别名 |
| 127 | docker run -d --name web --network mynet --network-alias webserver nginx |
| 128 | |
| 129 | # 其他容器可通过别名访问 |
| 130 | docker run --rm --network mynet busybox ping webserver |
| 131 | ``` |
| 132 | |
| 133 | ## Overlay 网络(Swarm) |
| 134 | |
| 135 | ```bash |
| 136 | # 初始化 Swarm |
| 137 | docker swarm init |
| 138 | |
| 139 | # 创建 overlay 网络 |
| 140 | docker network create -d overlay myoverlay |
| 141 | |
| 142 | # 创建可附加的 overlay(非 Swarm 服务也可使用) |
| 143 | docker network create -d overlay --attachable myoverlay |
| 144 | |
| 145 | # 在服务中使用 |
| 146 | docker service create --name web --network myoverlay nginx |
| 147 | ``` |
| 148 | |
| 149 | ## Macvlan 网络 |
| 150 | |
| 151 | ```bash |
| 152 | # 创建 macvlan 网络 |
| 153 | docker network create -d macvlan \ |
| 154 | --subnet=192.168.1.0/24 \ |
| 155 | --gateway=192.168.1.1 \ |
| 156 | -o parent=eth0 \ |
| 157 | mymacvlan |
| 158 | |
| 159 | # 使用 macvlan |
| 160 | docker run -d --network mymacvlan --ip 192.168.1.100 nginx |
| 161 | |
| 162 | # 容器获得独立 MAC 地址,可直接在物理网络通信 |
| 163 | ``` |
| 164 | |
| 165 | ## 网络诊断 |
| 166 | |
| 167 | ### 容器内诊断 |
| 168 | ```bash |
| 169 | # 进入容器 |
| 170 | docker exec -it container_name sh |
| 171 | |
| 172 | # 网络工具 |
| 173 | apt-get update && apt-get install -y iputils-ping curl netcat-openbsd |
| 174 | |
| 175 | # 或使用 netshoot |
| 176 | docker run -it --network container:target_container nicolaka/netshoot |
| 177 | ``` |
| 178 | |
| 179 | ### 常用诊断命令 |
| 180 | ```bash |
| 181 | # 查看容器 IP |
| 182 | docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name |
| 183 | |
| 184 | # 查看网络中的容器 |
| 185 | docker network inspect mynet -f '{{range .Containers}}{{.Name}} {{.IPv4Address}}{{"\n"}}{{end}}' |
| 186 | |
| 187 | # 测试连通性 |
| 188 | docker exec container1 ping container2 |
| 189 | docker exec container1 curl http://container2:80 |
| 190 | ``` |
| 191 | |
| 192 | ## 常见场景 |
| 193 | |
| 194 | ### 场景 1:容器间通信 |
| 195 | ```bash |
| 196 | # 创建网络 |
| 197 | docker network create app-network |
| 198 | |
| 199 | # 启动数据库 |
| 200 | docker run -d --name db --network app-network postgres |
| 201 | |
| 202 | # 启动应用(通过容器名访问数据库) |
| 203 | docker run -d --name app --network app-network \ |
| 204 | -e DATABASE_URL=postgres://db:5432/mydb \ |
| 205 | myapp |
| 206 | ``` |
| 207 | |
| 208 | ### 场景 2:隔离前后端 |
| 209 | ```bash |
| 210 | # 创建网络 |
| 211 | docker network create frontend |
| 212 | docker network create backend |
| 213 | |
| 214 | # 前端只在 frontend |
| 215 | docker run -d --name nginx --network frontend -p 80:80 nginx |
| 216 | |
| 217 | # 后端连接两个网络 |
| 218 | docker run -d --name api --network frontend myapi |
| 219 | docker network connect backend api |
| 220 | |
| 221 | # 数据库只在 backend |
| 222 | docker run -d --name db --network backend postgres |
| 223 | ``` |
| 224 | |
| 225 | ### 场景 3:调试网络问题 |
| 226 | ```bash |
| 227 | # 使用 netshoot 调试 |
| 228 | docker run -it --rm --network container:target nicolaka/netshoot |
| 229 | |
| 230 | # 常用命令 |
| 231 | ip addr |
| 232 | ss -tlnp |
| 233 | curl -v http://service:port |
| 234 | tcpdump -i eth0 |
| 235 | nslookup service_name |
| 236 | ``` |
| 237 | |
| 238 | ### 场景 4:限制网络带宽 |
| 239 | ```bash |
| 240 | # 使用 tc 限制带宽(需要 NET_ADMIN 权限) |
| 241 | docker run -d --cap-add NET_ADMIN myapp |
| 242 | |
| 243 | # 在容器内 |
| 244 | tc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms |
| 245 | ``` |
| 246 | |
| 247 | ## 故障排查 |
| 248 | |
| 249 | | 问题 | 排查方法 | |
| 250 | |------|----------| |
| 251 | | 容器间无法通信 | 检查是否在同一网络 | |
| 252 | | DNS 解析失败 | 检查是否使用自定义网络 | |
| 253 | | 端口无法访问 | 检查端口映射、防火墙 | |
| 254 | | 网络性能差 | 考虑使用 host 网络 | |
| 255 | |
| 256 | ```bash |
| 257 | # 检查网络配置 |
| 258 | docker network inspect network_name |
| 259 | |
| 260 | # 检查容器网络 |
| 261 | docker inspect container_name | jq '.[0].NetworkSettings' |
| 262 | |
| 263 | # 检查 iptables 规则 |
| 264 | iptables -L -n -t nat |
| 265 | ``` |