Jak wyświetlić interfejs API dokera za pomocą protokołu TCP?

13

Korzystam z Portainera i nie mogę zarządzać zdalnymi punktami końcowymi. Próbowałem użyć wiersza polecenia, aby połączyć się ze zdalnymi węzłami dokującymi, ale dostałem wiadomość Cannot connect to the Docker daemon at tcp://<remote_ip>:<port>. Is the docker daemon running?.

Tak, działają. Dodałem się do grupy dokerów i mogę uzyskać dostęp do dokera przez SSHing do węzłów. Jednak nie mogę uzyskać zdalnego dostępu do żadnych węzłów dokerów.

Zmodyfikowałem, /etc/defaultaby dodać / odkomentowaćDOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"

Też zmodyfikowałem /etc/init.d/dockeri /etc/init/docker.confdołączyłem DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock".

Zrestartowałem usługę dokowania, wylogowałem się i zalogowałem wiele razy w tym procesie, ale nadal nie mogę połączyć się ze zdalnym węzłem. Nie mogę nawet połączyć się z węzłem lokalnym, przekazując adres IP.

Co przegapiłem? Jaka konfiguracja w jakim pliku ujawnia API przez TCP?

user@hostname:~$ docker -H tcp://<REMOTE_IP>:2375 info
Cannot connect to the Docker daemon at tcp://<REMOTE_IP>:2375. Is the docker daemon running?
user@hostname:~$ docker -H tcp://127.0.0.1:2375 info
Cannot connect to the Docker daemon at tcp://127.0.0.1:2375. Is the docker daemon running?
user@hostname:~$ docker -H tcp://<LOCAL_IP>:2375 info
Cannot connect to the Docker daemon at tcp://<LOCAL_IP>:2375. Is the docker daemon running?
user@hostname:~$

Edycja: Uruchomienie ps aux | grep -i dockerzwraca to -

root      3581  0.1  0.2 596800 41540 ?        Ssl  04:17   0:35 /usr/bin/dockerd -H fd://
root      3588  0.0  0.0 653576 14492 ?        Ssl  04:17   0:18 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc
Lord Loh.
źródło
Czy 2375 słucha? ss -ntl
jscott,
Nie. Nic nie nasłuchuje na 2375. I nie mogę ustalić, na którą konfigurację wpływa ten plik. Uwzględniłem wynik ps auxw mojej odpowiedzi, jeśli to pomaga.
Lord Loh.
Próbowałem podobnych rzeczy i podejrzewam, że pliki / etc / default / docker, /etc/init/docker.conf i /etc/init.d/docker są po prostu ignorowane na Ubuntu 16.04 z instalacją docker-ce, każdy może potwierdzić ? Myślę, że kiedy uruchamiam „status dokera usługi”, tak naprawdę dzieje się „systemctl doker stanu”, zupełnie inny system zarządzania.
chrisinmtown

Odpowiedzi:

22

Znalazłem rozwiązanie dzięki postowi Iwana Krizsana .

Musiałem edytować /lib/systemd/system/docker.servicena moim systemie Ubuntu 16.04.2 LTS, aby zmodyfikować linię

ExecStart=/usr/bin/docker daemon -H fd:// -H tcp://0.0.0.0:

następnie

sudo systemctl daemon-reload
sudo systemctl restart docker.service

i wszystko działało :-). Następnym krokiem jest ustalenie, jak zabezpieczyć formę demona dokera przed przejęciem.

Lord Loh.
źródło
1
Potwierdzam, że ta zmiana powoduje, że Dockerd nasłuchuje żądań HTTP na Ubuntu 16.04 z dokerem-ce wer 17.06. Po prostu źle jest modyfikować skrypt usługi bezpośrednio.
chrisinmtown
7
Nigdy nie edytuj bezpośrednio skryptu usługi dokera (ani żadnego skryptu usługi). SystemD ma wbudowaną funkcję edycji różnicowej. Użyj systemctl edit docker.servicei systemctl utworzy nowy plik z twoimi edycjami. Zapobiega to wyczyszczeniu zmian przez aktualizację. SystemD połączy dwa pliki w czasie wykonywania. Dobry dokument tutaj: digitalocean.com/community/tutorials/...
Routhinator
Dzięki! To jest bardzo przydatne. Podczas aktualizacji otrzymuję ostrzeżenie. Przyjrzę się temu: _)
Lord Loh.
4
Na Ubuntu Server 18.04 działało to tak:ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:4243
LUCIAN ALEXA
kiedy korzystam z samego -H tcp://ustawienia, bez -H fd://ustawienia, nie mogę wydawać poleceń klienta, np. informacji o dokerze, wersji dokera itp.
Chris F,
2

Katalog / etc / default jest miejscem, w którym opiekunowie dystrybucji umieszczają swoje pliki konfiguracyjne. Jeśli zainstalujesz dokera bezpośrednio z repozytoriów Dockera, ten katalog nie będzie używany.

Katalog / lib / systemd to miejsce, w którym pakiety zainstalują swoje pliki systemowe i zastąpią tam wszelkie zmiany podczas aktualizacji. Jeśli użyjesz tego, twoje zmiany zostaną utracone.

Aby wprowadzić własne zmiany w pliku jednostki systemowej, który się utrzymuje, możesz utworzyć plik jednostki w /etc/systemd/system/docker.service.d/, np. Oto mój standardowy /etc/systemd/system/docker.service. d / override.conf:

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd

