容器网络连接
在 Docker 中,容器网络是容器化应用程序通信的基础。Docker 提供了多种网络模式,用来控制容器如何相互连接以及如何与外部网络进行通信。理解 Docker 网络模式和连接方式非常重要,尤其是在构建复杂的微服务架构时。
Docker 的网络模式
Docker 提供了几种不同的网络模式,帮助容器之间以及容器与外部系统之间建立连接:
-
Bridge 网络模式(默认)
- Bridge 网络是 Docker 中最常用的网络模式,默认情况下每个容器都会被连接到
bridge
网络。 - 每个容器在启动时会被分配一个虚拟网卡(veth),并获得一个独立的 IP 地址。容器之间可以通过 IP 地址通信。
- 默认的
bridge
网络模式允许容器与宿主机通信,但不允许容器直接暴露给外部网络,除非显式映射端口。
示例:
- Bridge 网络是 Docker 中最常用的网络模式,默认情况下每个容器都会被连接到

在这个例子中,容器通过桥接网络模式运行,并将容器内的 80
端口映射到宿主机的 8080
端口。
-
Host 网络模式
- 在 Host 网络模式下,容器将使用宿主机的网络栈,而不是创建独立的虚拟网络接口。
- 容器中的服务可以直接访问宿主机的网络资源,且容器端口与宿主机端口是一一对应的。
- Host 网络模式会让容器直接与外部网络通信,没有任何网络隔离。
示例:
在 Host 网络模式下,Nginx 容器将使用宿主机的网络资源,容器的所有端口都直接绑定到宿主机。
-
None 网络模式
- 当容器使用
none
网络模式时,Docker 不会为容器分配任何网络资源,容器只有本地的lo
(loopback)接口。 - 这种模式通常用于需要完全独立于外部网络的特殊场景。
示例:
在这个模式下,Nginx 容器没有任何网络连接。
- 当容器使用
-
Container 网络模式
- 在
container
网络模式下,多个容器可以共享同一个容器的网络栈。新容器会与指定的容器共享 IP 地址、网络接口等。 - 这种模式适用于需要将应用分解为多个容器,但共享相同网络环境的场景。
示例:
在这个例子中,
container2
将与container1
共享相同的网络栈。 - 在
-
自定义 Bridge 网络
- 除了默认的
bridge
网络,Docker 还允许用户创建自定义的bridge
网络。自定义网络允许用户为容器分配可预测的 IP 地址,并支持容器之间使用容器名称进行通信。 - 自定义
bridge
网络使容器能够通过名称相互访问,而无需使用 IP 地址。
创建自定义网络:
将容器连接到自定义网络:
在这个例子中,
myapp
容器可以通过db
直接访问 MySQL 数据库,而无需知道它的 IP 地址。 - 除了默认的
Docker 网络的常见命令
在 Docker 网络管理中,你可以使用多种命令和参数来创建、查看、连接和管理容器网络。以下是 Docker 网络常见命令及其常用的 -xxx
参数:
- 列出所有网络
常用参数:
-q
:只显示网络的 ID,而不是完整的信息。
示例:
- 创建自定义网络
常用参数:
-d
或--driver
:指定网络的驱动程序,默认是bridge
。--subnet
:指定自定义子网。--gateway
:指定自定义网关。--ip-range
:设置 IP 地址分配的范围。--internal
:创建一个内部网络,使网络仅限于容器之间,不允许外部访问。--attachable
:使网络支持独立的容器连接到此网络。
示例:
- 连接容器到网络
常用参数:
--ip
:为容器分配指定的 IP 地址。--alias
:为容器指定一个网络别名,用于在容器网络中访问。
示例:
- 断开容器与网络的连接
常用参数:
-f
或--force
:强制断开容器与网络的连接,即使容器正在运行。
示例:
- 查看网络的详细信息
这个命令没有常用的 -xxx
参数,它会返回一个 JSON 格式的输出,详细描述该网络的配置,包括容器连接信息、子网配置等。
示例:
- 移除网络
- 无常见的
-xxx
参数,但是注意,只有没有连接到该网络的容器时,才能删除网络。
示例:
- 清理未使用的网络
常用参数:
-f
或--force
:跳过确认,直接删除未使用的网络。
示例:
- 运行容器时直接指定网络
常用参数:
--network-alias
:指定网络别名,用于在容器间的通信中访问。
示例:
- 指定容器的 MAC 地址
- 常用参数:
--mac-address
:指定容器的 MAC 地址。
示例:
容器间通信
在自定义 bridge
网络中,Docker 会自动为每个容器分配一个可识别的 DNS 名称,这个名称默认就是容器的名称。容器可以通过名称相互通信,而不需要依赖 IP 地址。
示例:
-
创建自定义网络:
-
启动两个容器并加入该网络:
-
使用容器名称通信: 在
app1
容器中,你可以通过app2
的名称直接访问它: