Jak uzyskać zdalny dostęp do prywatnego rejestru docker?

82

Próbuję skonfigurować prywatny rejestr docker za pomocą obrazu pobranego z: https://github.com/docker/docker-registry

Wystarczy uruchomić:
docker run -p 5000:5000 registry

Mogę ściągać / wypychać z / do tego repozytorium tylko z lokalnego hosta, ale jeśli spróbuję uzyskać do niego dostęp z innego komputera (używając adresu prywatnego w tej samej sieci LAN), pojawia się komunikat o błędzie:

*2014/11/03 09:49:04 Error: Invalid registry endpoint https ://10.0.0.26:5000/v1/': 
Get https:// 10.0.0.26:5000/v1/_ping: Forbidden. If this private 
registry supports only HTTP or HTTPS with an unknown CA certificate,
please add `--insecure-registry 10.0.0.26:5000` to the daemon's 
arguments. In the case of HTTPS, if you have access to the registry's
CA certificate, no need for the flag; simply place the CA certificate 
at /etc/docker/certs.d/10.0.0.26:5000/ca.crt*

To, co doprowadza mnie do szału, to fakt, że mogę uzyskać do niego dostęp za pomocą: curl 10.0.0.26:5000 i / lubcurl 10.0.0.26:5000/v1/search

Nie rozumiem też, gdzie i jak mam przekazać --insecure-registryflagę.

