Cuộc gọi mạng không thành công trong quá trình xây dựng hình ảnh trên mạng công ty


81

Tôi đang gặp sự cố khi xây dựng hình ảnh Docker trên mạng công ty của mình. Tôi chỉ mới bắt đầu với Docker, vì vậy tôi có Dockerfile sau cho ứng dụng loại hello-world:

# 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"]

Điều này hoạt động tốt khi tôi xây dựng nó trên máy tính xách tay ở nhà, trên mạng không dây của riêng tôi. Nó kéo xuống các phụ thuộc cần thiết và xây dựng hình ảnh một cách chính xác.

Tuy nhiên, khi tôi đang ở trên mạng công ty của mình tại nơi làm việc, bản dựng docker tương tự này không thành công khi cố gắng kéo RPM xuống từ download.fedoraproject.org, với thông báo lỗi sau:

Bước 2: RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm ---> Chạy trong e0c26afe9ed5 curl: (5) Couldn’t ' t giải quyết lỗi proxy 'some.proxy.address': bỏ qua http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm - chuyển không thành công

Trên mạng công ty của tôi, tôi có thể truy cập URL đó từ máy tính xách tay của mình. Nhưng một khi Docker đang cố gắng xây dựng vùng chứa, đột nhiên nó không thể giải quyết được. Hành vi này giống nhau đối với nhiều loại tài nguyên bên ngoài (apt-get, v.v.): Tất cả chúng đều có thể giải quyết tốt trên máy tính xách tay của tôi trên mạng công ty, nhưng Docker không thể giải quyết chúng.

Tôi không có mạng lưới bí quyết để tìm ra những gì đang xảy ra ở đây. Có ai biết tại sao hành vi kỳ lạ này sẽ xảy ra khi xây dựng vùng chứa Docker không?


hãy nhìn vào stackoverflow.com/questions/19210563/... nó cũng có thể giải quyết vấn đề của bạn
Thomasleveil

cùng một vấn đề xảy ra với tôi. Tôi đã quên chạy apt-get update.
matthiasbe

Đây có thể là các triệu chứng của "Docker không nhận thông tin DNS từ Cisco AnyConnect" forum.docker.com/t/…
Jason

Câu trả lời:


92

Tôi đã có thể tìm ra vấn đề. Trên Ubuntu, Docker đặt máy chủ DNS cho vùng chứa thành máy chủ của Google tại 8.8.8.x. Theo tôi hiểu, đây là một giải pháp thay thế trên Ubuntu do Ubuntu đặt /etc/resolv.conf là 127.0.0.1.

Các máy chủ Google đó không thể truy cập được từ phía sau tường lửa của chúng tôi, đó là lý do tại sao chúng tôi không thể giải quyết bất kỳ URL nào.

Cách khắc phục là cho Docker biết máy chủ DNS nào sẽ sử dụng. Bản sửa lỗi này phụ thuộc vào cách bạn cài đặt Docker:

Gói Ubuntu

Nếu bạn đã cài đặt gói Ubuntu, hãy chỉnh sửa / etc / default / docker và thêm dòng sau:

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

Bạn có thể thêm bao nhiêu máy chủ DNS tùy thích vào cấu hình này. Khi bạn đã chỉnh sửa tệp này, bạn sẽ muốn khởi động lại dịch vụ Docker của mình:

sudo service docker restart

Binaries

Nếu bạn đã cài đặt Docker qua phương thức nhị phân (nghĩa là không có gói), thì bạn đặt máy chủ DNS khi khởi động daemon Docker:

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

4
còn việc sử dụng lệnh 'docker build' với Dockfiles thì sao ... có vẻ như nó không hoạt động trong những trường hợp đó: docker --dns = 209.18.47.61 build. 2> & 1 | tee ./output.txt
Quasaur

2
vâng, điều này sẽ hoạt động với bản dựng docker. Docker xây dựng không có --dns cờ trên lệnh riêng của mình, nhưng nếu bạn đặt nó trên daemon như thế này thì nó sẽ được áp dụng khi sử dụng Docker xây dựng
dsw88

Cảm ơn bạn cho giải pháp này. Về phía tôi, vấn đề là, docker đó dường như cần IPv4 để có sẵn và được kích hoạt. WTF? Tìm hiểu: IPv4 đã chết. Phần mềm chỉ là IPv4 bị hỏng nghiêm trọng.
Tino

1
Tôi đã thực hiện xong bước này và bắt đầu gặp lại lỗi. Khởi động lại dịch vụ đã khắc phục sự cố một lần nữa.
Andrew Grothe

Tôi gặp vấn đề này với Docker 1,7 mặc dù tôi đã cố gắng để chạy nó hoặc với --dnstùy chọn hoặc đặt cấu hình trong/etc/default/docker
Patryk

64

Tôi khuyên bạn nên thay đổi cài đặt DNS của daemon Docker. Bạn có thể đặt các tùy chọn mặc định cho daemon docker bằng cách tạo tệp cấu hình daemon tại /etc/docker/daemon.json . Đặt máy chủ DNS theo máy chủ của bạn, ví dụ: máy chủ DNS của tôi là 10.0.0.2:

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

