目录
- Docker 网络基础
- Docker 网络指令概述
- 创建网络
- 创建桥接网络
- 创建覆盖网络
- 指定子网和网关
- 删除网络
- 修改网络
- 查询网络
- 列出所有网络
- 查看网络详细信息
- 容器加入网络
- 容器退出网络
- 查看网络状态及包含的容器
- 查看所有网络及其状态
- 查看特定网络的详细信息
- 示例:列出网络中的容器
- 容器查看自身网络状态
- 使用 ip 或 ifconfig 命令
- 查看 /etc/hosts 和 /etc/resolv.conf
- 使用 Docker API 或环境变量
- 容器所属网络的详细查看
- 查看单个容器的网络
- 常见网络操作示例
- 创建一个自定义桥接网络
- 启动容器并连接到自定义网络
- 查看网络中的容器
- 将现有容器连接到另一个网络
- 将容器从网络中断开
- 注意事项
- 总结
Docker 作为现代应用部署和管理的重要工具,其网络管理功能在容器化应用中扮演着关键角色。本文将深入介绍 Docker 操作中的 network
指令,涵盖网络的增删改查(CRUD 操作)、容器如何加入或退出网络、如何查看网络状态及其包含的容器,以及容器如何查看自身的网络状态和所属网络。
Docker 网络基础
Docker 网络允许容器之间以及容器与外部世界之间进行通信。Docker 提供了多种网络驱动,包括:
- bridge(桥接网络): 默认的网络驱动,适用于单主机容器通信。
- host(主机网络): 容器共享宿主机的网络栈。
- overlay(覆盖网络): 跨主机的容器通信,常用于 Docker Swarm。
- macvlan: 允许容器拥有独立的 MAC 地址,适用于需要直接在物理网络上通信的场景。
- none: 不为容器分配网络。
本文主要聚焦于 bridge
网络及其管理操作。
Docker 网络指令概述
Docker 提供了一组命令用于管理网络,这些命令主要通过 docker network
子命令实现。常用的网络管理命令包括:
docker network create
: 创建新的网络。docker network ls
: 列出所有网络。docker network inspect
: 查看网络的详细信息。docker network rm
: 删除网络。docker network connect
: 将容器连接到网络。docker network disconnect
: 将容器从网络断开。
创建网络
创建自定义网络可以更好地控制容器之间的通信。以下是创建不同类型网络的示例:
创建桥接网络
docker network create --driver bridge my_bridge_network
--driver bridge
: 指定使用桥接网络驱动。my_bridge_network
: 自定义网络名称。
创建覆盖网络
docker network create --driver overlay my_overlay_network
--driver overlay
: 指定使用覆盖网络驱动。
指定子网和网关
docker network create \
--driver bridge \
--subnet 192.168.10.0/24 \
--gateway 192.168.10.1 \
my_custom_network
--subnet
: 指定子网范围。--gateway
: 指定网关地址。
删除网络
删除不再需要的网络,以释放资源和避免配置混乱。
docker network rm my_bridge_network
注意: 只有在没有容器连接到该网络时,才能成功删除网络。若有容器连接,需要先断开连接或停止相关容器。
修改网络
Docker 不支持直接修改已存在网络的配置(如子网、驱动等)。若需修改,需删除现有网络并重新创建。
步骤:
-
断开所有连接到网络的容器:
docker network disconnect my_network container_name
-
删除网络:
docker network rm my_network
-
重新创建网络(根据需要指定新的配置):
docker network create --driver bridge --subnet 192.168.20.0/24 my_network
-
重新连接容器:
docker network connect my_network container_name
查询网络
查看现有网络及其详细信息。
列出所有网络
docker network ls
示例输出:
NETWORK ID NAME DRIVER SCOPE
d1f9f1b0c1a2 bridge bridge local
a2b3c4d5e6f7 host host local
c3d4e5f6a7b8 my_bridge_network bridge local
查看网络详细信息
docker network inspect my_bridge_network
示例输出:
[
{
"Name": "my_bridge_network",
"Id": "c3d4e5f6a7b8...",
"Created": "2024-04-27T12:34:56.789Z",
"Scope": "local",
"Driver": "bridge",
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "192.168.10.0/24",
"Gateway": "192.168.10.1"
}
]
},
"Containers": {
"container_id1": {
"Name": "my_container",
"EndpointID": "endpoint_id1",
"MacAddress": "02:42:c0:a8:0a:01",
"IPv4Address": "192.168.10.2/24",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
容器加入网络
当启动一个新容器时,可以指定其连接到特定网络。
docker run -d --name my_container --network my_bridge_network nginx
对于已运行的容器,可以使用 docker network connect
命令将其连接到网络。
docker network connect my_bridge_network existing_container
示例:
docker network connect my_bridge_network web_app
容器退出网络
要将容器从网络中断开,可以使用 docker network disconnect
命令。
docker network disconnect my_bridge_network my_container
注意: 不能断开默认的 bridge
、host
和 none
网络,除非明确指定。
查看网络状态及包含的容器
查看所有网络及其状态
docker network ls
查看特定网络的详细信息
docker network inspect my_bridge_network
在 inspect
的输出中,Containers
字段列出了所有连接到该网络的容器,包括容器名称、IP 地址等信息。
示例:列出网络中的容器
假设有一个网络 my_bridge_network
,执行 docker network inspect my_bridge_network
后,可以看到如下部分:
"Containers": {
"d1e2f3g4h5i6": {
"Name": "web_app",
"EndpointID": "e7f8g9h0i1j2",
"MacAddress": "02:42:c0:a8:0a:02",
"IPv4Address": "192.168.10.3/24",
"IPv6Address": ""
},
"j3k4l5m6n7o8": {
"Name": "db_service",
"EndpointID": "p9q0r1s2t3u4",
"MacAddress": "02:42:c0:a8:0a:03",
"IPv4Address": "192.168.10.4/24",
"IPv6Address": ""
}
}
以上显示了两个容器 web_app
和 db_service
正连接在 my_bridge_network
网络中。
容器查看自身网络状态
容器内部可以通过多种方式查看自身的网络状态和所属网络:
使用 ip
或 ifconfig
命令
进入容器内部:
docker exec -it my_container /bin/bash
然后运行:
ip addr
或
ifconfig
这些命令将显示容器的网络接口及其 IP 地址。
查看 /etc/hosts
和 /etc/resolv.conf
容器的 /etc/hosts
文件包含主机名和 IP 地址的映射关系,而 /etc/resolv.conf
包含 DNS 配置。
cat /etc/hosts
cat /etc/resolv.conf
使用 Docker API 或环境变量
某些情况下,可以通过 Docker 提供的 API 或环境变量获取网络信息。不过,这需要额外的配置和权限。
容器所属网络的详细查看
除了容器内部的查看方法,宿主机上也可以通过 Docker 命令查看容器所属的网络。
查看单个容器的网络
docker inspect -f '{{json .NetworkSettings.Networks}}' my_container
示例输出:
{
"my_bridge_network": {
"IPAMConfig": null,
"Links": null,
"Aliases": [
"my_container"
],
"NetworkID": "c3d4e5f6a7b8...",
"EndpointID": "e7f8g9h0i1j2...",
"Gateway": "192.168.10.1",
"IPAddress": "192.168.10.2",
"IPPrefixLen": 24,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:c0:a8:0a:01",
"DriverOpts": null
}
}
以上信息显示 my_container
连接到了 my_bridge_network
网络,拥有 IP 地址 192.168.10.2
。
常见网络操作示例
创建一个自定义桥接网络
docker network create --driver bridge --subnet 172.25.0.0/16 my_custom_bridge
启动容器并连接到自定义网络
docker run -d --name app1 --network my_custom_bridge nginx
docker run -d --name app2 --network my_custom_bridge nginx
查看网络中的容器
docker network inspect my_custom_bridge
将现有容器连接到另一个网络
docker network connect another_network app1
将容器从网络中断开
docker network disconnect my_custom_bridge app2
注意事项
-
默认网络: Docker 默认创建了几个网络,如
bridge
、host
和none
。自定义网络更推荐使用,以避免与默认网络配置冲突。 -
网络驱动选择: 根据应用需求选择合适的网络驱动。例如,单主机应用使用桥接网络,跨主机服务使用覆盖网络。
-
安全性: 利用 Docker 网络隔离不同服务,提升应用安全性。不同网络中的容器默认无法互相通信,除非显式连接到同一网络。
-
资源管理: 定期清理不再使用的网络,避免网络资源浪费和配置混乱。
总结
Docker 的网络管理功能强大且灵活,通过 docker network
命令,用户可以轻松地进行网络的创建、删除、修改和查询操作。同时,容器的网络连接和断开也变得简便。了解和掌握这些网络操作,不仅有助于构建高效、可扩展的容器化应用,也提升了应用的安全性和可维护性。随着容器化技术的不断发展,深入理解 Docker 网络管理将为开发和运维人员带来巨大的优势。