码头工人 | docker0 仅在第一次运行时才有 IP(可从外部访问)

K1L*_*471 3 networking docker

当我启动一个简单的 docker 容器(例如 Portainer)时

docker run -d --name portainer -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer
Run Code Online (Sandbox Code Playgroud)

该容器可以按预期从互联网访问。

当我停止(docker stop portainer)并启动(docker start portainer)容器时,端口 9000 再次打开(使用 nmap 验证),但 portainer 的 Web 界面永远加载。

# first run
networkctl

 IDX LINK            TYPE     OPERATIONAL SETUP      
   1 lo              loopback carrier     configured 
   2 enp35s0         ether    routable    configured 
   3 enp36s0         ether    no-carrier  configuring
   5 br-1815f2210327 bridge   no-carrier  configuring
   6 br-7f9b2f2637a1 bridge   no-carrier  configuring
   7 br-a9ae27884558 bridge   no-carrier  configuring
6552 br-39aac8ad8ef3 bridge   routable    configuring
6559 docker0         bridge   no-carrier  configuring

# next run
networkctl

 IDX LINK            TYPE     OPERATIONAL SETUP      
   1 lo              loopback carrier     configured 
   2 enp35s0         ether    routable    configured 
   3 enp36s0         ether    no-carrier  configuring
   5 br-1815f2210327 bridge   no-carrier  configuring
   6 br-7f9b2f2637a1 bridge   no-carrier  configuring
   7 br-a9ae27884558 bridge   no-carrier  configuring
6552 br-39aac8ad8ef3 bridge   no-carrier  configuring
6559 docker0         bridge   no-carrier  configuring
Run Code Online (Sandbox Code Playgroud)

我已经尝试过在互联网上找到的不同解决方法,例如

nano /etc/docker/daemon.json
Run Code Online (Sandbox Code Playgroud)

{“调试”:true,“bip”:“172.20.0.1/16”}

以及各种配置中的此配置文件

nano /etc/systemd/network/docker0.network
Run Code Online (Sandbox Code Playgroud)

#[匹配] #名称=docker0

#[Network]
#IPForward=yes

#[Network]
#Address=172.17.0.1/16

#[Link]
#Unmanaged=yes
Run Code Online (Sandbox Code Playgroud)

(目前所有内容都已被注释掉。)

当我重新启动 docker 守护进程时

systemctl restart docker
Run Code Online (Sandbox Code Playgroud)

然后启动docker容器

docker start portainer
Run Code Online (Sandbox Code Playgroud)

它又工作正常了。

我的系统是由 strato.de 托管的 Linux 根服务器:

docker -v
Docker version 20.10.6, build 370c289

cat /etc/issue
Ubuntu 20.04.2 LTS

uname -r
5.4.0-73-generic
Run Code Online (Sandbox Code Playgroud)

该服务器上的所有 docker 容器都会出现此问题。

如果有任何进一步的提示,我将非常感激。

更新

Ubuntu 上的 Docker 无法连接到本地主机 提到的解决方案似乎不适用于我的 Ubuntu 20.04 服务器。

昨天我在虚拟机中安装了相同的操作系统和 docker 版本。那里一切都运转良好。

亲切的问候,K1LLUM1N471

小智 5

我的问题是,我只能在容器 ( docker run --rm alpine ping google.com) 中 ping google 一次,退出后,下次运行相同的命令时,它不会 ping 通。退出容器后地址消失了,但运行ifconfig docker0命令一次后仍然存在。inetinet6

运行时networkctl status链接docker0位于configuring.

这可能会起作用:来自 Strato(专用服务器)的 Ubuntu 22.04 服务器中的
默认 Netplan 配置 ( ) 是:/etc/netplan/01-netcfg.yaml

network:
    version: 2
    ethernets:
      mainif:
        match:
          name: '*'
        dhcp4: yes
Run Code Online (Sandbox Code Playgroud)

将其替换为如下内容:

network:
    version: 2
    ethernets:
      enp3s0:
        dhcp4: yes
        dhcp6: no
      enp2s0:
        dhcp4: yes
        dhcp6: no
Run Code Online (Sandbox Code Playgroud)

应用 netplan 配置 sudo netplan trysudo netplan apply

重启Docker sudo systemctl restart docker

现在运行时networkctl链接docker0应该是unmanaged