회사 네트워크에서 이미지를 빌드하는 동안 네트워크 호출이 실패 함


81

회사 네트워크에서 Docker 이미지를 빌드하는 데 문제가 있습니다. 방금 Docker를 시작하고 있으므로 hello-world 유형 앱에 대해 다음 Dockerfile이 있습니다.

# DOCKER-VERSION 0.3.4
FROM    centos:6.4
# Enable EPEL for Node.js
RUN     rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
# Install Node.js and npm
RUN     yum install -y npm
# Bundle app source
ADD . /src
# Install app dependencies
RUN cd /src; npm install
EXPOSE  8080
CMD ["node", "/src/index.js"]

이것은 가정의 랩톱, 내 무선 네트워크에 구축 할 때 잘 작동합니다. 필수 종속성을 가져와 이미지를 올바르게 빌드합니다.

그러나 회사 네트워크에있을 때 download.fedoraproject.org에서 RPM을 가져 오려고 할 때 다음과 같은 오류 메시지와 함께 동일한 도커 빌드가 실패합니다.

2 단계 : rpm 실행 -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm ---> e0c26afe9ed5 curl에서 실행 : (5) couldn ' t 프록시 'some.proxy.address'오류 해결 : http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm 건너 뛰기 -전송 실패

회사 네트워크에서는 랩톱에서 해당 URL에 제대로 액세스 할 수 있습니다. 그러나 Docker가 컨테이너를 빌드하려고 시도하면 갑자기 전혀 해결할 수 없습니다. 이 동작은 다양한 외부 리소스 (apt-get 등)에 대해 동일합니다. 모두 회사 네트워크의 랩톱에서 잘 해결할 수 있지만 Docker는 해결할 수 없습니다.

나는 여기서 무슨 일이 일어나고 있는지 알아낼 네트워크 노하우가 없습니다. Docker 컨테이너를 빌드 할 때이 이상한 동작이 발생하는 이유를 아는 사람이 있습니까?


한 번 봐 걸릴 stackoverflow.com/questions/19210563/...를 그것도 문제가 해결 될 수
Thomasleveil

나에게도 같은 문제가 발생했습니다. 나는 달리는 것을 잊었다 apt-get update.
matthiasbe

이는 "Docker가 Cisco AnyConnect에서 DNS 정보를 수집하지 않음"의 증상 일 수 있습니다. forums.docker.com/t/…
Jason

답변:


93

문제를 파악할 수있었습니다. Ubuntu에서 Docker는 컨테이너의 DNS 서버를 8.8.8.x의 Google 서버로 설정합니다. 내가 이해하는 것처럼 이것은 Ubuntu가 /etc/resolv.conf를 127.0.0.1로 설정한다는 사실로 인해 Ubuntu의 해결 방법입니다.

이러한 Google 서버는 방화벽 뒤에서 액세스 할 수 없었기 때문에 URL을 확인할 수 없었습니다.

해결 방법은 Docker에게 사용할 DNS 서버를 알려주는 것입니다. 이 수정 사항은 Docker를 설치 한 방법에 따라 다릅니다.

Ubuntu 패키지

Ubuntu 패키지가 설치되어있는 경우 / etc / default / docker를 편집하고 다음 행을 추가하십시오.

DOCKER_OPTS="--dns <your_dns_server_1> --dns <your_dns_server_2>"

이 구성에 원하는만큼 DNS 서버를 추가 할 수 있습니다. 이 파일을 편집 한 후에는 Docker 서비스를 다시 시작해야합니다.

sudo service docker restart

바이너리

바이너리 메서드 (즉, 패키지 없음)를 통해 Docker를 설치 한 경우 Docker 데몬을 시작할 때 DNS 서버를 설정합니다.

sudo docker -d -D --dns <your_dns_server_1> --dns <your_dns_server_2> &

