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


139

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

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비활성화


9
귀하의 질문은 내 문제를 해결했습니다 : sysctl -w net.ipv4.ip_forward=1(Centos 6에서) 실행해야했습니다
qwertzguy

docker dns routing에 문제가있을 수 있으므로 이와 유사한 솔루션을 확인하십시오. stackoverflow.com/questions/35515203/…
Aditya Kresna Permana

호스트 상자에서 /etc/resolv.conf를 수정 한 후에는 작동하지 않습니다.sysctl -w net.ipv4.ip_forward=1
Reeebuuk

또한 당신이 올바른 값이 있는지 확인 /etc/resolv.conf상의 호스트 머신
Hanxue

sysctl -w net.ipv4.ip_forward=1내가 달리고 난 후에 나를 위해 sudo service docker restart.
Asif 알리

답변:


101

먼저 확인해야 할 것은 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가 컨테이너에 복사 할 수있는 유효한 호스트 가 있어야합니다 .


1
이것은 Docker 17.09가있는 Ubuntu 16.04의 문제를 해결했습니다.
Luís de Sousa

2
이것은 내 문제를 해결했습니다 (OP, Ubuntu 14.04 / Docker 18.01.0-ce와 동일). 이 링크는 도커 이미지에 ping 명령이없는 경우 핑없이 인터넷 연결을 테스트하는 데 유용 할 수 있습니다 . 호스트에 systemctl(Ubuntu 14.04) 가 없으면 네트워킹 서비스를 다시 시작하는 방법을 시도 하십시오. 컴퓨터를 다시 시작하십시오.
Benjamin

매력처럼 일했다!
Homewrecker

1
이것은 Ubuntu 18.04 (옵션 B)에서 작동합니다. 그러나 도커는 현재 올바른 구성 /etc/resolv.conf을 컨테이너에 전송하지 않았으므로 파일을 컨테이너에 수동으로 복사해야했습니다.
glaux

1
내 컴퓨터 (RedHat 7.4)에서 호스트의 구성 파일은 정확하지만 컨테이너 파일은 여전히 ​​172.0.0.11을 가리키고 있습니다. 이제 어떻게해야합니까?
Martin Majewski

90

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

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

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


31
docker -d실패합니다. -d플래그 가 없습니다 .
Luís de Sousa

1
여전히 문제가있는 사람들을 위해 1 년 이상 열린 Moby의 github에 공개 문제가 있습니다 : github.com/moby/moby/issues/26567
Nepoxx

1
@Pawan :ip link del docker0
drewrockshard

1
또는 bridge-utils 설치
cjdcordeiro

5
docker -d최신 버전에는 존재하지 않습니다. 대신 : service docker stop다음 dockerd, 다음service docker start
텔모 마르케스

64

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

service docker restart

5
당신이 리눅스 배포판에있는 경우 그 신출내기 사용하지 않는, sudo는 systemctl 재시작 고정 표시기 나를 위해 일한
제프리

다시 시작하면 정상적으로 작동했습니다. "자동 시작"( systemctl enable docker)으로 설정 한 사실과 관련이 있는지 모르겠습니다.
Lucas Pottersky

OP의 질문과 관련이없는 것 같습니다.
Kevin Buchs

OP가 설명하는 상황에서 도커를 재설정하면 네트워크 인터페이스가 다시 초기화되므로 인터넷 액세스가 다시 활성화됩니다. 이것이 때때로 깨지는 이유를 해결하지는 않지만 문제에 대한 해결책을 제공한다는 것은 사실입니다.
비트 마스크

그러나 프로덕션 환경에서는 재시작도 커가 불가능합니다. 이 경우 문제를 해결하는 방법은 무엇입니까?
Suyanhanx

22

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을 핑하면 모든 것이 잘됩니다.


또한 네트워크 액세스를 다시 작동시키기 위해 Windows에서 작업했습니다.
Mikael Lepistö

1
그것은 나를 위해 일했다. 상단 메뉴 표시 줄에 도커 아이콘이 있으며, 메뉴에는 "다시 시작"옵션이 있습니다. 그 후, 네트워킹은 다시 괜찮

8

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

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

2
좋은 덕트 테이프!
dctremblay

1
비슷한 문제를 해결하는 데 도움이되었습니다. 나는 그것에 시간을 보냈다! 불완전한 Kubespray 설치 후, Docker 컨테이너는 퍼블릭 호스트 또는 IP를 핑 (ping)하려고 할 때 "임시 오류 해결"메시지와 함께 인터넷을 잃었습니다. 그래서 나는이 규칙이 의무적이지 않았다 iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE. 다음 규칙을 사용하여이 규칙이 있는지 확인할 수 있습니다.iptables -t nat -L POSTROUTING
laimison

6

나는 사용 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

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


5

내 컨테이너 중 하나에 대해 무작위로 이런 일이 발생하면 다른 컨테이너는 괜찮 았습니다. 컨테이너가 하나 이상의 비 내부 네트워크에 연결되었으므로 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


