更改Docker的网络设置(docker0)

修改Docker的默认网络地址。
主机端需要更改docker0网络接口的IP地址,同时还需要更改Docker容器端的网络地址池的范围(仅限IPv4)。

前提条件 (Docker 版本)

$ docker --version
Docker version 19.03.6, build 369ce74
$

【2020/03/21 追記】
注意:本文所确认的是在 x86_64 Ubuntu 18.04 上进行的操作,但当尝试在 Rasbpian (buster) 上的 docker 上试行本文的步骤时,网络无法改变并且 dockerd 无法启动。在这种情况下,请删除 daemon.json 文件。

【2020/03/22 添加】如果 inter-container communication (容器间通信) 的设置仍保持为 true,则会发生错误。请参考「docker 网络 (docker0) 设置更改 (icc 更改编写) – Qiita」中的更改方法。


网络(范围)的变更

请参考:配置和排除故障 Docker 守护进程 | Docker 文档
请参考:自定义 docker0 桥 | Docker 文档

我們將遵循以下步驟來進行網路更改。

    1. 确认当前状态

 

    1. 创建设置文件

 

    1. 重新启动dockerd

 

    确认设置已生效

确认目前状况。

首先,我们将确认设置更改之前的状态。

执行命令 `ip addr show dev docker0` 和 `docker network inspect bridge` 来确认设置状态。

$ ip addr show docker0
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:a3:f4:1d:e1 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
$
$ docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "1aa4683e24270539e0d55f04fb90256e3110ece305e6c6b37408e202fc49d33e",
        "Created": "2020-02-14T22:11:59.222703633+09:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",         <- ネットワークレンジ
                    "Gateway": "172.17.0.1"            <- brigde (docker0)  IPアドレス
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]
$ 

默认情况下,主机的桥接(docker0)地址为172.17.0.1,分配的网络范围为172.17.0.0/16。

创建配置文件

docker0接口(网桥)是由dockerd创建的。
要更改IP地址,有以下两种方法。

    1. 写在配置文件中。

 

    在启动时通过参数指定。

在这里,我将列出通过配置文件进行更改的方法。

以下是daemon的配置文件。

    • Linux: /etc/docker/daemon.json

Windows: C:\ProgramData\docker\config\daemon.json

默认情况下不存在,因此我们会创建。

{
        "bip": "172.20.0.254/24"
}

在上述示例中,将主机端的(桥接器)IP地址设置为172.20.0.254,将Docker客户端的地址池(网络地址)设置为172.20.0.0/24。
bip的“172.20.0.254/24”是一个带有24位掩码的(包含172.20.0.254在内的范围)网络地址。

可以将“–option”选项的设定写入daemon.json。

这个设置与在 dockerd 的启动选项中指定 –bip=172.20.0.254/24 的意思相同。

如果bip的网络范围和CIDR范围相同,设置相同的网络掩码以进行fixed-cidr不需要指定。

重新启动 dockerd

当设置完成后,重新启动 dockerd。

$ sudo systemctl restart docker

更改设置后的确认

通过实施的配置,确认桥接器的设置已被更改。

请确认默认的主机网络接口是docker0。

$ ip addr show dev docker0
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:00:cf:b5:ba brd ff:ff:ff:ff:ff:ff
    inet 172.20.0.254/24 brd 172.20.0.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::c1fd:cbf0:c006:8663/64 scope link
       valid_lft forever preferred_lft forever
$

我要确认桥梁。

$ docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "784e35bf73471e88a2bd8450e91c2de6b5c297875a78ca2b34af74a1772296c8",
        "Created": "2020-02-15T01:16:39.444039309+09:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.20.0.254/24",
                    "Gateway": "172.20.0.254"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

混合使用固定 CIDR

如果需要指定一个比bip指定的网络范围更小的范围,那就要使用fixed-cidr。

比如,假设将桥接器的IP地址设为172.20.0.254(网络地址为24位掩码,172.20.0.0/24 = 172.20.0.0 ~ 172.20.0.255),并将CIDR范围设为25位掩码,即172.20.0.128/25(172.20.0.128 ~ 172.20.0.255)。

{
        "bip": "172.20.0.254/24",
        "fixed-cidr": "172.20.0.128/25"
}

这意味着在启动 dockerd 时使用了选项 –bip=172.20.0.254/24 –fixed-cidr=172.20.0.128/25。