4
Dockfiles와 함께 'docker build'명령을 사용하는 것은 어떨까요 ... 이러한 상황에서는 작동하지 않는 것 같습니다 : docker --dns = 209.18.47.61 build. 2> & 1 | 티 ./output.txt
Quasaur

2
예, 이것은 도커 빌드에서 작동합니다. 고정 표시기 빌드는 명령 자체에 플래그를 --dns이 없지만이 같은 데몬에 설정하면 그것은 고정 표시기 빌드 사용하는 경우에 적용됩니다
dsw88

이 솔루션에 감사드립니다. 내 측면에서 문제는 그도 커가 IPv4를 사용하고 활성화해야한다는 것입니다. WTF? 배우기 : IPv4는 죽었습니다. IPv4 전용 소프트웨어는 심각하게 손상되었습니다.
Tino 2014

1
이미이 단계를 수행했고 오류가 다시 발생하기 시작했습니다. 서비스를 다시 시작하면 다시 수정되었습니다.
Andrew Grothe 2015 년

내가 --dns옵션을 사용하거나 구성을 넣어 실행하려고했지만 도커 1.7에서이 문제가 발생합니다/etc/default/docker
Patryk

65

Docker 데몬의 DNS 설정을 변경하는 것이 좋습니다. /etc/docker/daemon.json 에서 데몬 구성 파일을 생성하여 docker 데몬의 기본 옵션을 설정할 수 있습니다 . 호스트 컴퓨터에 따라 DNS 서버를 설정합니다. 예를 들어 내 DNS 서버는 10.0.0.2입니다.

{"dns": ["10.0.0.2", "8.8.8.8"] }

그런 다음 Docker 서비스를 다시 시작하면됩니다.

sudo service docker restart

단계별 설명은 여기에서 볼 수 있습니다. Docker의 네트워킹 DNS 구성 수정


20

다음 단계는 나를 위해 작동합니다 (도커 빌드 및 도커 실행 명령 모두). 내 Linux 버전은 Ubuntu 14.04입니다.

  • 다음 명령을 사용하여 DNS를 식별하십시오.
    nm 도구 | grep DNS

이 결과 DNS : 192.168.1.1 내 경우

  • /etc/default/docker.io에 항목을 만듭니다. 내 현재 항목은 다음과 같습니다.
DOCKER_OPTS = "-dns 8.8.8.8 --dns 8.8.4.4 --dns 192.168.1.1"
  • Docker 서비스 다시 시작
 sudo 서비스 docker.io 다시 시작 

2
CentOS에 해당하는 /etc/sysconfig/docker파일은 DOCKER_OPTS="--dns 8.8.8.8"줄 을 추가하고 문제를 해결할 수 있는 파일 입니다.
MarkHu

OpenSuSE에도 /etc/sysconfig/docker파일이 있습니다.
데이비드 라카 토스

11

SystemD (Ubuntu 16, RHEL 7 ...)로 작동하는 Linux 배포의 경우 다음 명령을 사용하여 경로가 표시됩니다.

$ systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2016-06-29 08:10:33 PDT; 2min 34s ago
     Docs: https://docs.docker.com
 Main PID: 1169 (dockerd)
    Tasks: 19
   Memory: 85.0M
      CPU: 1.779s
   CGroup: /system.slice/docker.service
           ├─1169 /usr/bin/dockerd --dns 172.18.20.11 --dns 172.20.100.15 --dns 8.8.8.8 --dns 8.8.4.4 -H fd://
           └─1232 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim docker-containerd-shim --met

경로는입니다 /lib/systemd/system/docker.service. 데몬이 시작되는 줄에를 DOCKER_OPTS포함 할 수 있는 값을 추가합니다 --dns.

cat /lib/systemd/system/docker.service | grep dns 
ExecStart=/usr/bin/dockerd --dns 172.18.20.11 --dns 172.20.100.15 --dns 8.8.8.8 --dns 8.8.4.4  -H fd://