Sau đó, bạn chỉ cần khởi động lại dịch vụ docker:

sudo service docker restart

Giải thích từng bước có sẵn tại đây Khắc phục cấu hình DNS mạng của Docker


19

Các bước sau phù hợp với tôi (cho cả lệnh xây dựng docker và lệnh chạy docker). Phiên bản linux của tôi là Ubuntu 14.04.

  • Xác định DNS bằng lệnh sau.
    công cụ nm | grep DNS

Kết quả này là DNS: 192.168.1.1 trong trường hợp của tôi

  • Tạo mục nhập trong /etc/default/docker.io. Mục hiện tại của tôi trông như thế này
DOCKER_OPTS = "- dns 8.8.8.8 --dns 8.8.4.4 --dns 192.168.1.1"
  • Khởi động lại dịch vụ docker
 khởi động lại dịch vụ sudo docker.io 

1
Tương đương CentOS là /etc/sysconfig/dockertệp mà tôi có thể thêm DOCKER_OPTS="--dns 8.8.8.8"dòng và giải quyết vấn đề của mình.
MarkHu

11

Đối với bất kỳ bản phân phối Linux nào hoạt động với SystemD (Ubuntu 16, RHEL 7 ...), đường dẫn sẽ được hiển thị bằng lệnh sau:

$ 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

Con đường sẽ là /lib/systemd/system/docker.service. Thêm các DOCKER_OPTSgiá trị, có thể có bất kỳ giá trị nào --dnstrong dòng bắt đầu trình nền.

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
Cảm ơn bạn! Sau khi chỉnh sửa docker.servicetôi phải dừng dịch vụ Docker với sudo service docker stopvà sau đó systemctl daemon-reloadvà cuối cùngsudo service docker start
Kaveh Ghahremani

1
Bạn nên thêm một tệp đơn vị vào /etc/systemd/system/docker.service.dvới cấu hình đã sửa đổi (hệ thống sẽ hợp nhất / ghi đè cấu hình hệ thống một cách hữu ích) hơn là thay đổi phiên bản hệ thống. Cái sau sẽ bị mất khi nâng cấp.
Raman

6

Docker (ít nhất> = 1.13, có thể sớm hơn) trên Mac và Windows cho phép bạn định cấu hình DNS trong Tùy chọn -> Daemon -> Nâng cao:

Cấu hình sau đặt hai máy chủ DNS công ty (sử dụng các giá trị của riêng bạn tại đây) với các máy chủ DNS công cộng của Google.

Cấu hình Docker Daemon Adv


5

Chỉ định DNS của bạn cho daemon Docker.

Trước hết, hãy lấy địa chỉ DNS của bạn

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

Kiểm tra xem sự cố có thực sự xảy ra với DNS hay không bằng cách khởi chạy vùng chứa docker buộc DNS mới này

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

Nếu điều này giải quyết được sự cố, bạn có thể áp dụng bản sửa lỗi này cho tất cả các trình nền docker theo cách sau

Chỉnh sửa hoặc tạo tệp /etc/docker/daemon.json

Thêm dòng sau vào tệp này

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

Khởi động lại docker

$ sudo service docker restart

Bạn có thể tìm thấy một hướng dẫn rất hay để thực hiện TẤT CẢ quy trình này tại đây.

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


Đây là một câu trả lời chỉ liên kết đường biên . Bạn nên mở rộng câu trả lời của mình để bao gồm càng nhiều thông tin ở đây và chỉ sử dụng liên kết để tham khảo.
Tạm biệt StackExchange

nếu bạn cài đặt bằng snap daemon.jsonsẽ vào lúc/var/snap/docker/<id>/config/daemon.json
sjt003

3

Giải pháp mà không cần khởi động lại dịch vụ Docker

Có thể sửa đổi cài đặt DNS cho một hình ảnh Docker mà không ảnh hưởng đến các docker buildlệnh gọi khác (và không cần khởi động lại dịch vụ Docker) bằng cách ghi đè resolv.conftại thời điểm xây dựng:

FROM ubuntu:18.04

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

Thay thế IP 123.123.123.123bằng IP được sử dụng trong mạng công ty của bạn (sử dụng nmcli dev show | grep 'IP4.DNS'để lấy máy chủ DNS hiện đang được sử dụng).

Nhược điểm:

  • Điều này không ảnh hưởng đến bất kỳ dòng nào khác từ Dockerfile. Do đó, bạn phải thêm tiền tố vào mỗi dòng với bản sửa lỗi, nếu nó phụ thuộc vào độ phân giải DNS

1

Trên máy Ubuntu 16.04 của tôi, đôi khi, DNS của Google không hoạt động để tạo hình ảnh Docker.

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

Tôi phải tự tìm ra DNS của nhà cung cấp dịch vụ của mình bằng lệnh sau

nmcli device show <interfacename> | grep IP4.DNS

125.22.47.102

và thêm nó vào của tôi daemon.jsonnhư hiển thị bên dưới

cat /etc/docker/daemon.json 

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

 restart docker

sudo service docker restart

(PS nm-tool không được chấp nhận trên Ubuntu 15.04)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.