Docker 网络通信:增删改查

一、查:查看网络信息

诊断网络问题的第一步是了解当前的网络配置。

常用命令:

  1. 查看所有 Docker 网络
    1
    docker network ls
  2. 查看特定网络的详细信息(如子网、网关、已连接容器等)
    1
    docker network inspect bridge
  3. 查看某个容器的网络配置(IP 地址、网关、MAC 地址等)
    1
    docker inspect 容器名 | grep -A 15 "Networks"
    实用提示:
    遇到容器间无法通信时,优先使用 docker network inspect 检查它们是否在同一个网络中。

二、增:创建网络

Docker 支持创建多种类型的网络以满足不同场景需求。

常用命令:

  1. 创建自定义桥接网络(自动分配子网)
    1
    docker network create my_app_net
  2. 创建自定义桥接网络并指定子网与网关(避免 IP 冲突)
    1
    docker network create --driver bridge --subnet 172.20.0.0/16 --gateway 172.20.0.1 my_app_net
  3. 创建 Macvlan 网络(容器直接使用物理网络)
    1
    2
    3
    4
    5
    docker network create -d macvlan \
    --subnet=192.168.1.0/24 \
    --gateway=192.168.1.2 \
    -o parent=ens160 \
    my_macvlan_net
    最佳实践:
    推荐使用自定义 Bridge 网络,因为其支持自动 DNS 解析,容器可以通过名称互访,避免默认 bridge 网络的通信限制。

三、改:连接/断开网络

灵活管理容器与网络的关系,实现动态调整。

常用命令:

  1. 运行容器并连接指定网络
    1
    docker run -d --name mysql --network my_app_net mysql:8.0
  2. 将正在运行的容器连接到新网络
    1
    docker network connect my_app_net 运行中的容器名
  3. 将容器从某网络断开
    1
    docker network disconnect bridge 运行中的容器名
  4. 为容器指定静态 IP(仅自定义网络有效)
    1
    docker run -d --name static-ip-container --network my_app_net --ip 172.20.0.100 nginx

容器间通信示例:

错误示范(默认 bridge 网络):

1
2
3
docker run -d --name web1 nginx
docker run -d --name web2 nginx
docker exec -it web1 ping web2 # 失败!无法解析主机名"web2"

默认 bridge 网络仅支持 IP 通信。

正确示范(自定义 bridge 网络):

1
2
3
4
5
6
7
8
9
创建网络
docker network create my_net

连接容器到同一自定义网络
docker run -d --name web1 --network my_net nginx
docker run -d --name web2 --network my_net nginx

容器间可通过名称互通
docker exec -it web1 ping web2 # 成功!DNS自动解析

自定义 Bridge 网络内置 DNS,容器名自动解析为 IP。

四、删:清理网络

定期清理未用网络资源,保持环境整洁。

常用命令:

  1. 删除指定自定义网络(需先断开所有容器)

    1
    docker network rm my_old_net
  2. 清理所有未被容器使用的自定义网络(谨慎操作)

    1
    docker network prune

补充:两个关键概念的“增改”操作

端口映射(-p 参数):让外部访问容器

本质是增加一条 DNAT 规则

  1. 增:将容器 80 端口映射到宿主机 8080 端口
    1
    docker run -d --name nginx -p 8080:80 nginx
  2. 改:映射到宿主机特定 IP(仅本机可访问,更安全)
    1
    docker run -d --name nginx -p 127.0.0.1:8080:80 nginx
    访问方式:http://宿主机IP:8080

网络驱动模式选择(–network 参数)

本质是修改容器的基础网络栈。

  1. 使用宿主机网络模式(高性能,无 NAT)
    1
    docker run -d --name nginx --network host nginx
  2. 使用 None 网络模式(完全隔离)
    1
    docker run -d --name nginx --network none nginx
    总结表格:Docker 网络通信核心操作
    操作 核心命令 关键点/示例
    network ls, network inspect, inspect <container> 诊断问题的第一步
    network create 创建自定义 Bridge 网络, 实现容器名通信
    run --network, network connect/disconnect 容器加入同一自定义网络即可用名称互通
    network rm, network prune 定期清理,保持环境整洁
    外联 run -p <host_port>:<container_port> 打通容器与外部世界的通道

对于大多数单机 Docker 应用,最清晰、最可靠的网络通信方式是:
创建一个自定义 Bridge 网络,并将所有需要互通的容器通过 –network 参数连接到该网络。
这样可确保容器间通信稳定且易于管理。