docker常用网络操作


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 不支持直接修改已存在网络的配置(如子网、驱动等)。若需修改,需删除现有网络并重新创建。

步骤

  1. 断开所有连接到网络的容器:

    docker network disconnect my_network container_name
  2. 删除网络:

    docker network rm my_network
  3. 重新创建网络(根据需要指定新的配置):

    docker network create --driver bridge --subnet 192.168.20.0/24 my_network
  4. 重新连接容器:

    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

注意: 不能断开默认的 bridgehostnone 网络,除非明确指定。

查看网络状态及包含的容器

查看所有网络及其状态

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_appdb_service 正连接在 my_bridge_network 网络中。

容器查看自身网络状态

容器内部可以通过多种方式查看自身的网络状态和所属网络:

使用 ipifconfig 命令

进入容器内部:

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 默认创建了几个网络,如 bridgehostnone。自定义网络更推荐使用,以避免与默认网络配置冲突。

  • 网络驱动选择: 根据应用需求选择合适的网络驱动。例如,单主机应用使用桥接网络,跨主机服务使用覆盖网络。

  • 安全性: 利用 Docker 网络隔离不同服务,提升应用安全性。不同网络中的容器默认无法互相通信,除非显式连接到同一网络。

  • 资源管理: 定期清理不再使用的网络,避免网络资源浪费和配置混乱。

总结

Docker 的网络管理功能强大且灵活,通过 docker network 命令,用户可以轻松地进行网络的创建、删除、修改和查询操作。同时,容器的网络连接和断开也变得简便。了解和掌握这些网络操作,不仅有助于构建高效、可扩展的容器化应用,也提升了应用的安全性和可维护性。随着容器化技术的不断发展,深入理解 Docker 网络管理将为开发和运维人员带来巨大的优势。