회사 네트워크에서 이미지를 빌드하는 동안 네트워크 호출이 실패 함
회사 네트워크에서 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 데몬에 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에서 더 이상 사용되지 않습니다.)
'developer tip' 카테고리의 다른 글
maven 오류 : org.junit 패키지가 없습니다. (0) | 2020.11.03 |
---|---|
단편-지정된 하위에 이미 상위가 있습니다. (0) | 2020.11.03 |
Retrofit 2를 통해 이미지를 업로드 할 때 진행률 표시 줄을 표시 할 수 있습니까? (0) | 2020.11.03 |
Bash를 사용하여 Linux에서 환경 변수 설정 (0) | 2020.11.03 |
Java에서 파일에 바이트 배열을 어떻게 쓸 수 있습니까? (0) | 2020.11.03 |