Không thể tải xuống hình ảnh Docker đằng sau một proxy


329

Tôi đã cài đặt Docker trên Ubuntu 13.10 (Saucy Salamander) và khi tôi gõ vào bảng điều khiển của mình:

sudo docker pull busybox

Tôi nhận được lỗi sau đây:

Pulling repository busybox
2014/04/16 09:37:07 Get https://index.docker.io/v1/repositories/busybox/images: dial tcp: lookup index.docker.io on 127.0.1.1:53: no answer from server

Phiên bản Docker:

$ sudo docker version

Client version: 0.10.0
Client API version: 1.10
Go version (client): go1.2.1
Git commit (client): dc9c28f
Server version: 0.10.0
Server API version: 1.10
Git commit (server): dc9c28f
Go version (server): go1.2.1
Last stable version: 0.10.0

Tôi đứng sau một máy chủ proxy không có xác thực và đây là /etc/apt/apt.conftệp của tôi :

Acquire::http::proxy "http://192.168.1.1:3128/";
Acquire::https::proxy "https://192.168.1.1:3128/";
Acquire::ftp::proxy "ftp://192.168.1.1:3128/";
Acquire::socks::proxy "socks://192.168.1.1:3128/";

Tôi đang làm gì sai?


6
Đối với người dùng Windows và boot2docker, hãy xem stackoverflow.com/a/29303930/6309
VonC

1
Một chi tiết nhỏ: apt hoàn toàn không hỗ trợ proxy SOCKS. Acquire::socks::proxycó nghĩa là đặt proxy cho tất cả các URL bắt đầu bằng một sockslược đồ. Vì bạn sources.listkhông có bất kỳ socks://URL nào , dòng đó hoàn toàn bị bỏ qua.
Hans-Christoph Steiner

Thế còn docker-compose?
Mohammad Masoumi

Câu trả lời:


795

Đây là liên kết đến tài liệu Docker chính thức cho proxy HTTP: https://docs.docker.com/config/daemon/systemd/#httphttps-proxy

Một phác thảo nhanh:

Đầu tiên, tạo thư mục thả vào systemd cho dịch vụ Docker:

mkdir /etc/systemd/system/docker.service.d

Bây giờ tạo một tệp có tên là /etc/systemd/system/docker.service.d/http-proxy.confthêm HTTP_PROXYbiến môi trường:

[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/"

Nếu bạn có các đăng ký Docker nội bộ mà bạn cần liên hệ mà không cần ủy quyền, bạn có thể chỉ định chúng thông qua NO_PROXYbiến môi trường:

Environment="HTTP_PROXY=http://proxy.example.com:80/"
Environment="NO_PROXY=localhost,127.0.0.0/8,docker-registry.somecorporation.com"

Thay đổi tuôn ra:

$ sudo systemctl daemon-reload

Xác minh rằng cấu hình đã được tải:

$ sudo systemctl show --property Environment docker
Environment=HTTP_PROXY=http://proxy.example.com:80/

Khởi động lại Docker:

$ sudo systemctl restart docker

3
Điều này hoạt động cho Debian Jessie chạy Docker 1.6.2. Bằng cách nào đó chỉnh sửa /etc/default/dockerkhông hoạt động. Có lẽ tôi nên xóa exportnhư tài liệu dành cho Centos.
thần kinh

2
Đối với chỉnh sửa SysV cũ hơn / etc / sysconfig / docker như trong docs.oracle.com/cd/E37670_01/E37355/html/ trộm - Oracle Linux 6.7
SidJ

2
NB: Tôi đã giả định rằng 'daemon-tải lại' sẽ đủ để áp dụng các thay đổi cho docker, nhưng thực sự sudo systemctl restart dockerlà bắt buộc để nó hoạt động.
Jose Alban

4
Đối với Ubuntu 14.04, hãy tham khảo câu trả lời của @ n3o, systemctl vì không có sẵn cho ubfox 14.04, nên nó sử dụng upstartđể cung cấp các dịch vụ.
chinmay

4
Bây giờ nó đang trả về "Yêu cầu xác thực proxy" ... làm cách nào để định cấu hình tên người dùng và mật khẩu?
pinei

88

Cài đặt proxy APT của bạn không liên quan đến Docker.

Docker sử dụng biến môi trường HTTP_PROXY, nếu có. Ví dụ:

sudo HTTP_PROXY=http://192.168.1.1:3128/ docker pull busybox

Nhưng thay vào đó, tôi khuyên bạn nên xem /etc/default/dockertệp cấu hình của mình : bạn nên có một dòng để bỏ ghi chú (và có thể điều chỉnh) để cài đặt proxy của bạn được áp dụng tự động. Sau đó khởi động lại máy chủ Docker:

service docker restart

8
Trong trường hợp của tôi / etc / default / docker chứa ví dụ hạ cấp (http_proxy), nhưng để mọi thứ hoạt động, tôi đã phải thêm cài đặt cấp trên (HTTP_PROXY) ở đó.
Mekk 17/03/2015

bạn không nên đặt HTTP_PROXY cho ứng dụng khách
docker

3
Không hoạt động với docker 1.9.1, thay vào đó hãy xem câu trả lời dưới đây
Peter Dotchev 8/12/2015

1
Điều này hoạt động cho Ubuntu 14.04 khi cài đặt docker từ apt.dockerproject.org.
Michael Kopp

1
Điều này không hoạt động trên Debian 8.8 và bạn cần đặt http_proxy trong /etc/systemd/system/docker.service.d như được hiển thị trong câu trả lời được chấp nhận
Roman Mik

60

Trên CentOS, tệp cấu hình cho Docker là:

/etc/sysconfig/docker

Thêm dòng dưới đây đã giúp tôi có được trình nền Docker hoạt động phía sau máy chủ proxy:

HTTP_PROXY="http://<proxy_host>:<proxy_port>"
HTTPS_PROXY="http://<proxy_host>:<proxy_port>"

7
xuất HTTP_PROXY = "http: // <tên người dùng>: <password> @ <proxy_host>: <proxy_port>" cho những người đứng sau proxy của công ty
Nicolas Mommaerts

Đối với tôi điều này chỉ làm việc mà không có export. Bạn có chắc chắn điều này là chính xác?
frans

4
Đối với tôi exportchỉ hoạt động trên CentOS6 và w / o trên CentOS7
user2363318

1
Trên Centos7 tôi cũng không được sử dụng xuất khẩu
Banjocat

2
export HTTP_PROXY=...là một Bashism, đối với các shell không phải Bash (chẳng hạn như / bin / sh có thể là gì), sử dụng hai dòng HTTP_PROXY=...và sau đó export HTTP_PROXY Điều đó nói rằng, tôi không cần exportgì cả.
Cameron Kerr

42

Nếu bạn đang sử dụng Docker mới cho Mac (hoặc Docker cho Windows ), chỉ cần nhấp chuột phải vào biểu tượng khay Docker và chọn Tùy chọn (Windows: Cài đặt), sau đó đi tới Nâng cao và bên dưới Proxy xác định cài đặt proxy của bạn ở đó. Nhấp vào Áp dụng và Khởi động lại và đợi cho đến khi Docker khởi động lại.


Trong trường hợp ai đó sử dụng proxy bị ràng buộc cục bộ (ví dụ: 127.0.0.1:8787 ) trên macOS như tôi, đây là hướng dẫn thiết lập chi tiết hơn: Tại sao proxy bị ràng buộc cục bộ không hoạt động
Rockallite

Tôi đã đặt proxy của mình qua windows: cài đặt nhưng các proxy này không được truyền tới container của tôi stackoverflow.com/questions/48272933/
Kẻ

Đối với tôi, tôi chỉ cần đặt DNS Server của mình và nó đã hoạt động. Cảm ơn.
richin

32

Trên Ubuntu, bạn cần đặt http_proxy cho daemon Docker, không phải quá trình máy khách. Điều này được thực hiện trong /etc/default/docker(xem tại đây ).


nó nói rằng tôi không có quyền truy cập vào nhóm của bạn. Trong liên kết.
Azizbro

Tôi không nghĩ rằng điều này hoạt động cho Ubuntu 18.04 trở lên.
zslim

27

Để mở rộng câu trả lời của Arun , để điều này hoạt động trong CentOS 7, tôi đã phải xóa các lệnh "xuất". Vì vậy, chỉnh sửa

/etc/sysconfig/docker

Và thêm:

HTTP_PROXY="http://<proxy_host>:<proxy_port>"
HTTPS_PROXY="https://<proxy_host>:<proxy_port>"
http_proxy="${HTTP_PROXY}"
https_proxy="${HTTPS_PROXY}"

Sau đó khởi động lại Docker:

sudo service docker restart

Các nguồn là bài viết trên blog này .


2
Chỉ HTTP_PROXY là bắt buộc (được thử nghiệm trên Fedora 20).
sheldonh

Hoàn hảo cho Suse 12!
Dean Meehan

14

Tại sao proxy bị ràng buộc cục bộ không hoạt động

Vấn đề

Nếu bạn đang chạy proxy bị ràng buộc cục bộ , ví dụ như nghe 127.0.0.1:8989, thì nó KHÔNG LÀM VIỆC trong Docker cho Mac . Từ tài liệu Docker :

Tôi muốn kết nối từ một container đến một dịch vụ trên máy chủ

Mac có địa chỉ IP thay đổi (hoặc không có nếu bạn không có quyền truy cập mạng). Khuyến nghị hiện tại của chúng tôi là đính kèm một IP không sử dụng vào lo0giao diện trên máy Mac; ví dụ : sudo ifconfig lo0 alias 10.200.10.1/24, và đảm bảo rằng dịch vụ của bạn đang lắng nghe địa chỉ này hoặc 0.0.0.0(tức là không 127.0.0.1). Sau đó, container có thể kết nối với địa chỉ này.

Tương tự là cho phía máy chủ Docker. (Để hiểu phía máy chủ và phía máy khách của Docker, hãy thử chạy docker version.) Và phía máy chủ chạy trên lớp ảo hóa có lớp riêng localhost. Do đó, nó sẽ không kết nối với máy chủ proxy trên localhosthệ điều hành máy chủ.

Giải pháp

Vì vậy, nếu bạn đang sử dụng proxy bị ràng buộc cục bộ như tôi, về cơ bản, bạn sẽ phải thực hiện những điều sau đây để làm cho nó hoạt động với Docker cho Mac:

  1. Làm cho máy chủ proxy của bạn lắng nghe 0.0.0.0thay vì 127.0.0.1. Chú ý: bạn sẽ cần cấu hình tường lửa phù hợp để ngăn chặn truy cập độc hại vào nó.

  2. Thêm bí danh loopback vào lo0giao diện, ví dụ 10.200.10.1/24:

    sudo ifconfig lo0 alias 10.200.10.1/24
    
  3. Đặt proxy HTTP và / hoặc HTTPS 10.200.10.1:8989từ Tùy chọn trong menu khay Docker (giả sử rằng máy chủ proxy đang lắng nghe trên cổng 8989).

Sau đó, kiểm tra cài đặt proxy bằng cách chạy lệnh trong vùng chứa mới từ hình ảnh không được tải xuống:

$ docker rmi -f hello-world
  ...

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world

c04b14da8d14: Pull complete 
Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9
Status: Downloaded newer image for hello-world:latest
  ...

Lưu ý: bí danh loopback được đặt bởiifconfigkhông bảo toàn sau khi khởi động lại. Để làm cho nó bền bỉ là một chủ đề khác. Vui lòng kiểm tra bài đăng trên blog này bằng tiếng Nhật (Google Dịch có thể giúp đỡ).


Cảm ơn vì điều này, tôi đã cố gắng tìm giải pháp cho năm ngoái hoặc lâu hơn để có được SquidMan trên Mac khi cố gắng truy cập cả công việc và mạng bên ngoài thông qua proxy của công ty. Tôi đã có được điều này để khắc phục bằng cách nối nó vào launchd để được cấu hình khi khởi động. developer.apple.com/l
Proctor

Cảm ơn người đàn ông. Cuối cùng tôi đã tìm thấy bài viết của bạn! Nó hoạt động. Nếu bạn đang sử dụng cntlm, đừng quên thêm ràng buộc 0.0.0.0 vào cấu hình của bạn. ví dụ: Nghe 0.0.0.0: 8989
Felix

Tôi cũng đang sử dụng cntlm và thay đổi nó sang chế độ cổng
Lee Gary

10

Đây là bản sửa lỗi phù hợp với tôi: Ubuntu, phiên bản Docker: 1.6.2

Trong tệp /etc/default/docker, thêm dòng:

export http_proxy='http://<host>:<port>'

Khởi động lại Docker

sudo service docker restart

Hoạt động trên Docker v1.12.1 trên Ubuntu 14.04 và Mint 17.3
wmarbut

1
Hoạt động cho 14.04.4 + Docker phiên bản 17.03.1-ce, xây dựng c6d412e
okwap

8

Để định cấu hình Docker hoạt động với proxy, bạn cần thêm biến môi trường HTTPS_PROXY / HTTP_PROXY vào tệp sysconfig Docker ( /etc/sysconfig/docker).

Tùy thuộc vào việc bạn sử dụng init.dhay công cụ dịch vụ, bạn cần thêm câu lệnh "xuất" (do nhật ký báo cáo Lỗi Debian - # 767441. Ví dụ trong / etc / default / docker bị sai lệch về cú pháp được hỗ trợ ):

HTTPS_PROXY="https://<user>:<password>@<proxy-host>:<proxy-port>"
HTTP_PROXY="https://<user>:<password>@<proxy-host>:<proxy-port>"
export HTTP_PROXY="https://<user>:<password>@<proxy-host>:<proxy-port>"
export HTTPS_PROXY="https://<user>:<password>@<proxy-host>:<proxy-port>"

Kho chứa Docker (Docker Hub) chỉ hỗ trợ HTTPS. Để Docker hoạt động với proxy chặn SSL, bạn phải thêm chứng chỉ gốc proxy vào cửa hàng ủy thác hệ thống.

Đối với CentOS, sao chép tệp vào /etc/pki/ca-trust/source/anchors/và cập nhật kho ủy thác CA và khởi động lại dịch vụ Docker.

Nếu proxy của bạn sử dụng xác thực NTLMv2 - bạn cần sử dụng các proxy trung gian như Cntlm để kết nối xác thực. Bài đăng blog này giải thích chi tiết .


5

Trong phiên bản mới của Docker, docker-engine , trong bản phân phối dựa trên systemd , bạn nên thêm dòng biến môi trường vào /lib/systemd/system/docker.service , như được đề cập bởi những người khác:

Environment="HTTP_PROXY=http://hostname_or_ip:port/"

Điều này là cần thiết trên RHEL7.
dbalakirev

thêm dòng vào phần [Dịch vụ]
volkit

5

Sau khi cài đặt Docker, hãy làm như sau:

[mdesales@pppdc9prd1vq ~]$ sudo HTTP_PROXY=http://proxy02.ie.xyz.net:80 ./docker -d &
[2] 20880

Sau đó, bạn có thể kéo hoặc làm bất cứ điều gì:

mdesales@pppdc9prd1vq ~]$ sudo docker pull base
2014/04/11 00:46:02 POST /v1.10/images/create?fromImage=base&tag=
[/var/lib/docker|aa088847] +job pull(base, )
Pulling repository base
b750fe79269d: Download complete
27cf78414709: Download complete
[/var/lib/docker|aa088847] -job pull(base, ) = OK (0)

3

Vì tôi chưa được phép bình luận:

Đối với CentOS 7, tôi cần kích hoạt Môi trường trong "docker.service" giống như được mô tả ở đây: Điều khiển và định cấu hình Docker với systemd .

Chỉnh sửa: Tôi đang thêm giải pháp của mình như được nêu ra bởi Nilesh. Tôi cần mở "/etc/systemd/system/docker.service" và tôi phải thêm vào trong phần

[Dịch vụ]

Môi trườngFile = - / etc / sysconfig / docker

Chỉ sau đó, tập tin "etc / sysconfig / docker" được tải trên hệ thống của tôi.


3

Để giải quyết vấn đề với cuộn tròn trong bản dựng Docker, tôi đã thêm vào phần bên trong Dockerfile:

ENV http_proxy=http://infoprx2:8080
ENV https_proxy=http://infoprx2:8080
RUN apt-get update && apt-get install -y curl vim

Lưu ý rằng câu lệnh ENV TRƯỚC KHI câu lệnh RUN.

Và để làm cho Docker daemon có thể truy cập Internet (tôi sử dụng Kitistic với boot2docker), tôi đã thêm vào như sau /var/lib/boot2docker/profile:

export HTTP_PROXY=http://infoprx2:8080
export HTTPS_PROXY=http://infoprx2:8080

Sau đó, tôi khởi động lại Docker với sudo /etc/init.d/docker restart.


3

Nếu sử dụng proxy vớ5, đây là thử nghiệm của tôi với Docker 17.03.1-ce với cài đặt "all_proxy" và nó đã hoạt động:

# Set up socks5 proxy server
ssh sshUser@proxyServer -C -N -g -D \
     proxyServerIp:9999 \
     -o ExitOnForwardFailure=yes \
     -o ServerAliveInterval=60

# Configure dockerd and restart.
# NOTICE: using "all_proxy"
mkdir -p /etc/systemd/system/docker.service.d
cat > /etc/systemd/system/docker.service.d/http-proxy.conf <<EOF
[Service]
Environment="all_proxy=socks5://proxyServerIp:9999"
Environment="NO_PROXY=localhost,127.0.0.1,private.docker.registry.com"
EOF

systemctl daemon-reload
systemctl restart docker

# Test whether can pull images
docker run -it --rm alpine:3.5

3

Giải pháp hoàn chỉnh cho Windows, để định cấu hình cài đặt proxy.

< user>:< password>@< proxy-host>:< proxy-port>

Bạn có thể định cấu hình trực tiếp bằng cách nhấp chuột phải vào cài đặt, trong biểu tượng Docker và sau đó là Proxy.

Ở đó bạn có thể cấu hình địa chỉ proxy, cổng, tên người dùng và mật khẩu.

Trong định dạng này:

< user>:< password>@< proxy-host>:< proxy-port>

Thí dụ:

"geronimous:mypassword@192.168.44.55:8080"

Không có gì hơn thế này.


2

Đơn giản chỉ cần đặt các biến môi trường proxy không giúp tôi trong phiên bản 1.0.1 ... Tôi đã phải cập nhật /etc/default/docker.iotệp với giá trị chính xác cho biến "http_proxy".


2

Nếu bạn đang ở trong Ubuntu, hãy thực thi các lệnh này để thêm proxy của bạn.

sudo nano /etc/default/docker

Và bỏ ghi chú các dòng chỉ định

#export http_proxy = http://username:password@10.0.1.150:8050

Và thay thế nó bằng máy chủ proxy và tên người dùng thích hợp của bạn.

Sau đó khởi động lại Docker bằng cách sử dụng:

service docker restart

Bây giờ bạn có thể chạy các lệnh Docker phía sau proxy:

docker search ubuntu

2

Có lẽ bạn cần thiết lập các biến chữ thường. Trong trường hợp của tôi, tệp /etc/systemd/system/docker.service.d/http-proxy.conf của nó trông như thế này:

[Service]
Environment="ftp_proxy=http://<user>:<password>@<proxy_ip>:<proxy_port>/"
Environment="http_proxy=http://<user>:<password>@<proxy_ip>:<proxy_port>/"
Environment="https_proxy=http://<user>:<password>@<proxy_ip>:<proxy_port>/"

Chúc may mắn! :)