To zastąpienie po prostu resetuje wszystkie flagi wiersza poleceń do demona dockerd z systemd. Po zakończeniu możesz zastąpić każde ustawienie z pliku /etc/docker/daemon.json, które jest używane przez okno dokowane, i w zależności od ustawienia można je ponownie załadować bez ponownego uruchamiania demona. Oto przykład /etc/docker/daemon.json:

{
"debug": false,
"experimental": true,
"hosts": ["fd://", "tcp://0.0.0.0:2376"],
"labels": ["foo=bar", "fez=baz"],
"log-driver": "json-file",
"log-opts": {"max-size": "10m", "max-file": "3"},
"storage-driver": "overlay2",
"tlscacert": "/etc/docker/certs/ca.pem",
"tlscert": "/etc/docker/certs/host-cert.pem",
"tlskey": "/etc/docker/certs/host-key.pem",
"tlsverify": true
}

Do swoich celów potrzebujesz tylko linii tam, aby ustawić hosty.

Jedną niezwykle ważną częścią powyższego pliku konfiguracyjnego są ustawienia TLS. Jeśli nie skonfigurujesz wzajemnego TLS między klientem a serwerem i otworzysz okno dokowane, aby nasłuchiwać w sieci, uruchamiasz odpowiednik otwartego serwera telnet z dozwolonymi loginami root bez hasła. Jeśli wolisz ssh niż telnet lub wolisz hasło do konta root, musisz skonfigurować TLS. Porty interfejsu dokującego API są często skanowane w Internecie i jeśli na tym etapie pominiesz ten krok, na swoim hoście znajdziesz złośliwe oprogramowanie.

Szczegółowe informacje na temat konfiguracji kluczy TLS dla klienta i serwera można znaleźć na stronie : https://docs.docker.com/engine/security/https/

BMitch
źródło
1
Bardzo dobra odpowiedź, która przetrwa przyszłe aktualizacje usługi dokowania. To jest właściwy sposób, aby to zrobić.
Fopedush,
2

Jeśli nie chcesz ponownie konfigurować i ponownie uruchamiać demona dokera, możesz po prostu zmostkować gniazdo unix z gniazdem TCP za pomocą ncat(z nmappakietu):

ncat -lknvp 2375 -c "ncat -U /var/run/docker.sock"

Alternatywnie możesz użyć socat lub innych narzędzi .

eadmaster
źródło
niesamowity! czy mogę rozróżnić to polecenie w tle? kiedy zamykam połączenie z terminalem zostaje utracone
Felix
ah znalazłem nohupi&
Felix
0

Oficjalna dokumentacja opisuje, jak skonfigurować, gdzie demon Docker nasłuchuje połączeń .

systemd vs daemon.json

Skonfigurowanie Dockera do nasłuchiwania połączeń przy użyciu zarówno pliku jednostki systemowej, jak i pliku daemon.json powoduje konflikt, który uniemożliwia uruchomienie Dockera.

Konfigurowanie dostępu zdalnego za pomocą systemowego pliku jednostki

  1. Użyj polecenia sudo systemctl edit docker.service, aby otworzyć plik zastępujący docker.service w edytorze tekstu.

  2. Dodaj lub zmodyfikuj następujące wiersze, zastępując własne wartości.

    [Service]
    ExecStart=
    ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
    
  3. Zapisz plik.

  4. Ponownie załaduj konfigurację systemctl.

    $ sudo systemctl daemon-reload
    
  5. Uruchom ponownie Docker.

    $ sudo systemctl restart docker.service
    
  6. Sprawdź, czy zmiana została uwzględniona, przeglądając dane wyjściowe netstat, aby potwierdzić, że dockerd nasłuchuje na skonfigurowanym porcie.

    $ sudo netstat -lntp | grep dockerd
    tcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3758/dockerd
    

Konfigurowanie dostępu zdalnego za pomocą daemon.json

  1. Ustaw tablicę hosts w /etc/docker/daemon.json, aby połączyć się z gniazdem UNIX i adresem IP w następujący sposób:

    {
    "hosts": ["unix:///var/run/docker.sock", "tcp://127.0.0.1:2375"]
    }
    

    Skonfigurowanie Dockera do nasłuchiwania połączeń przy użyciu zarówno pliku jednostki systemowej, jak i pliku daemon.json powoduje konflikt, który uniemożliwia uruchomienie Dockera.

    1. Dodaj lub zmodyfikuj następujące wiersze, zastępując własne wartości.

      [Service]
      ExecStart=
      ExecStart=/usr/bin/dockerd
      
    2. Zapisz plik.

    3. Ponownie załaduj konfigurację systemctl.

      $ sudo systemctl daemon-reload
      
  2. Uruchom ponownie Docker.

  3. Sprawdź, czy zmiana została uwzględniona, przeglądając dane wyjściowe netstat, aby potwierdzić, że dockerd nasłuchuje na skonfigurowanym porcie.

    $ sudo netstat -lntp | grep dockerd
    tcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3758/dockerd
    

Klient Docker honoruje DOCKER_HOSTzmienną środowiskową, aby ustawić -Hflagę dla klienta. Użyj jednego z następujących poleceń:

$ docker -H tcp://127.0.0.1:2375 ps

lub

$ export DOCKER_HOST="tcp://127.0.0.1:2375"
$ docker ps
ROY
źródło