Get the FREE Ultimate OpenClaw Setup Guide →
npx machina-cli add skill chaterm/terminal-skills/networking --openclaw
Files (1)
SKILL.md
5.6 KB

Docker 容器网络

概述

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

网络驱动

网络类型

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

查看网络

# 列出网络
docker network ls

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

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

Bridge 网络

默认 bridge

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

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

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

自定义 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

连接多个网络

# 创建网络
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 网络

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

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

None 网络

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

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

端口映射

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

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

网络别名

# 创建网络
docker network create mynet

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

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

Overlay 网络(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 网络

# 创建 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 地址,可直接在物理网络通信

网络诊断

容器内诊断

# 进入容器
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

常用诊断命令

# 查看容器 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

常见场景

场景 1:容器间通信

# 创建网络
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

场景 2:隔离前后端

# 创建网络
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

场景 3:调试网络问题

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

场景 4:限制网络带宽

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

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

故障排查

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

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

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

Source

git clone https://github.com/chaterm/terminal-skills/blob/main/docker/networking/SKILL.mdView on GitHub

Overview

本技能提供从网络驱动选择到创建自定义网络、跨主机通信(Overlay/Swarm)、DNS 配置、端口映射、别名解析以及网络诊断的完整参考。你可以基于这些能力实现单主机内的高效互联、以及在需要时通过 Overlay 实现跨主机通信。

How This Skill Works

Docker 使用网络驱动来实现容器的网络栈。你通过 docker network create 创建网络、通过 docker run ... --network 指定容器加入网络、通过 docker network inspect 与 docker inspect 查看网络和容器的网络设置。Overlay 依赖 Swarm,Macvlan 给容器分配独立 MAC 地址以直接在物理网络通信,Bridge 为单主机通信提供默认通道,Host 让容器使用宿主机网络,None 则实现完全隔离。容器间的名称解析在自定义网络中可用,在默认 Bridge 中仅通过 IP 通信。

When to Use It

  • 在同一主机上需要快速、简单的容器互联时使用 Bridge(默认)
  • 需要自定义网络以开启容器名解析时使用自定义 Bridge 网络
  • 需要跨主机通信、服务编排或 Swarm 场景时使用 Overlay
  • 需要尽可能提升网络性能且容器与宿主机端口冲突可控时考虑 Host 网络
  • 需要完全隔离、无网络访问的场景时使用 None 网络

Quick Start

  1. 列出并查看现有网络:docker network ls && docker network inspect bridge
  2. 创建自定义桥接网络并让两个容器共享网络:docker network create mynet && docker run -d --name web --network mynet nginx && docker run -d --name api --network mynet nginx
  3. 在自定义网络中测试容器名解析:docker exec api ping web
  4. 将容器连接到额外网络并断开:docker network connect backend app && docker network disconnect frontend app

Best Practices

  • 优先使用自定义网络以获得容器名解析与更清晰的网络边界
  • 在需要跨主机通信时优先使用 Overlay 网络(在 Swarm 模式下)并设置 attachable(可附加)以便非服务容器也能加入
  • 仅在确有需求时使用 macvlan,避免对物理网络的潜在影响
  • 使用网络别名(network-aliases)提升服务发现的可维护性
  • 定期检查 docker network inspect 的输出,确保没有孤立容器或冲突的子网
  • 对暴露的端口使用明确的映射和防火墙策略,避免未授权访问

Example Use Cases

  • 场景:数据库与应用在同一自定义网络中互访,应用通过容器名解析访问数据库:docker network create app-net, docker run -d --name db --network app-net postgres, docker run -d --name app --network app-net -e DATABASE_URL=postgres://db:5432/mydb myapp
  • 场景:前后端隔离与联合访问,前端在 frontend 网络,后端在 backend 网络,后端再通过 docker network connect 将数据库暴露在 backend 中
  • 场景:使用 netshoot 进行网络诊断:docker run -it --rm --network container:target nicolaka/netshoot
  • 场景:Swarm 中的服务跨 Overlay 网络通信:docker swarm init, docker network create -d overlay myoverlay, docker service create --name web --network myoverlay nginx
  • 场景:需要在容器中直接对外网络通信且容器有独立 MAC 地址(macvlan):docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 mymacvlan, docker run -d --network mymacvlan --ip 192.168.1.100 nginx

Frequently Asked Questions

Add this skill to your agents

Related Skills

Sponsor this space

Reach thousands of developers