1
감사합니다! 편집 한 후에 docker.service나는 함께 고정 표시기 서비스를 중지했다 sudo service docker stop다음과 systemctl daemon-reload마지막sudo service docker start
카베 Ghahremani에게

1
/etc/systemd/system/docker.service.d시스템 버전을 변경하는 것보다 수정 된 구성 (systemd가 시스템 구성을 유용하게 병합 / 무시 함) 으로 단위 파일을 추가하는 것이 좋습니다. 후자는 업그레이드시 손실됩니다.
Raman

6

Mac 및 Windows의 Docker (최소> = 1.13, 아마도 이전 버전)를 사용하면 환경 설정-> 데몬-> 고급에서 DNS를 구성 할 수 있습니다.

다음 구성은 Google 공개 DNS 서버로 대체되는 두 개의 회사 DNS 서버 (여기에서 고유 한 값 사용)를 설정합니다.

Docker 데몬 고급 구성


5

Docker 데몬에 DNS를 지정합니다.

먼저 DNS 주소를 얻으십시오.

$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]:                             10.0.0.2

이 새로운 DNS를 강제하는 도커 컨테이너를 시작하여 문제가 실제로 DNS에 있는지 테스트하십시오.

$ docker run --dns 10.0.0.2 <image_name> <command_name>

이 방법으로 문제가 해결되면 다음과 같은 방법으로 모든 도커 데몬에이 수정 사항을 적용 할 수 있습니다.

/etc/docker/daemon.json 파일 편집 또는 생성

이 파일에 다음 줄을 추가하십시오.

{
"dns": ["10.0.0.2", "8.8.8.8"]
}

Docker 다시 시작

$ sudo service docker restart

이 모든 과정을 수행하기위한 아주 좋은 가이드는 여기에서 찾을 수 있습니다.

https://development.robinwinslow.uk/2016/06/23/fix-docker-networking-dns/


이것은 경계선 링크 전용 답변 입니다. 여기에 많은 정보를 포함하도록 답변을 확장하고 참조 용으로 만 링크를 사용해야합니다.
Goodbye StackExchange

당신은 스냅으로 설치 한 경우 daemon.json에있을 것입니다/var/snap/docker/<id>/config/daemon.json
sjt003

3

Docker 서비스를 다시 시작하지 않는 솔루션

at 빌드 타임 docker build을 재정 의하여 다른 호출에 영향을주지 않고 (Docker 서비스를 다시 시작 하지 않고) 단일 Docker 이미지에 대한 DNS 설정을 수정할 resolv.conf수 있습니다.

FROM ubuntu:18.04

RUN echo "nameserver 123.123.123.123" > /etc/resolv.conf && apt update

IP 123.123.123.123를 회사 네트워크 내에서 사용되는 IP 로 바꿉니다 ( nmcli dev show | grep 'IP4.DNS'현재 사용되는 DNS 서버를 가져 오는 데 사용).

단점 :

  • 이것은 Dockerfile의 다른 행에는 영향을주지 않습니다. 따라서 DNS 확인에 따라 달라지는 경우 수정 사항을 모든 줄에 접두사로 붙여야합니다.

1

내 Ubuntu 16.04 컴퓨터에서 때때로 Google의 DNS가 Docker 이미지를 빌드하는 데 작동하지 않습니다.

cat /etc/docker/daemon.json
{"dns": [""8.8.8.8"] }

다음 명령을 사용하여 내 서비스 공급자 DNS를 수동으로 찾아야합니다.

nmcli device show <interfacename> | grep IP4.DNS

125.22.47.102

daemon.json아래 에 표시된 대로 내 추가

cat /etc/docker/daemon.json 

{"dns": ["125.22.47.102","8.8.8.8"] }

 restart docker

sudo service docker restart

(PS nm-tool은 Ubuntu 15.04에서 더 이상 사용되지 않습니다.)

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