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

회사 네트워크에서 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 컨테이너를 빌드 할 때이 이상한 동작이 발생하는 이유를 아는 사람이 있습니까?



답변

문제를 파악할 수있었습니다. 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> &


답변

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 구성 수정


답변

다음 단계는 나를 위해 작동합니다 (도커 빌드 및 도커 실행 명령 모두). 내 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 다시 시작 


답변

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://


답변

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

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

Docker 데몬 고급 구성


답변

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/


답변

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 확인에 따라 달라지는 경우 수정 사항을 모든 줄에 접두사로 붙여야합니다.