Eu tenho um contêiner docker em execução Ubuntu 18.04
.
Executei-o com o seguinte comando, mas se eu desligar uma interface, não importa o que eu faça, mesmo que diga que a interface está ativa, não consigo mais ter nenhuma conexão com ela.
docker run --hostname=hello.world --cap-add=NET_ADMIN -it test-ubuntu18
Dentro do meu contêiner, eu costumava ip link set eth0 down
desabilitar temporariamente a rede, mas depois de ligá-la novamente, nada funciona.
Este é o meu 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
Alguém sabe se é possível reativar a rede com um contêiner 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
Quando você executa
ip link set eth0 down
, duas coisas acontecem:down
e a interface não passa mais nenhum tráfego.Quando você corre
ip link set eth0 up
:up
e as interfaces retomam a passagem do tráfego.Leia atentamente o segundo passo acima: quaisquer rotas adicionais que estavam na sua tabela de roteamento antes de você desabilitar o link não serão recriadas.
Por exemplo, se eu construir e executar seu Dockerfile localmente, o contêiner inicialmente terá um endereço:
E uma tabela de roteamento:
Depois de executar
ip link set eth0 down
, vemos que o estado do linketh0
mudou (mas ainda tem um endereço configurado):E a tabela de roteamento agora está vazia:
Quando reativamos a interface executando
ip link set eth0 up
, a interface retorna à sua configuração inicial:Mas agora a tabela de roteamento está assim:
Observe que não existe uma rota padrão . Sem uma rota padrão, seu contêiner não sabe como alcançar outros endereços além daqueles aos quais está diretamente conectado. As tentativas de chegar a qualquer outro lugar falharão:
(Estamos vendo uma "Falha temporária na resolução de nomes" aqui porque o contêiner não consegue acessar o servidor DNS configurado.)
Podemos resolver esta situação recriando manualmente a rota padrão:
E agora as coisas funcionaram como esperado: