更改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 文档
我們將遵循以下步驟來進行網路更改。
-
- 确认当前状态
-
- 创建设置文件
-
- 重新启动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地址,有以下两种方法。
-
- 写在配置文件中。
- 在启动时通过参数指定。
在这里,我将列出通过配置文件进行更改的方法。
以下是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文档