2

Tôi cũng đã phải đối mặt với vấn đề tương tự đằng sau một tường lửa. Thực hiện theo các bước dưới đây:

$ sudo vim /etc/systemd/system/docker.service.d/http_proxy.conf
[Service]
Environment="HTTP_PROXY=http://username:password@IP:port/"

Không sử dụng hoặc xóa tệp https_prxoy.conf.

Tải lại và khởi động lại Docker container của bạn:

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
$ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:2557*********************************8
Status: Downloaded newer image for hello-world:latest

1

Nếu bạn đang dùng Ubuntu, bạn nên thực hiện lệnh này:

export https_proxy=http://your_name:password@ip_proxy:port docker 

Và tải lại Docker với:

service docker.io restart

Hoặc đi /etc/docker.iovới nano ...


1

Trên Ubuntu 14.04 (Trusty Tahr) với Docker 1.9.1, tôi chỉ cần bỏ http_proxydòng, cập nhật giá trị và sau đó khởi động lại dịch vụ Docker.

export http_proxy="http://proxy.server.com:80"

và sau đó

service docker restart

0

Trên RHEL6.6 chỉ có điều này hoạt động (lưu ý việc sử dụng export ):

/ etc / sysconfig / docker

export http_proxy="http://myproxy.example.com:8080"
export https_proxy="http://myproxy.example.com:8080"

