Tidak dapat mengunduh gambar Docker di belakang proxy

330

Saya menginstal Docker di Ubuntu 13.10 (Saucy Salamander) dan ketika saya mengetikkan konsol saya:

sudo docker pull busybox

Saya mendapatkan kesalahan berikut:

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

Versi buruh pelabuhan:

$ 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

Saya berada di belakang server proxy tanpa otentikasi, dan ini /etc/apt/apt.conffile saya :

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/";

Apa yang saya lakukan salah?

rpayanm
sumber
6
Untuk pengguna Windows dan boot2docker, lihat stackoverflow.com/a/29303930/6309
VonC
1
Satu detail kecil: apt sama sekali tidak mendukung proxy SOCKS. Acquire::socks::proxyberarti mengatur proxy untuk semua URL yang dimulai dengan socksskema. Karena Anda sources.listtidak memiliki socks://URL apa pun , baris itu sepenuhnya diabaikan.
Hans-Christoph Steiner
Bagaimana dengan docker-compose?
Mohammad Masoumi

Jawaban:

797

Berikut ini tautan ke dokumentasi Docker resmi untuk proxy HTTP: https://docs.docker.com/config/daemon/systemd/#httphttps-proxy

Garis besar cepat:

Pertama, buat direktori drop-in systemd untuk layanan Docker:

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

Sekarang buat file bernama /etc/systemd/system/docker.service.d/http-proxy.confyang menambahkan HTTP_PROXYvariabel lingkungan:

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

Jika Anda memiliki pendaftar Docker internal yang perlu Anda hubungi tanpa proxy, Anda dapat menentukannya melalui NO_PROXYvariabel lingkungan:

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

Perubahan flush:

$ sudo systemctl daemon-reload

Verifikasi bahwa konfigurasi telah dimuat:

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

Mulai Ulang Docker:

$ sudo systemctl restart docker
Alexandre Mélard
sumber
3
Ini berfungsi untuk Debian Jessie yang menjalankan Docker 1.6.2. Entah bagaimana pengeditan /etc/default/dockertidak berfungsi. Mungkin saya harus menghapus exportseperti yang didokumentasikan untuk Centos.
neurite
2
Untuk edit SysV yang lebih lama / etc / sysconfig / docker seperti pada docs.oracle.com/cd/E37670_01/E37355/html/… - Oracle Linux 6.7
SidJ
2
NB: Saya berasumsi bahwa 'daemon-reload' akan cukup untuk menerapkan perubahan pada buruh pelabuhan, tetapi sebenarnya sudo systemctl restart dockersangat diperlukan untuk itu untuk bekerja.
Jose Alban
4
Untuk jawaban ubuntu 14.04 merujuk pada @ n3o, Karena systemctl tidak tersedia untuk ubuntu 14.04, ia digunakan upstartuntuk membuka layanan.
chinmay
4
Sekarang mengembalikan "Diperlukan Otentikasi Proksi" ... cara mengonfigurasi nama pengguna dan kata sandi?
pinei
88

Pengaturan proxy APT Anda tidak terkait dengan Docker.

Docker menggunakan variabel lingkungan HTTP_PROXY, jika ada. Sebagai contoh:

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

Tetapi sebagai gantinya, saya sarankan Anda melihat /etc/default/dockerfile konfigurasi Anda: Anda harus memiliki baris ke tanda komentar (dan mungkin menyesuaikan) untuk menerapkan pengaturan proxy Anda secara otomatis. Kemudian restart server Docker:

service docker restart
mbarthelemy
sumber
8
Dalam kasus saya / etc / default / docker terdapat contoh dengan huruf kecil (http_proxy), tetapi agar semuanya berfungsi, saya harus menambahkan pengaturan huruf besar (HTTP_PROXY) di sana.
Mekk
Anda tidak seharusnya mengatur HTTP_PROXY untuk klien buruh pelabuhan
thomas.han
3
Tidak bekerja dengan buruh pelabuhan 1.9.1, tetapi lihat jawaban ini di bawah
Peter Dotchev
1
Ini berfungsi untuk Ubuntu 14.04 ketika menginstal docker dari apt.dockerproject.org.
Michael Kopp
1
Ini tidak berfungsi pada Debian 8.8, dan Anda perlu mengatur http_proxy di /etc/systemd/system/docker.service.d seperti yang ditunjukkan dalam jawaban yang diterima
Roman Mik
60

Pada CentOS file konfigurasi untuk Docker ada di:

/etc/sysconfig/docker

Menambahkan baris di bawah ini membantu saya membuat daemon Docker bekerja di belakang server proxy:

