[docker] 도커 컨테이너에 인터넷이 없습니다.

나는 잘 작동했지만 이제는 멈췄다. 아무 소용없이 다음 명령을 시도했습니다.

docker run -dns 8.8.8.8 base ping google.com

docker run base ping google.com

sysctl -w net.ipv4.ip_forward=1 -호스트와 컨테이너 모두

모든 I get 및입니다 unknown host google.com. 도커 버전 0.7.0

어떤 아이디어?

PS ufw비활성화



답변

먼저 확인해야 할 것은 docker 컨테이너cat /etc/resolv.conf 에서 실행 됩니다 . 와 같은 잘못된 DNS 서버가있는 경우 컨테이너는 도메인 이름을 ip 주소로 확인할 수 없으므로 실패합니다.nameserver 127.0.x.xping google.com

두 번째로 확인해야 할 것은 호스트 시스템cat /etc/resolv.conf 에서 실행 됩니다 . Docker는 기본적으로 컨테이너가 시작될 때마다 호스트 를 컨테이너에 복사합니다 . 따라서 호스트 가 잘못되면 도커 컨테이너도 마찬가지입니다./etc/resolv.conf/etc/resolv.conf

호스트 /etc/resolv.conf가 틀렸다는 것을 발견하면 다음 두 가지 옵션이 있습니다.

  1. daemon.json에서 DNS 서버를 하드 코드하십시오. 이것은 쉽지만 DNS 서버가 변경 될 것으로 예상되는 경우에는 이상적이지 않습니다.

  2. 호스트를 수정하십시오 /etc/resolv.conf. 이것은 조금 까다 롭지 만 동적으로 생성되며 DNS 서버를 하드 코딩하지 않습니다.


1. docker daemon.json의 DNS 서버 하드 코드

  • 편집하다 /etc/docker/daemon.json

    {
        "dns": ["10.1.2.3", "8.8.8.8"]
    }
    
  • 변경 사항을 적용하려면 docker 데몬을 다시 시작하십시오.
    sudo systemctl restart docker

  • 이제 컨테이너를 실행 / 시작하면 docker가의 /etc/resolv.conf값으로 채워집니다 daemon.json.


2. 호스트 수정 /etc/resolv.conf

A. 우분투 16.04 및 이전

  • Ubuntu 16.04 이하의 경우 /etc/resolv.confNetworkManager에 의해 동적으로 생성되었습니다.

  • 라인 주석 dns=dnsmasq의 (a와 #)의를 /etc/NetworkManager/NetworkManager.conf

  • NetworkManager를 다시 시작하여 다음을 재생성하십시오 /etc/resolv.conf.
    sudo systemctl restart network-manager

  • 호스트에서 확인하십시오. cat /etc/resolv.conf

B. 우분투 18.04 이상

  • Ubuntu 18.04는를 systemd-resolved생성하는/etc/resolv.conf 데 사용 하도록 변경되었습니다 . 이제 기본적으로 로컬 DNS 캐시 127.0.0.53을 사용합니다. 컨테이너 내부에서는 작동하지 않으므로 Docker는 기본적으로 Google의 8.8.8.8 DNS 서버로 설정되어 방화벽 뒤에있는 사람들에게는 손상 될 수 있습니다.

  • /etc/resolv.conf실제로 Ubuntu 18.04에서 기본적 ls -l /etc/resolv.conf으로 /run/systemd/resolve/stub-resolv.conf(127.0.0.53) 을 가리키는 심볼릭 링크 ( )입니다 .

  • /run/systemd/resolve/resolv.conf실제 DNS 서버를 나열 하도록 심볼릭 링크를 변경하십시오 .
    sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

  • 호스트에서 확인하십시오. cat /etc/resolv.conf

이제 /etc/resolv.confdocker가 컨테이너에 복사 할 수있는 유효한 호스트 가 있어야합니다 .


답변

이 조언을 따르면 수정됩니다.

[…] 당신은 모든 것을 재설정하려고 할 수 있습니까?

pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
docker -d

도 커가 브리지를 다시 만들고 모든 네트워크 규칙을 다시 초기화하도록합니다.

https://github.com/dotcloud/docker/issues/866#issuecomment-19218300

인터페이스가 어떻게 든 멈췄습니다.

더 최신 버전의 도커 업데이트 :

위의 답변은 여전히 ​​당신을 위해 일을 끝낼 수는 있지만이 답변이 게시되고도 커가 더 세련 되었기 때문에 꽤 오랜 시간이 걸렸 iptables습니다.

sudo service docker restart 또는 (startstart를 사용하지 않는 Linux 배포판에있는 경우) sudo systemctl restart docker


답변

도커를 다시 시작하는 방법은 수동으로 수행하는 것이 아니라 service또는 init 명령을 사용하는 것입니다 .

service docker restart


답변

OSX에 대한 답변 으로이 질문 업데이트 (Docker Machine 사용)

Docker Machine을 사용하여 OSX에서 Docker를 실행하는 경우 다음이 저에게 효과적입니다.

docker-machine restart

<...wait for it to restart, which takes up to a minute...>

docker-machine env
eval $(docker-machine env)

그런 다음 (적어도 내 경험으로는) 컨테이너에서 google.com을 핑하면 모든 것이 잘됩니다.


답변

나는 내가하고있는 일을 모르지만 그것이 나를 위해 일했다 :

OTHER_BRIDGE=br-xxxxx # this is the other random docker bridge (`ip addr` to find)
service docker stop

ip link set dev $OTHER_BRIDGE down
ip link set dev docker0 down
ip link delete $OTHER_BRIDGE type bridge
ip link delete docker0 type bridge
service docker start && service docker stop

iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE
iptables -t nat -A POSTROUTING ! -o docker0 -s 172.18.0.0/16 -j MASQUERADE

service docker start


답변

나는 사용 DOCKER_OPTS="--dns 8.8.8.8"하고 나중에 발견했으며 컨테이너가 인터넷에 직접 액세스 할 수는 없지만 회사 인트라넷에 액세스 할 수 있음을 발견했습니다. 나는 DOCKER_OPTS다음과 같이 바꿨다 .

DOCKER_OPTS="--dns <internal_corporate_dns_address"

internal_corporate_dns_addressDNS의 IP 주소 또는 FQDN으로 교체 하고 다음을 사용하여 도커를 다시 시작했습니다.

sudo service docker restart

그런 다음 컨테이너를 스폰하고 인터넷에 액세스 할 수 있는지 확인했습니다.


답변

내 컨테이너 중 하나에 대해 무작위로 이런 일이 발생하면 다른 컨테이너는 괜찮 았습니다. 컨테이너가 하나 이상의 비 내부 네트워크에 연결되었으므로 Compose정의 에 아무런 문제가 없습니다 . VM / docker 데몬을 다시 시작해도 도움이되지 않았습니다. 컨테이너가 ping외부 IP 조차 할 수 없었기 때문에 DNS 문제도 아니 었습니다 . 나를 위해 해결 한 것은 도커 네트워크를 다시 만드는 것이 었습니다. 제 경우에는 docker-compose down && docker-compose up효과가있었습니다.

짓다

이렇게하면 모든 컨테이너의 모든 네트워크를 재생성해야합니다.

docker-compose down && docker-compose up

스웜 모드

서비스를 제거하고 다시 생성하면 서비스 네트워크가 다시 생성됩니다.

docker service rm some-service

docker service create ...

컨테이너의 네트워크가 외부 네트워크 인 경우

해당 서비스의 외부 네트워크를 제거했다가 다시 만드십시오.

docker network rm some-external-network

docker network create some-external-network