LƯU Ý: Cả hai đều có thể sử dụng http giao thức.)

Cảm ơn https://crondev.com/rasty-docker-behind-proxy/


0

Trong mạng của tôi, Ubuntu hoạt động đằng sau một máy chủ proxy của công ty. Và nó yêu cầu xác thực. Tôi đã thử tất cả các giải pháp được đề cập ở trên và không có gì giúp được. Điều thực sự hữu ích là viết một dòng proxy trong tệp/etc/systemd/system/docker.service.d/https-proxy.conf không có tên miền.

Thay vì

Environment="HTTP_PROXY=http://user@domain:password@proxy:8080"

hoặc là

Environment="HTTP_PROXY=http://domain\user:password@proxy:8080"

và một số thay thế khác như @ -> %40hoặc \ -> \\tôi đã cố gắng sử dụng

Environment="HTTP_PROXY=http://user:password@proxy:8080"

Và nó hoạt động ngay bây giờ.



0

Điều này không trả lời chính xác câu hỏi, nhưng có thể hữu ích, đặc biệt nếu bạn không muốn xử lý các tệp dịch vụ.

Trong trường hợp bạn là người đang lưu trữ hình ảnh, một cách là chuyển đổi hình ảnh dưới dạng lưu trữ tar thay vào đó, sử dụng một cái gì đó như sau tại máy chủ .

docker save <image-name> --output <archive-name>.tar

Đơn giản chỉ cần tải về kho lưu trữ và biến nó trở lại thành một hình ảnh.

docker load <archive-name>.tar
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.