Ofer Eliassaf
źródło
3
wiele odpowiedzi wydaje się być nieaktualnych dla dockera 1.12, ale zobacz odpowiedź vikas027, która jest świetna dla docker 1.12 (najnowszy
ATOW
1
W przypadku Ubuntu dokumentacja Dockera i ta odpowiedź działały dobrze.
Batandwa,

Odpowiedzi:

73

OK - znalazłem na to rozwiązanie - po całym dniu kopania.

Dla dockera poniżej 1.12.1:

Okazuje się, że nowa wersja klienta odmawia współpracy z prywatnym rejestrem bez SSL.

Aby to naprawić - demon na komputerze klienckim powinien zostać uruchomiony z flagą niezabezpieczone:

Wystarczy wpisać:

sudo service docker stop # to stop the service

i wtedy

sudo docker -d --insecure-registry 10.0.0.26:5000

(zamień na 10.0.0.26swój własny adres IP).

Spodziewałbym się, że ludzie z docker dodają tę opcję do wiersza poleceń pull / push ...

Edytuj - alternatywnie - możesz dodać flagę do DOCKER_OPTSzmiennej env wewnątrz / etc / default / docker ... i wtedysudo service docker restart

Edytuj ponownie - Wygląda na to, że faceci od dockerów są na tym - i wkrótce nadejdzie poprawka: https://github.com/docker/docker/pull/8935

W przypadku docker 1.12.1:

Proszę postępować zgodnie z odpowiedzią vikas027 (ważne dla centów)

Ofer Eliassaf
źródło
Udało mi się odtworzyć twoje kroki i wypchnąć do prywatnego rejestru na zdalnym hoście. Pokazał również udany atak. Jak jednak wyświetlić listę obrazów w prywatnym rejestrze? Próbowałem, docker -H tcp://remote-host-ip:5000 imagesale wróciłem z błędem.
Howard Lee
Mogę zweryfikować, że tak się dzieje. Dzieje się tak również, gdy wpiszesz <ip>: 5000 / v1 / search - otrzymasz pustą odpowiedź. Prawdopodobnie inny błąd, który mają :-(
Ofer Eliassaf
Aktualizacja: mogłem wyszukiwać / pobierać obrazy przechowywane w zdalnym prywatnym rejestrze. docker search remote-host-ip:5000/image-namei docker pull remote-host-ip:5000/image-nameoba działają dobrze. Teraz, jak mam wyświetlić listę obrazów ...
Howard Lee,
3
@ashleyaitken, użyłem następującego odniesienia, aby pomóc mi rozwiązać problem z Boot2Docker: github.com/boot2docker/boot2docker#insecure-registry . Mam nadzieję, że to pomoże.
Patelify
1
--insecure-registryjest obejściem, a nie rozwiązaniem.
peterh - Przywróć Monikę
28

To właśnie zadziałało dla mnie w CentOS 7.2 i Docker 1.12.1 (najnowsze na dzień). Mój prywatny rejestr v2 działał 192.168.1.88:5000, zmień go odpowiednio. Działa to również, jeśli masz wiele rejestrów, po prostu kontynuuj dodawanie--insecure-registry IP:Port

$ sudo vim /usr/lib/systemd/system/docker.service
#ExecStart=/usr/bin/dockerd 
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.88:5000
$
$ sudo systemctl stop docker
$ sudo systemctl daemon-reload
$ systemctl start docker
vikas027
źródło
1
To rozwiązanie było jedynym, które działało dla mnie na Ubuntu.
JARC
1
Dzięki człowiekowi - działało świetnie - dodałem na tej podstawie pełniejszą odpowiedź dla osób stojących za korporacyjnym pełnomocnikiem
danday74
2
Pracował dla mnie, ale docker.service był /lib/systemd/system/docker.servicena Ubuntu 16.04.
Karim Tabet
4
--insecure-registryjest obejściem, a nie rozwiązaniem.
peterh - Przywróć Monikę
1
praca. Albo musisz zhakować cały system (inną podobną „funkcją” jest to, że „sieć mostkowa” oznacza w rzeczywistości sieci NAT w dockerze, podczas gdy prawdziwa sieć mostowana po prostu nie istnieje). Te odpowiedzi spopularyzują straszne obejścia poważnych problemów, które można łatwo naprawić, ale jakoś tak nie jest. To był powód, dla którego wszystkie z nich przegłosowałem - wszystkie są złymi rozwiązaniami.
peterh - Przywróć Monikę
24

Edytuj plik konfiguracyjny „/ etc / default / docker”

sudo vi / etc / default / docker

dodaj linię na końcu pliku

DOCKER_OPTS = "$ DOCKER_OPTS --insecure-register = 192.168.2.170: 5000"

(zastąp adres 192.168.2.170 własnym adresem IP)

i zrestartuj usługę docker

restart usługi sudo docker

daozhao
źródło
Dzięki! Edycja /etc/init.d/dockerpo prostu od razu nie działa na Ubuntu 14.04, co zaskakujące. Ale twoja poprawka to /etc/default/dockerrobi.
elimisteve
mój system hosta to także Ubuntu 14.04
daozhao
1
--insecure-registryjest obejściem, a nie rozwiązaniem.
peterh - Przywróć Monikę
12

Zauważyłem, że bardzo przydatne są następujące informacje, w których omówiono konfigurację samej usługi Docker. https://docs.docker.com/articles/systemd/

Wraz z tym artykułem na temat polecenia systemctl https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units

Użyłem następującej serii poleceń w kontenerze opartym na Centos 7 z obrazem rejestru uzyskanym przez „docker pull register: 2.1.1”

sudo mkdir -p /etc/systemd/system/docker.service.d
cd /etc/systemd/system/docker.service.d
sudo touch override.conf
sudo nano override.conf

A wewnątrz override.conf dodał następujący.

[Service]
ExecStart=
ExecStart=/usr/bin/docker -d -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --insecure-registry 10.2.3.4:5000

Zwróć uwagę na pierwszą, pustą, ExecStart = czyści wszystko, co już jest na miejscu, więc pamiętaj, aby dodać wszystko z instrukcji /usr/lib/systemd/system/docker.service ExecStart =, które chcesz zachować.

Jeśli nie podasz opcji -d (demon), pojawi się błąd „Proszę podać tylko jeden -H”.

Po wydaniu następującej serii poleceń widzę moje nadpisania na miejscu.

sudo systemctl stop docker
sudo systemctl daemon-reload
sudo systemctl start docker
sudo systemctl status docker

docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled)
  Drop-In: /etc/systemd/system/docker.service.d
           └─override.conf
   Active: active (running) since Thu 2015-09-17 13:37:34 AEST; 7s ago
     Docs: https://docs.docker.com
 Main PID: 5697 (docker)
   CGroup: /system.slice/docker.service
           └─5697 /usr/bin/docker -d -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --insecure-registry 10.2.3.4:5000

UWAGA: Informacje zawarte w wierszach Loaded: i Drop-In: w komunikacie o stanie są przydatne do sprawdzania, co się dzieje z działającym wcześniej demonem dockera.

UWAGA: Dalsze wskazówki można znaleźć w pliku Loaded: docker.service dla pliku EnvironmentFile =.

TJA
źródło
2
--insecure-registryjest obejściem, a nie rozwiązaniem.
peterh - Przywróć Monikę
Witaj @peterh Rozumiem, że jest to obejście i niezabezpieczone. Nie mam wątpliwości, że istnieją systemy produkcyjne, które go używają, co jest naprawdę bardzo złą rzeczą.
TJA
1
@peterh, czy możesz wskazać mi jakiekolwiek linki, które pokazują, jak to zrobić poprawnie, a ja zaktualizuję swoją odpowiedź i będę odnosić się do linku.
TJA
11

Dobrze. Oto jak to działa. Jeśli widzisz ten błąd w Docker 1.3.2 lub nowszym, zrób to

iść do /etc/sysconfig/docker

other_args="--insecure-registry 10.0.0.26:5000"

i biegnij

sudo service docker restart

Sójka
źródło
1
musisz wstawić '=', aby wpłynąć na wartość rejestru pod ubuntu: "- insecure-register = 10.0.0.26: 5000"
Romain Jouin
@Jay, jestem noobem. 1.3.2 brzmi jak przyszła wersja dockera. Widzę, że aktualna wersja to 1.12 github.com/docker/docker/releases, jeśli się nie mylę.
ravindrab
1
@ravindrab w jakim wszechświecie 12 jest mniejsze niż 3? ;)
ferrari2k
2
--insecure-registryjest obejściem, a nie rozwiązaniem.
peterh - Przywróć Monikę
9