4

나를 위해 그것은 호스트의 방화벽이었다. 호스트 방화벽에서 DNS를 허용해야했습니다. 또한 호스트 방화벽 설정을 변경 한 후 도커를 다시 시작해야했습니다.


또는 sudo service iptables stopand by by sudo chkconfig iptables offCentOS / RHEL 에서 iptables를 비활성화 할 수 있습니다.
MichaelZ

4

프록시 설정 이 없어서 인터넷에 액세스 할 수도 없습니다 . 이 경우 --network host에도 작동하지 않을 수 있습니다. 프록시는 환경 변수 http_proxyhttps_proxy다음 을 설정하여 구성 할 수 있습니다 .

docker run -e "http_proxy=YOUR-PROXY" \
           -e "https_proxy=YOUR-PROXY"\
           -e "no_proxy=localhost,127.0.0.1" ... 

no_proxy도 설정해야합니다. 그렇지 않으면 모든 요청 (localhost에 대한 요청 포함)이 프록시를 통과합니다.

자세한 정보 : Archlinux Wiki의 프록시 설정 .


1
이것이 나를위한 해결책이었습니다. 그러나주의 : 나는 alpine을 사용하고 있는데 프록시 설정을 무시하는 것처럼 보이는 wget의 busybox 구현을 가지고 있기 때문에 환경 변수를 설정하면 이점을 보지 못했습니다.
pelson

busybox에 대한 힌트를 주셔서 감사합니다. 아직 몰랐어요!
Simon A. Eugster

1
일부 운영 체제는 설명서 링크 와 같이 대문자가 필요 합니다 .
Flo

3

나에게 그것은 iptables 전달 규칙이었다. 어떤 이유로 든 다음 규칙이 docker의 iptables 규칙과 결합되면 컨테이너의 모든 아웃 바운드 트래픽이 발생했습니다 localhost:8080.

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080

3
그래서 ... 솔루션은 무엇입니까? :) 첫 번째 규칙이 있으며 80에서 8080으로 인바운드 트래픽을 리디렉션하는 데 필요합니다. 아웃 바운드 트래픽에 영향을 미치지 않도록 어떻게 변경합니까?
mrooney

3

우분투 18.04에서 문제가 발생했습니다. 그러나 문제는 DNS에있었습니다. 자체 DNS 서버가 있고 다른 DNS 서버를 차단하는 회사 네트워크에있었습니다. 이것은 일부 웹 사이트 (포르노, 급류 등 ...)를 차단하는 것입니다.

문제를 해결하려면

  1. 호스트 컴퓨터에서 DNS찾으십시오
  2. @jobin 이 제안한대로 --dns your_dns 를 사용 하십시오.

    docker run --dns your_dns -it --name cowsay --hostname cowsay 데비안 배쉬


2

Windows (8.1)에서 (taskmgr을 통해) virtualbox 인터페이스를 종료하고 문제를 해결했습니다.


2

DNS 옵션으로 도커를 시작했을 수 있습니다. --dns 172.x.x.x

나는 같은 오류가 있었고 옵션을 제거했다. /etc/default/docker

선:

# Use DOCKER_OPTS to modify the daemon startup options.
DOCKER_OPTS="--dns 172.x.x.x"

2

VPN에 openconnect 8.3을 사용하는 Ubuntu 19.04의 경우 /etc/resolve.conf를 systemd의 symlink로 연결해야했습니다 (wisbucky와는 반대)

sudo ln -sf /etc/resolv.conf /run/systemd/resolve/resolv.conf

디버깅 단계

  1. 회사 VPN에 연결
  2. /etc/resolv.conf 또는 /run/systemd/resolve/resolv.conf에서 올바른 VPN 설정을 찾으십시오.
  3. 올바른 DNS 설정이있는 것이 무엇이든, 다른 파일로 심볼릭 링크합니다 (힌트 : 할당 왼쪽에 올바른 설정이있는 파일을 배치합니다)

Docker 버전 : Docker 버전 19.03.0-rc2, 빌드 f97efcc


2
감사합니다. Ubuntu 18.04에서 회사 VPN에 연결하면 /etc/resolve.conf 만 DHCP에 의해 업데이트되고 / run / systemd / resolve / resolve / conf는 상수 / 정적으로 유지되었습니다. 이 솔루션이 도움이되었습니다. 이제 로컬 컴퓨터의 컨테이너가 VPN의 서버에 연결되었습니다 (이전에는 발생하지 않았 음)
dexter2305

1

OSX를 사용하는 경우 Docker를 설치 한 후 컴퓨터를 다시 시작해야 할 수 있습니다. 이것은 때때로 문제였습니다.


1

원래 도커 컨테이너는 외부 인터넷에 연결할 수있었습니다 (Amazon EC2에서 실행되는 도커 서비스 / 컨테이너입니다).