HTTP_PROXY="http://<proxy_host>:<proxy_port>"
HTTPS_PROXY="http://<proxy_host>:<proxy_port>"
Arun Y
sumber
7
export HTTP_PROXY = "http: // <username>: <password> @ <proxy_host>: <proxy_port>" untuk mereka yang berada di belakang proxy perusahaan
Nicolas Mommaerts
bagi saya ini HANYA bekerja tanpa export. Apakah Anda yakin ini benar?
frans
4
Bagi saya exporthanya bekerja pada CentOS6 dan tanpa kerja pada CentOS7
user2363318
1
Pada Centos7 saya juga harus tidak menggunakan ekspor
Banjocat
2
export HTTP_PROXY=...adalah Bashism, untuk cangkang non-Bash (seperti apa / bin / sh), gunakan dua baris HTTP_PROXY=...dan kemudian export HTTP_PROXY dikatakan, saya tidak membutuhkannya exportsama sekali.
Cameron Kerr
42

Jika Anda menggunakan Docker baru untuk Mac (atau Docker untuk Windows ), cukup klik kanan ikon Docker tray dan pilih Preferences (Windows: Settings), lalu pergi ke Advanced, dan di bawah Proxies tentukan pengaturan proxy Anda di sana. Klik Apply dan Restart dan tunggu sampai Docker restart.

Pedro Madrid
sumber
Jika seseorang menggunakan proxy yang terikat secara lokal (mis. 127.0.0.1:8787 ) pada macOS seperti saya, berikut ini panduan pemasangan yang lebih terperinci: Mengapa proxy yang terikat secara lokal tidak berfungsi
Rockallite
Saya telah menetapkan proxy saya melalui windows: pengaturan tetapi proxy ini tidak menyebar ke kontainer saya stackoverflow.com/questions/48272933/...
amique
Bagi saya, saya hanya perlu memasukkan Server DNS saya dan itu berhasil. Terima kasih.
richin
32

Di Ubuntu Anda perlu mengatur http_proxy untuk daemon Docker, bukan proses klien. Ini dilakukan di /etc/default/docker(lihat di sini ).

gkephorus
sumber
dikatakan bahwa saya tidak memiliki izin untuk mengakses grup Anda. Di tautan.
Azizbro
Saya tidak berpikir ini berfungsi untuk Ubuntu 18.04 ke atas.
zslim
27

Untuk memperluas jawaban Arun , agar ini berfungsi di CentOS 7, saya harus menghapus perintah "ekspor". Jadi edit

/etc/sysconfig/docker

Dan tambahkan:

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

Kemudian restart Docker:

sudo service docker restart

The sumber posting blog ini .

zummed
sumber
2
Hanya HTTP_PROXY yang diperlukan (diuji pada Fedora 20).
sheldonh
Sempurna untuk Suse 12!
Dean Meehan
14

Mengapa proxy yang terikat secara lokal tidak berfungsi

Masalah

Jika Anda menjalankan proxy yang terikat secara lokal , mis. Mendengarkan 127.0.0.1:8989, itu TIDAK AKAN BEKERJA di Docker untuk Mac . Dari dokumentasi Docker :

Saya ingin terhubung dari wadah ke layanan di host

Mac memiliki alamat IP yang berubah (atau tidak ada jika Anda tidak memiliki akses jaringan). Rekomendasi kami saat ini adalah melampirkan IP yang tidak digunakan ke lo0antarmuka di Mac; misalnya:, sudo ifconfig lo0 alias 10.200.10.1/24dan pastikan bahwa layanan Anda mendengarkan alamat ini atau 0.0.0.0(yaitu tidak 127.0.0.1). Kemudian kontainer dapat terhubung ke alamat ini.

Mirip dengan sisi server Docker. (Untuk memahami sisi server dan sisi klien Docker, coba jalankan docker version.) Dan sisi server berjalan pada lapisan virtualisasi yang memiliki lapisannya sendiri localhost. Oleh karena itu, itu tidak akan terhubung ke server proxy pada localhostOS host.

Solusinya

Jadi, jika Anda menggunakan proxy yang terikat secara lokal seperti saya, pada dasarnya Anda harus melakukan hal-hal berikut untuk membuatnya bekerja dengan Docker untuk Mac:

  1. Buat server proxy Anda mendengarkan 0.0.0.0alih-alih 127.0.0.1. Perhatian: Anda akan memerlukan konfigurasi firewall yang tepat untuk mencegah akses berbahaya ke sana.

  2. Tambahkan alias loopback ke lo0antarmuka, misalnya 10.200.10.1/24:

     sudo ifconfig lo0 alias 10.200.10.1/24
    
  3. Tetapkan HTTP dan / atau HTTPS proxy ke 10.200.10.1:8989dari Preferensi dalam menu baki Docker (asumsikan bahwa server proxy mendengarkan pada port 8989).