根据BIP的要求,也可以使用172.20.0.254/25进行记录。

{
        "bip": "172.20.0.254/24",
        "fixed-cidr": "172.20.0.254/25"
}

无论是使用例1的描述方法还是例2的描述方法,反映的设置都是一样的。

$ sudo systemctl restart docker && docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "711fc4ed0209dd8e2e34b4f922286db4f3f205f1f471dbadf706839883dd99d7",
        "Created": "2020-02-15T14:45:57.486131257+09:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.20.0.254/24",
                    "IPRange": "172.20.0.128/25",
                    "Gateway": "172.20.0.254"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

以下是一些补充说明。

确认网络设置

我会检查网络设置。

主机的 docker0 接口

在可以使用Docker的环境中(即Docker守护程序正在运行的环境),默认情况下会配置docker0作为主机的网络接口。

$ ip addr show dev docker0
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:00:cf:b5:ba brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::c1fd:cbf0:c006:8663/64 scope link
       valid_lft forever preferred_lft forever
$

默认情况下,网络地址如上例所示为 172.17.0.0/16 (= 172.17.0.0/255.255.0.0),而主机的 docker0 接口地址将被设置为 172.17.0.1。

查看Docker的默认设置。

要确认Docker的网络设置,请使用docker network命令。

DOCKER(1)                                                            DOCKER(1)

NAME
       docker-network - Manage networks

SYNOPSIS
       docker network

DESCRIPTION
       Manage networks

OPTIONS
       -h, --help[=false]
           help for network

SEE ALSO
       docker(1), docker-network-connect(1), docker-network-create(1),
       docker-network-disconnect(1), docker-network-inspect(1),
       docker-network-ls(1), docker-network-prune(1), docker-network-rm(1)

Docker Community                   Feb 2020                          DOCKER(1)

Docker网络驱动程序清单

用docker network ls命令查看docker网络驱动程序的列表。

DOCKER(1)                                                            DOCKER(1)

NAME
       docker-network-ls - List networks

SYNOPSIS
       docker network ls [OPTIONS]

DESCRIPTION
       Lists all the networks the Engine daemon knows about. This includes the
       networks that span across multiple hosts in a cluster, for example:

                  $ docker network ls
                  NETWORK ID          NAME                DRIVER          SCOPE
                  7fca4eb8c647        bridge              bridge          local
                  9f904ee27bf5        none                null            local
                  cf03ee007fb4        host                host            local
                  78b03ee04fc4        multi-host          overlay         swarm

       Use the --no-trunc option to display the full network id:

              $ docker network ls --no-trunc
              NETWORK ID                                                         NAME                DRIVER
              18a2866682b85619a026c81b98a5e375bd33e1b0936a26cc497c283d27bae9b3   none                null
              c288470c46f6c8949c5f7e5099b5b7947b07eabe8d9a27d79a9cbf111adcbf47   host                host
              7b369448dccbf865d397c8d2be0cda7cf7edc6b0945f77d2529912ae917a0185   bridge              bridge
              95e74588f40db048e86320c6526440c504650a1ff3e9f7d60a497c4d2163e5bd   foo                 bridge
              63d1ff1f77b07ca51070a8c227e962238358bd310bde1529cf62e6c307ade161   dev                 bridge

<略>
OPTIONS
       -f, --filter=
           Provide filter values (e.g. 'driver=bridge')

       --format=""
           Pretty-print networks using a Go template

       -h, --help[=false]
           help for ls

       --no-trunc[=false]
           Do not truncate the output

       -q, --quiet[=false]
           Only display network IDs

SEE ALSO
       docker-network(1)

Docker Community                   Feb 2020                          DOCKER(1)
$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
1aa4683e2427        bridge              bridge              local
85fa1cc162f0        host                host                local
756cc38e0f4e        none                null                local
$

确认Docker桥接

使用docker network inspect命令指定上述显示的bridge并确认设置。

$ docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "1aa4683e24270539e0d55f04fb90256e3110ece305e6c6b37408e202fc49d33e",
        "Created": "2020-02-14T22:11:59.222703633+09:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]
$

默认设置为172.17.0.0/16网络。

            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]

参考:自定义docker0桥 | Docker文档

广告
将在 10 秒后关闭
bannerAds