내 응용 프로그램은 API이기 때문에 포트 80에서 모든 API를 Docker에서 실행되는 포트로 라우팅하도록 IP 테이블을 업데이트하여 컨테이너 생성 (필요한 모든 패키지 가져 오기 성공)을 추적했습니다. 듣고.

그런 다음 나중에 컨테이너를 다시 작성하려고 시도했지만 실패했습니다. 많은 어려움을 겪은 후, 이전 단계 (IPTable 포트 전달 규칙 설정)가 도커의 외부 네트워킹 기능을 망 쳤음을 발견했습니다.

솔루션 : IPTable 서비스를 중지하십시오.

sudo service iptables stop

Docker 데몬을 다시 시작하십시오.

sudo service docker restart

그런 다음 컨테이너를 다시 빌드하십시오. 도움이 되었기를 바랍니다.


후속 조치

도커에서 실행되는 API가 실행되는 포트로 들어오는 트래픽을 80으로 전달하기 위해 IP 테이블을 망칠 필요가 없다는 것을 완전히 간과했습니다. 대신, docker의 API가 실행중인 포트에 포트 80의 별칭을 지정했습니다.

docker run -d -p 80:<api_port> <image>:<tag> <command to start api>


1

누군가 docker를 실행하는 virtualbox 컨테이너 내 에서이 문제가 발생하는 경우 여기에 추가하십시오. 가상 네트워크를 nat 대신 브리지로 재구성하여 문제를 해결했습니다.


1

나를 위해, 내 문제는 iptables-services가 설치되지 않았기 때문에 발생했습니다. (CentOS) :

sudo yum install iptables-services
sudo service docker restart

시작을 기억하고 iptable 서비스도 활성화하십시오
Jay

1

centos 8에서 내 문제는 docker 서비스를 시작하기 전에 iptables를 설치 및 시작하지 않았다는 것입니다. docker service를 시작하기 전에 iptables 서비스가 시작되어 실행 중인지 확인하십시오.


0

우분투에서 Docker-Compose를 사용하여 프로젝트를 설정하는 동안 이러한 문제가 발생했습니다.

Docker는 인터넷에 전혀 액세스 할 수 없었습니다 .IP 주소 또는 nslookup에 핑을 시도했을 때 항상 실패했습니다.

위에서 설명한 DNS 확인으로 가능한 모든 솔루션을 사용해 보았습니다.

나는 하루 종일 도대체 무슨 일이 일어나고 있는지 알아 내려고 노력했으며 마침내 모든 문제의 원인이 바이러스 백신, 특히 방화벽이 Docker가 IP 주소와 포트를 얻지 못하게하는 방화벽이라는 것을 알았습니다.

내가 비활성화하면 모든 것이 잘 작동했습니다.

따라서 바이러스 백신이 설치되어 있고 문제를 해결하는 데 도움이되지 않는 경우 바이러스 백신의 방화벽이 문제 일 수 있습니다.


0

지난 며칠 동안 비슷한 문제가있었습니다. 나에게 원인은 systemd, docker 및 내 호스팅 공급자의 조합이었습니다. 최신 CentOS (7.7.1908)를 실행 중입니다.

호스팅 제공 업체가 systemd-networkd에 대한 구성 파일을 자동으로 생성합니다. CentOS 7의 현재 버전 인 systemd 219부터 systemd-networkd는 네트워크 관련 sysctl 매개 변수를 제어했습니다. Docker는이 버전과 호환되지 않는 것으로 보이며 컨테이너가 시작될 때마다 IP 전달 플래그를 재설정합니다.

내 솔루션은 공급자 생성 구성 파일 IPForward=true[Network]-section에 추가 하는 것이 었습니다 . 이 파일은 여러 곳에있을 수 있습니다./etc/systemd/network .

이 프로세스는 공식 도커 문서에도 설명되어 있습니다 : https://docs.docker.com/v17.09/engine/installation/linux/linux-postinstall/#ip-forwarding-problems


이 매개 변수를 설정 한 정확한 위치를 지정할 수 있습니까? Google Cloud Platform에서 VM을 실행하는 서버와 정확히 동일한 위치에 있고 서버에서 * .network 파일을 찾을 수 없습니다. 켜져 /usr/lib/sysctl.d/50-default.conf있지만 구문이 다릅니다.
el.severo

클러스터는 자체 관리되며 공급자는 설정시 기본 부트 스트랩 만 수행합니다. 네트워크 구성이 적합했습니다 /etc/systemd/network/10-mainif.network. 확인할 수있는 다른 장소는 /usr/local/lib/systemd//usr/lib/systemd/같은 systemd 맨 당.
BlackCetha

0

나를 위해 centos 7.4를 사용하면 /etc/resolve.conf, iptables, iptables nat 규칙이나 docker 자체의 문제가 아닙니다. 문제는 호스트에 brctl 명령을 사용하여 브릿지를 빌드하는 데 필요한 패키지 bridge-utils가 누락 된 것입니다. yum install -y bridge-utils 및 docker를 다시 시작하여 문제를 해결하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.