菜单
本页目录

容器网络连接

在 Docker 中,容器网络是容器化应用程序通信的基础。Docker 提供了多种网络模式,用来控制容器如何相互连接以及如何与外部网络进行通信。理解 Docker 网络模式和连接方式非常重要,尤其是在构建复杂的微服务架构时。

Docker 的网络模式

Docker 提供了几种不同的网络模式,帮助容器之间以及容器与外部系统之间建立连接:

  1. Bridge 网络模式(默认)

    • Bridge 网络是 Docker 中最常用的网络模式,默认情况下每个容器都会被连接到 bridge 网络。
    • 每个容器在启动时会被分配一个虚拟网卡(veth),并获得一个独立的 IP 地址。容器之间可以通过 IP 地址通信。
    • 默认的 bridge 网络模式允许容器与宿主机通信,但不允许容器直接暴露给外部网络,除非显式映射端口。

    示例

    docker run -d --name mynginx --network bridge -p 8080:80 nginx
    
    Bash

在这个例子中,容器通过桥接网络模式运行,并将容器内的 80 端口映射到宿主机的 8080 端口。

  1. Host 网络模式

    • 在 Host 网络模式下,容器将使用宿主机的网络栈,而不是创建独立的虚拟网络接口。
    • 容器中的服务可以直接访问宿主机的网络资源,且容器端口与宿主机端口是一一对应的。
    • Host 网络模式会让容器直接与外部网络通信,没有任何网络隔离。

    示例

    docker run -d --network host nginx
    
    Bash

    在 Host 网络模式下,Nginx 容器将使用宿主机的网络资源,容器的所有端口都直接绑定到宿主机。

  2. None 网络模式

    • 当容器使用 none 网络模式时,Docker 不会为容器分配任何网络资源,容器只有本地的 lo(loopback)接口。
    • 这种模式通常用于需要完全独立于外部网络的特殊场景。

    示例

    docker run -d --network none nginx
    
    Bash

    在这个模式下,Nginx 容器没有任何网络连接。

  3. Container 网络模式

    • container 网络模式下,多个容器可以共享同一个容器的网络栈。新容器会与指定的容器共享 IP 地址、网络接口等。
    • 这种模式适用于需要将应用分解为多个容器,但共享相同网络环境的场景。

    示例

    docker run -d --name container1 nginx
    docker run -d --network container:container1 alpine ping localhost
    
    Bash

    在这个例子中,container2 将与 container1 共享相同的网络栈。

  4. 自定义 Bridge 网络

    • 除了默认的 bridge 网络,Docker 还允许用户创建自定义的 bridge 网络。自定义网络允许用户为容器分配可预测的 IP 地址,并支持容器之间使用容器名称进行通信。
    • 自定义 bridge 网络使容器能够通过名称相互访问,而无需使用 IP 地址。

    创建自定义网络

    docker network create my_bridge_network
    
    Bash

    将容器连接到自定义网络

    docker run -d --name myapp --network my_bridge_network nginx
    docker run -d --name db --network my_bridge_network mysql
    
    Bash

    在这个例子中,myapp 容器可以通过 db 直接访问 MySQL 数据库,而无需知道它的 IP 地址。

Docker 网络的常见命令

在 Docker 网络管理中,你可以使用多种命令和参数来创建、查看、连接和管理容器网络。以下是 Docker 网络常见命令及其常用的 -xxx 参数:

  1. 列出所有网络
docker network ls
Bash

常用参数

  • -q:只显示网络的 ID,而不是完整的信息。

示例

docker network ls -q
Bash
  1. 创建自定义网络
docker network create <网络名>
Bash

常用参数

  • -d--driver:指定网络的驱动程序,默认是 bridge
  • --subnet:指定自定义子网。
  • --gateway:指定自定义网关。
  • --ip-range:设置 IP 地址分配的范围。
  • --internal:创建一个内部网络,使网络仅限于容器之间,不允许外部访问。
  • --attachable:使网络支持独立的容器连接到此网络。

示例

docker network create --driver bridge --subnet 192.168.1.0/24 my_network
Bash
  1. 连接容器到网络
docker network connect <网络名> <容器名或容器ID>
Bash

常用参数

  • --ip:为容器分配指定的 IP 地址。
  • --alias:为容器指定一个网络别名,用于在容器网络中访问。

示例

docker network connect --ip 192.168.1.100 my_network my_container
Bash
  1. 断开容器与网络的连接
docker network disconnect <网络名> <容器名或容器ID>
Bash

常用参数

  • -f--force:强制断开容器与网络的连接,即使容器正在运行。

示例

docker network disconnect -f my_network my_container
Bash
  1. 查看网络的详细信息
docker network inspect <网络名>
Bash

这个命令没有常用的 -xxx 参数,它会返回一个 JSON 格式的输出,详细描述该网络的配置,包括容器连接信息、子网配置等。

示例

docker network inspect my_network
Bash
  1. 移除网络
docker network rm <网络名>
Bash
  • 无常见的 -xxx 参数,但是注意,只有没有连接到该网络的容器时,才能删除网络。

示例

docker network rm my_network
Bash
  1. 清理未使用的网络
docker network prune
Bash

常用参数

  • -f--force:跳过确认,直接删除未使用的网络。

示例

docker network prune -f
Bash
  1. 运行容器时直接指定网络
docker run -d --network <网络名> <镜像名>
Bash

常用参数

  • --network-alias:指定网络别名,用于在容器间的通信中访问。

示例

docker run -d --network my_network --network-alias myalias nginx
Bash
  1. 指定容器的 MAC 地址
docker network connect --mac-address <MAC地址> <网络名> <容器名>
Bash
  • 常用参数
    • --mac-address:指定容器的 MAC 地址。

示例

docker network connect --mac-address 02:42:ac:11:00:02 my_network my_container
Bash

容器间通信

在自定义 bridge 网络中,Docker 会自动为每个容器分配一个可识别的 DNS 名称,这个名称默认就是容器的名称。容器可以通过名称相互通信,而不需要依赖 IP 地址。

示例

  1. 创建自定义网络:

    docker network create my_bridge_network
    
    Bash
  2. 启动两个容器并加入该网络:

    docker run -d --name app1 --network my_bridge_network nginx
    docker run -d --name app2 --network my_bridge_network nginx
    
    Bash
  3. 使用容器名称通信: 在 app1 容器中,你可以通过 app2 的名称直接访问它:

    docker exec -it app1 ping app2
    
    Bash