użyj następującego polecenia, zastępując {YOUR_REGISTRY} swoim rejestrem

boot2docker ssh "echo $'EXTRA_ARGS=\"--insecure-registry {YOUR_REGISTRY}\"' | sudo tee -a /var/lib/boot2docker/profile && sudo /etc/init.d/docker restart"
JaTo
źródło
boot2dockerto niezależny zestaw narzędzi nieistotny w kontekście pytania.
Arnaud Meuret
2
--insecure-registryjest obejściem, a nie rozwiązaniem.
peterh - Przywróć Monikę
7

edytuj plik docker.service, dodaj flagę --insecure-register xxxx po -d, zrestartuj docker

to jest jedyna rzecz, która działała dla mnie, DOCKER_OPTS nie miał żadnego efektu

Diman
źródło
wszystko, co mówisz, jest prawdą, ale szczegóły są tak skąpe, że odpowiedź jest prawie bezużyteczna
danday74
2
--insecure-registryjest obejściem, a nie rozwiązaniem.
peterh - Przywróć Monikę
4

Docker 1.12.1

W przypadku CentOS 7.2

/usr/lib/systemd/system/docker.service
#ExecStart=/usr/bin/dockerd
ExecStart=/usr/bin/dockerd --insecure-registry my-docker-registry.com:5000

Dla ubuntu 16.04

/lib/systemd/system/docker.service
#ExecStart=/usr/bin/dockerd -H fd://
ExecStart=/usr/bin/dockerd --insecure-registry my-docker-registry.com:5000 -H fd://

sudo systemctl stop docker
sudo systemctl daemon-reload
sudo systemctl start docker

Wygląda na to, że opcja --insecure-register może być używana zarówno z, jak i bez znaku "=" między nią a identyfikatorem rejestru.

tedwards
źródło
2
--insecure-registryjest obejściem, a nie rozwiązaniem.
peterh - Przywróć Monikę
2

Zauważyłem, że wersja klienta dockera i wersja dockera rejestru muszą do siebie pasować, w przeciwnym razie napotkasz problemy z łącznością, mimo że wszystko jest na swoim miejscu.

Saikrishna Rao
źródło
2

Rozwiązanie dwuetapowe (bez --insecure-registry):

  1. Pobierz klucz publiczny z rejestru
  2. Umieść go w /etc/docker/certs.d/$HOSTNAME/katalogu

 