Setelah itu, uji pengaturan proxy dengan menjalankan perintah dalam wadah baru dari gambar yang tidak diunduh:

$ 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
  ...

Perhatikan: alias loopback yang ditetapkan olehifconfigtidak disimpan setelah reboot. Untuk membuatnya gigih adalah topik lain. Silakan periksa posting blog ini dalam bahasa Jepang (Google Translate dapat membantu).

Rockallite
sumber
Terima kasih untuk ini, saya telah mencoba untuk menemukan solusi untuk tahun lalu atau lebih dengan untuk mendapatkan SquidMan di Mac ketika mencoba mengakses jaringan kerja dan luar melalui proxy perusahaan. Saya punya ini untuk bertahan dengan mengaitkannya ke launchd untuk dikonfigurasikan saat startup. developer.apple.com/library/content/documentation/MacOSX/…
Proctor
Terima kasih sobat. Saya akhirnya menemukan posting Anda! Berhasil. Jika Anda menggunakan cntlm jangan lupa untuk menambahkan binding 0.0.0.0 ke konfigurasi Anda. mis. Dengarkan 0.0.0.0: 8989
Felix
Saya menggunakan cntlm juga, dan mengubahnya ke mode gateway
Lee Gary
10

Ini adalah perbaikan yang bekerja untuk saya: Ubuntu, versi Docker: 1.6.2

Dalam file /etc/default/docker, tambahkan baris:

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

Mulai ulang Docker

sudo service docker restart
n3o
sumber
Bekerja pada Docker v1.12.1 di Ubuntu 14.04 dan Mint 17.3
wmarbut
1
Bekerja untuk 14.04.4 + Docker versi 17.03.1-ce, build c6d412e
okwap
8

Untuk mengkonfigurasi Docker agar berfungsi dengan proxy, Anda perlu menambahkan variabel lingkungan HTTPS_PROXY / HTTP_PROXY ke file sysconfig Docker ( /etc/sysconfig/docker).

Bergantung pada jika Anda menggunakan init.datau alat layanan Anda perlu menambahkan pernyataan "ekspor" (karena log laporan Debian Bug - # 767441. Contoh di / etc / default / docker menyesatkan mengenai sintaks yang didukung ):

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

Repositori Docker (Docker Hub) hanya mendukung HTTPS. Untuk membuat Docker bekerja dengan proxy pencegat SSL, Anda harus menambahkan sertifikat akar proksi ke toko trust sistem.

Untuk CentOS, salin file ke /etc/pki/ca-trust/source/anchors/dan perbarui toko trust CA dan restart layanan Docker.

Jika proksi Anda menggunakan otentikasi NTLMv2 - Anda perlu menggunakan proxy perantara seperti Cntlm untuk menjembatani otentikasi. Posting blog ini menjelaskannya secara rinci .

Marcel Friedmann
sumber
5

Dalam versi baru Docker, mesin docker , dalam distribusi berbasis systemd , Anda harus menambahkan baris variabel lingkungan ke /lib/systemd/system/docker.service , seperti yang disebutkan oleh orang lain:

Environment="HTTP_PROXY=http://hostname_or_ip:port/"
Mehdi Hamidi
sumber
Ini diperlukan di RHEL7.
dbalakirev
tambahkan baris ke bagian [Layanan]
volkit
5

Setelah menginstal Docker, lakukan hal berikut:

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

Kemudian, Anda dapat menarik atau melakukan apa saja:

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)
Marcello de Sales
sumber
3

Karena saya belum diperbolehkan berkomentar:

Untuk CentOS 7 saya perlu mengaktifkan EnvironmentFile dalam "docker.service" seperti yang dijelaskan di sini: Kontrol dan konfigurasikan Docker dengan systemd .

Sunting: Saya menambahkan solusi saya sebagaimana dinyatakan oleh Nilesh. Saya perlu membuka "/etc/systemd/system/docker.service" dan saya harus menambahkan di dalam bagian

[Layanan]

EnvironmentFile = - / etc / sysconfig / docker

Baru kemudian file "etc / sysconfig / docker" dimuat di sistem saya.

Maximilian Wollnik
sumber
3

