Docker 컨테이너 내부에 인터넷이 연결되어 있지 않습니다


24

Docker 컨테이너 내에서 인터넷 연결이 필요한 명령을 실행할 수 없습니다.

공장:

docker run ubuntu /bin/echo 'Hello world'

작동하지 않습니다 :

docker run ubuntu apt-get update

Err:1 http://archive.ubuntu.com/ubuntu xenial InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Err:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Err:3 http://archive.ubuntu.com/ubuntu xenial-security InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Reading package lists...
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-updates/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-security/InRelease  Temporary failure resolving 'archive.ubuntu.com'

와 유사 pip하고 ping.

우분투 16.04에 방화벽이나 회사 프록시 서버를 사용하지 않고 Docker를 다시 시작하려고했습니다.

Upd :

대화식 모드에서 업데이트는 동일한 방식으로 실패합니다.

docker exec -ti angry_goodall /bin/bash
apt-get update
#fails
ping google.com
#fails with "unknown host" message
ping 8.8.8.8 
# shows PING 8.8.8.8 (8.8.8.8): 56 data bytes
# and than hangs indefinetly

sudo apt-get update 호스트, 즉 도커 외부의 컴퓨터에서 성공적으로 실행됩니다.

UPD 도커 버전 1.12.1, 빌드 23cf638


호스트에서 도메인을 핑 (ping) 할 수 있습니까? apt-get update도커와 대화식 모드로 실행할 수 있습니까 ?
adampski

출력에 오류 : 'archive.ubuntu.com'을 해결하는 일시적인 오류가 표시됩니다 ... .. ping www.google.com .. 같은 응답이 있는지 확인하십시오. .. ping 8.8.8.8 .. IP가 작동하고 호스트 이름이 작동하지 않으면 DNS가 작동하지 않는 것입니다 (DNS 서버가 어떤 것을 사용하는지 보려면 /etc/resolv.conf를 참조하십시오)
TG2

@adampski, 나는 당신의 제안에 따라 질문을 업데이트했습니다.
Sashko Lykhenko

@ TG2, 귀하의 제안에 따라 질문을 업데이트했습니다.
Sashko Lykhenko

어떤 버전의 docker engine을 실행하고 있습니까?
adampski

답변:


14

Docker의 GitHub 문제 # 866에서 creack이 제안한 것처럼 :

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

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


1
나는 그것을 시도했고, 이것은 내 컴퓨터 전체의 네트워크를 죽인다.
petersohn

이 정보가 도움이되고 문제가 해결되었습니다. 감사합니다.
Rao

10
-d플래그는 종료되지 않습니다.
Luís de Sousa

2
안녕하세요 @ LuísdeSousa이 투표에 부끄러운 일이지만 새로운 스위치에서 일부 스위치가 제거되거나 변경 될 가능성을 고려하십시오. 특히 이것은 1 년 전에 시작된 이후입니다.
adampski

3
명령을 복사 /
붙여 넣기 만하

12

Ubuntu 16.04의 Docker 17.09에서 다른 솔루션 으로이 문제를 해결 하는 StackOverflow의 비슷한 문제가 있습니다 .

내용을 확인하십시오 resolv.conf:

$ cat /etc/resolv.conf

이와 같은 줄이 포함 된 경우 nameserver 127.0.1.1컨테이너가 잘못된 이름 서버를 얻고 있음을 의미합니다. 이 문제를 해결하려면 NetworkManager.conf파일을 편집 하십시오.

$ sudo pico /etc/NetworkManager/NetworkManager.conf

dns=dnsmasq;로 줄을 주석으로 처리하십시오 . 파일은 다음과 같아야합니다.

[main]
plugins=ifupdown,keyfile,ofono
#dns=dnsmasq

[ifupdown]
managed=false

마지막으로 네트워크 관리자를 다시 시작하십시오.

$ sudo systemctl restart network-manager

컨테이너를 다시 테스트하십시오.

$ docker run ubuntu:16.04 apt-get update
Get:1 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB]
Get:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [102 kB]

설치가 설명과 일치하고 위의 접근 방식으로 문제가 해결되었습니다.
krcools

우분투 18.04에 대한 업데이트 된 답 : superuser.com/a/1335054
wisbucky

7

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

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