更改默认的 docker0 网桥 ip 地址
Change default docker0 bridge ip address
在 Ubuntu 服务器 16.04 上启动 docker-ce(18.06.1-ce,构建 e68fc7a)后,创建了以下内容:
$ ifconfig
docker0 Link encap:Ethernet HWaddr 02:42:fe:36:81:72
inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
不幸的是,我的电脑在这个网络上。这意味着一旦 docker 启动,我就会失去与服务器的 ssh 连接。
尝试 1
几个论坛说要将以下内容添加到 /etc/docker/daemon.json
:
{
"bip": "192.168.1.1/24"
}
尝试 2,使用
一个可行的解决方案是 运行:
sudo ip addr add dev docker0 192.168.1.1/24
sudo ip addr del dev docker0 172.17.0.1/16
虽然这是一个可能的解决方案,但我必须在 docker 服务启动后执行此操作。我不能做的事情,因为我同时失去了连接。
尝试 3,跟随@Light.G
将 -bip
添加到 ExecStart
行后,尝试启动 docker 给出 (journalctl -xe):
-- Unit docker.socket has begun starting up.
Sep 11 11:13:19 PTLISLABHLC01 systemd[1]: Listening on Docker Socket for the API.
-- Subject: Unit docker.socket has finished start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit docker.socket has finished starting up.
--
-- The start-up result is done.
Sep 11 11:13:19 PTLISLABHLC01 systemd[1]: docker.service: Start request repeated too quickly.
Sep 11 11:13:19 PTLISLABHLC01 systemd[1]: Failed to start Docker Application Container Engine.
-- Subject: Unit docker.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit docker.service has failed.
--
-- The result is failed.
Sep 11 11:13:19 PTLISLABHLC01 systemd[1]: docker.socket: Unit entered failed state.
Sep 11 11:13:19 PTLISLABHLC01 polkitd(authority=local)[1062]: Unregistered Authentication Agent for unix-process:15666:32644036 (system bus name :1.56, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8) (disconnected from bus)
这里唯一的错误是您应该使用 --bip
而不是 -bip
。检查已接受的答案!
我的解决方案是使用运行 shell 命令的服务来完成。
我创建了 docker-network-setup.sh
:
sudo ip addr add dev docker0 192.168.1.1/24
sudo ip addr del dev docker0 172.17.0.1/16
chmod u+x docker-network-setup.sh
以确保您可以执行它。
和docker-network-setup.service
:
[Unit]
Description=Change docker0 default IP
# When systemd stops or restarts the docker.service, the action is propagated to this unit
PartOf=docker.service
# Start this unit after the docker.service start
After=docker.service
[Service]
# The program will exit after running the script
Type=oneshot
# Execute the shell script
ExecStart=/bin/bash /home/user01/docker-network-setup.sh start
# This service shall be considered active after start
RemainAfterExit=yes
[Install]
# This unit should start when docker.service is starting
WantedBy=docker.service
sudo cp docker-network-setup.service /etc/systemd/system
并且服务已启用!
如果您想立即测试服务,请不要忘记 sudo systemctl daemon-reload
。
不需要额外的实体:
- 在开始前编辑 /lib/systemd/system/docker.service Docker。在
ExecStart=/usr/bin/dockerd
行末尾添加 --bip "192.168.1.1/24"
。
systemctl daemon-reload
systemctl start docker
在 Ubuntu 16.04 和 Docker 17.03-ce 上测试。
2018-09-13 编辑:
由于我们可能仍然需要用户定义的桥接网络,因此仍然存在潜在的问题。
By default bridge is assigned one subnet from the ranges 172.[17-31].0.0/16 or 192.168.[0-240].20/20 which does not overlap with any existing interface. Unlike the default bridge network, user-defined networks supports manual IP address and subnet assignment. If an assignment is not given, then Docker’s default IPAM driver assigns the next subnet available in the private space.
虽然他们说它不会与主机上的任何现有接口重叠,但您仍然遇到了这样的问题。所以如果你需要用户定义的桥接网络,你最好为它们分配特定的子网。据我所知,没有用于自定义 IPAM 驱动程序默认池的参数。
在我找到这个帖子之前,我一直在努力使用 AWS VPC 对等连接 连接,该连接不适用于我的 Docker 容器。
如果您使用的是 AWS 172.17.x.x 子网,它可能会与默认的 Docker 子网冲突( 172.17.0.1/16), 所以这些子网之间没有任何作用...
修复它的一种方法是移动到不同的 AWS 子网(由于遗留 systems/configurations,这并不总是可行);
另一种方法是在 /etc/docker/daemon.json 中使用 bip 设置更改默认 Docker 子网(如上所述)-类似于:
{
"bip": "192.168.1.1/24"
}
最好的方法是避免在 AWS 中使用 172.17.x.x 子网...
在 Ubuntu 服务器 16.04 上启动 docker-ce(18.06.1-ce,构建 e68fc7a)后,创建了以下内容:
$ ifconfig
docker0 Link encap:Ethernet HWaddr 02:42:fe:36:81:72
inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
不幸的是,我的电脑在这个网络上。这意味着一旦 docker 启动,我就会失去与服务器的 ssh 连接。
尝试 1
几个论坛说要将以下内容添加到 /etc/docker/daemon.json
:
{
"bip": "192.168.1.1/24"
}
尝试 2,使用
一个可行的解决方案是 运行:
sudo ip addr add dev docker0 192.168.1.1/24
sudo ip addr del dev docker0 172.17.0.1/16
虽然这是一个可能的解决方案,但我必须在 docker 服务启动后执行此操作。我不能做的事情,因为我同时失去了连接。
尝试 3,跟随@Light.G
将 -bip
添加到 ExecStart
行后,尝试启动 docker 给出 (journalctl -xe):
-- Unit docker.socket has begun starting up.
Sep 11 11:13:19 PTLISLABHLC01 systemd[1]: Listening on Docker Socket for the API.
-- Subject: Unit docker.socket has finished start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit docker.socket has finished starting up.
--
-- The start-up result is done.
Sep 11 11:13:19 PTLISLABHLC01 systemd[1]: docker.service: Start request repeated too quickly.
Sep 11 11:13:19 PTLISLABHLC01 systemd[1]: Failed to start Docker Application Container Engine.
-- Subject: Unit docker.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit docker.service has failed.
--
-- The result is failed.
Sep 11 11:13:19 PTLISLABHLC01 systemd[1]: docker.socket: Unit entered failed state.
Sep 11 11:13:19 PTLISLABHLC01 polkitd(authority=local)[1062]: Unregistered Authentication Agent for unix-process:15666:32644036 (system bus name :1.56, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8) (disconnected from bus)
这里唯一的错误是您应该使用 --bip
而不是 -bip
。检查已接受的答案!
我的解决方案是使用运行 shell 命令的服务来完成。
我创建了 docker-network-setup.sh
:
sudo ip addr add dev docker0 192.168.1.1/24
sudo ip addr del dev docker0 172.17.0.1/16
chmod u+x docker-network-setup.sh
以确保您可以执行它。
和docker-network-setup.service
:
[Unit]
Description=Change docker0 default IP
# When systemd stops or restarts the docker.service, the action is propagated to this unit
PartOf=docker.service
# Start this unit after the docker.service start
After=docker.service
[Service]
# The program will exit after running the script
Type=oneshot
# Execute the shell script
ExecStart=/bin/bash /home/user01/docker-network-setup.sh start
# This service shall be considered active after start
RemainAfterExit=yes
[Install]
# This unit should start when docker.service is starting
WantedBy=docker.service
sudo cp docker-network-setup.service /etc/systemd/system
并且服务已启用!
如果您想立即测试服务,请不要忘记 sudo systemctl daemon-reload
。
不需要额外的实体:
- 在开始前编辑 /lib/systemd/system/docker.service Docker。在
ExecStart=/usr/bin/dockerd
行末尾添加--bip "192.168.1.1/24"
。 systemctl daemon-reload
systemctl start docker
在 Ubuntu 16.04 和 Docker 17.03-ce 上测试。
2018-09-13 编辑:
由于我们可能仍然需要用户定义的桥接网络,因此仍然存在潜在的问题。
By default bridge is assigned one subnet from the ranges 172.[17-31].0.0/16 or 192.168.[0-240].20/20 which does not overlap with any existing interface. Unlike the default bridge network, user-defined networks supports manual IP address and subnet assignment. If an assignment is not given, then Docker’s default IPAM driver assigns the next subnet available in the private space.
虽然他们说它不会与主机上的任何现有接口重叠,但您仍然遇到了这样的问题。所以如果你需要用户定义的桥接网络,你最好为它们分配特定的子网。据我所知,没有用于自定义 IPAM 驱动程序默认池的参数。
在我找到这个帖子之前,我一直在努力使用 AWS VPC 对等连接 连接,该连接不适用于我的 Docker 容器。
如果您使用的是 AWS 172.17.x.x 子网,它可能会与默认的 Docker 子网冲突( 172.17.0.1/16), 所以这些子网之间没有任何作用...
修复它的一种方法是移动到不同的 AWS 子网(由于遗留 systems/configurations,这并不总是可行);
另一种方法是在 /etc/docker/daemon.json 中使用 bip 设置更改默认 Docker 子网(如上所述)-类似于:
{
"bip": "192.168.1.1/24"
}
最好的方法是避免在 AWS 中使用 172.17.x.x 子网...