mkdir -p /etc/docker/certs.d/10.0.0.26:5000
echo -n | openssl s_client -connect 10.0.0.26:5000 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /etc/docker/certs.d/10.0.0.26:5000/registry.crt

Teraz doker będzie ufał certyfikatowi z podpisem własnym.

vp_arth
źródło
1

Jest to oparte na odpowiedzi z vikas027 na Centos 7 i Docker 1.12

Ponieważ korzystam z proxy, moje pełne rozwiązanie było ...

/etc/systemd/system/docker.service.d/http-proxy.conf

[Service]

Environment="FTP_PROXY={{MY_PROXY}}"
Environment="ftp_proxy={{MY_PROXY}}"

Environment="HTTPS_PROXY={{MY_PROXY}}"
Environment="https_proxy={{MY_PROXY}}"

Environment="HTTP_PROXY={{MY_PROXY}}"
Environment="http_proxy={{MY_PROXY}}"

Environment="NO_PROXY=localhost,127.0.0.1,{{MY_INSECURE_REGISTRY_IP}}"
Environment="no_proxy=localhost,127.0.0.1,{{MY_INSECURE_REGISTRY_IP}}"

/usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd --insecure-registry {{MY_INSECURE_REGISTRY_IP}}:5000

i nie zapomnij zrestartować :)

sudo systemctl daemon-reload; sudo systemctl restart docker;
danday74
źródło
1
--insecure-registryjest obejściem, a nie rozwiązaniem.
peterh - Przywróć Monikę
0

Ustawianie niezabezpieczonego lokalnego rejestru w dockerze wraz z proxy:

1) w Ubuntu dodaj następującą flagę --insecure-register IP: port pod DOCKER_OPTS w pliku / etc / default / docker

1.1) skonfiguruj zmienną env no_proxy, aby ominęła lokalny adres IP / nazwę hosta / nazwę domeny ... ponieważ proxy może rzucać interaktywną wiadomość ... na przykład kontynuuj, a ta pośrednia wiadomość dezorientuje klienta docker i ostatecznie przekroczy limit czasu ...

1.2) jeśli nazwa domeny jest skonfigurowana ... nie zapomnij zaktualizować pliku / etc / hosts, jeśli nie używasz DNS.

1.3) w / etc / default / docker ustaw zmienne env http_proxy i https_proxy ..., ponieważ umożliwia to pobieranie obrazów z zewnętrznych centrów firmowych. format http_proxy = http: // nazwa użytkownika: hasło @ proxy: port

2) zrestartuj usługę docker ... jeśli jest zainstalowana jako usługa, użyj restartu usługi sudo docker service

3) zrestartuj kontener rejestru [sudo docker run -p 5000: 5000 register: 2]

4) oznaczyć wymagany obraz za pomocą sudo docker tag id_obrazu IP: port / nazwa obrazu / zmienna, jeśli istnieje

5) wypchnij obraz ... sudo docker push ip: port / nazwa obrazu

6) Jeśli chcesz pobrać obraz z innego komputera, powiedz B bez TLS / SSL, to w B zastosuj ustawienia 1,1.1 i 2. Jeśli te zmiany nie zostaną wykonane na komputerze B ... pull nie powiedzie się.

Ragha
źródło
2
--insecure-registryjest obejściem, a nie rozwiązaniem.
peterh - Przywróć Monikę
0

Ubuntu 16.04

Utwórz (nie istnieje) plik /etc/systemd/system/docker.service.d/registry.confz zawartością:

[Service]
#You need the below or you 'ExecStart=' or you will get and error 'Service has more than one ExecStart= setting, which is only allowed'
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 10.20.30.40:5000

następnie

sudo systemctl stop docker
sudo systemctl daemon-reload
sudo systemctl start docker
danday74
źródło
0

Oprócz powyższych odpowiedzi dodaję to, co działało w „docker for mac”:

  1. Kliknij ikonę wieloryba dokera zasobniku Mac w prawym górnym rogu ekranu.
  2. Kliknij Preferencje -> Demon .
  3. Dodaj swój adres IP i port do niezabezpieczonych rejestrów.
  4. Zrestartuj demona.

wprowadź opis obrazu tutaj

Parantap Sharma
źródło