我有一个正在运行的 docker 容器Ubuntu 18.04
。
我使用以下命令运行它,但是如果我关闭接口,无论我做什么,即使它说接口已启动,我也无法再与其建立任何连接。
docker run --hostname=hello.world --cap-add=NET_ADMIN -it test-ubuntu18
在我的容器中,我曾经ip link set eth0 down
暂时禁用网络,但是一旦我重新打开它,就没有任何作用。
这是我的 Dockerfile
FROM ubuntu:18.04 as base
# Install base dependencies
RUN apt-get update && apt-get install -y -q --no-install-recommends \
apt-transport-https build-essential ca-certificates curl dbus git \
iputils-ping libssl-dev net-tools network-manager vim wget systemd \
sudo rsyslog
ENV NVM_DIR /root/.nvm
ENV NODE_VERSION 17
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash \
&& . $NVM_DIR/nvm.sh \
&& nvm install $NODE_VERSION \
&& nvm alias default $NODE_VERSION \
&& nvm use default
# Fix rsyslog start up by disable imklog
RUN sed -i 's/module(load="imklog"/#module(load="imklog"/' /etc/rsyslog.conf
ENTRYPOINT service rsyslog start && \
service dbus start && \
service network-manager start && \
bash
有谁知道是否可以使用 docker 容器重新启用网络?
root@hello:~# ping google.com
PING google.com (172.217.13.110) 56(84) bytes of data.
64 bytes from 172.217.13.110 (172.217.13.110): icmp_seq=1 ttl=63 time=11.9 ms
64 bytes from 172.217.13.110 (172.217.13.110): icmp_seq=2 ttl=63 time=14.0 ms
^C
--- google.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 11.982/13.011/14.041/1.035 ms
root@hello:~# ip link set eth0 down
root@hello:~# ping google.com
ping: google.com: Temporary failure in name resolution
root@hello:~# ip link set eth0 up
root@hello:~# ping google.com
ping: google.com: Temporary failure in name resolution
root@hello:~# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
269: eth0@if270: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
当你运行时
ip link set eth0 down
,会发生两件事:down
且接口不再传递任何流量。当你跑步时
ip link set eth0 up
:up
且接口恢复传输流量。仔细阅读上面的第二步:禁用链接之前路由表中的任何其他路由都不会重新创建。
例如,如果我在本地构建并运行 Dockerfile,则容器最初有一个地址:
和路由表:
运行后
ip link set eth0 down
,我们看到 的链接状态eth0
发生了变化(但仍然有配置的地址):路由表现在是空的:
当我们通过运行重新启用接口时
ip link set eth0 up
,接口将返回到其初始配置:但现在路由表如下所示:
请注意,没有默认路由。如果没有默认路由,您的容器将不知道如何到达除直接连接的地址之外的任何地址。尝试到达其他任何地方都会失败:
(我们在这里看到“名称解析暂时失败”,因为容器无法访问配置的 DNS 服务器。)
我们可以通过手动重新创建默认路由来解决这种情况:
现在一切都按预期进行了: