developer tip

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

copycodes 2020. 11. 3. 08:18
반응형

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


회사 네트워크에서 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>

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

Edit or create a file /etc/docker/daemon.json

Add the following line to this file

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

Restart docker

$ sudo service docker restart

A very nice guide for doing ALL this process can be found here.

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


Solution without restarting Docker service

It is possible to modify the DNS settings for a single Docker image without affecting other docker build calls (and without restarting the Docker service) by overriding the resolv.conf at build time:

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

내 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에서 더 이상 사용되지 않습니다.)

참고 URL : https://stackoverflow.com/questions/24151129/network-calls-fail-during-image-build-on-corporate-network

반응형