Untuk mengatasi masalah dengan curl di Docker build, saya menambahkan yang berikut di dalam Dockerfile:

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

Perhatikan bahwa pernyataan ENV adalah SEBELUM pernyataan RUN.

Dan untuk membuat daemon Docker dapat mengakses Internet (saya menggunakan Kitematic dengan boot2docker), saya menambahkan yang berikut ke dalam /var/lib/boot2docker/profile:

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

Lalu saya restart Docker dengan sudo /etc/init.d/docker restart.

Bruno Negrão Zica
sumber
3

Jika menggunakan proxy socks5, ini adalah pengujian saya dengan Docker 17.03.1-ce dengan pengaturan "all_proxy", dan itu berhasil:

# 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
btpka3
sumber
3

Solusi lengkap untuk Windows, untuk mengonfigurasi pengaturan proxy.

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

Anda dapat mengkonfigurasinya secara langsung dengan mengklik kanan pengaturan, pada ikon Docker, dan kemudian Proxies.

Di sana Anda dapat mengkonfigurasi alamat proxy, port, nama pengguna, dan kata sandi.

Dalam format ini:

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

Contoh:

"geronimous:[email protected]:8080"

Tidak lebih dari ini.

pengguna2280949
sumber
2

Pengaturan variabel lingkungan proxy tidak membantu saya dalam versi 1.0.1 ... Saya harus memperbarui /etc/default/docker.iofile dengan nilai yang benar untuk variabel "http_proxy".

Richil
sumber
2

Jika Anda berada di Ubuntu, jalankan perintah ini untuk menambahkan proxy Anda.

sudo nano /etc/default/docker

Dan batalkan komentar pada garis yang menentukan

#export http_proxy = http://username:[email protected]:8050

Dan ganti dengan server proxy dan nama pengguna yang sesuai.

Kemudian restart Docker menggunakan:

service docker restart

Sekarang Anda dapat menjalankan perintah Docker di belakang proxy:

docker search ubuntu
Gary Mendonca
sumber
2

Mungkin Anda perlu mengatur variabel huruf kecil. Dalam kasus saya, file /etc/systemd/system/docker.service.d/http-proxy.conf saya terlihat seperti ini:

[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>/"

Semoga berhasil! :)

Lawrence Ferreira
sumber
2

Saya juga menghadapi masalah yang sama di balik firewall. Ikuti langkah-langkah di bawah ini:

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

Jangan gunakan atau hapus file https_prxoy.conf.

Muat ulang dan mulai ulang wadah Docker Anda:

$ 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
abhishek pant
sumber
1

Jika Anda menggunakan Ubuntu, Anda harus menjalankan perintah ini:

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

Dan muat ulang Docker dengan:

service docker.io restart

Atau buka /etc/docker.iodengan nano ...

koff75
sumber
1

Pada Ubuntu 14.04 (Trusty Tahr) dengan Docker 1.9.1, saya hanya menghapus komentar http_proxybaris tersebut, memperbarui nilai dan kemudian memulai kembali layanan Docker.

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

lalu

service docker restart
Neo
sumber
0

Di RHEL6.6 hanya ini yang berfungsi (perhatikan penggunaan export):

/ etc / sysconfig / docker

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

CATATAN: Keduanya dapat menggunakan httpprotokol.)

Terima kasih kepada https://crondev.com/running-docker-behind-proxy/

Vaughan
sumber
0

Di jaringan saya, Ubuntu bekerja di belakang server proxy ISA perusahaan. Dan itu membutuhkan otentikasi. Saya mencoba semua solusi yang disebutkan di atas dan tidak ada yang membantu. Apa yang benar-benar membantu adalah menulis baris proxy dalam file /etc/systemd/system/docker.service.d/https-proxy.conftanpa nama domain.

Dari pada

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

atau

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

dan beberapa pengganti lain seperti @ -> %40atau \ -> \\saya coba gunakan

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

Dan itu berfungsi sekarang.

Dmitry Polyakov
sumber
0

Coba ini:

sudo HTTP_PROXY=http://<IP address of proxy server:port> docker -d & 
Abdennour TOUMI
sumber
0

Ini tidak persis menjawab pertanyaan, tetapi mungkin membantu, terutama jika Anda tidak ingin berurusan dengan file layanan.

Jika Anda adalah orang yang meng-hosting gambar, salah satu caranya adalah mengubah gambar sebagai arsip tar, menggunakan sesuatu seperti yang berikut di server .

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

Cukup unduh arsip dan ubah kembali menjadi gambar.

docker load <archive-name>.tar
pecahan
sumber