Come esporre l'API docker su TCP?


13

Sto usando Portainer e non sono in grado di gestire endpoint remoti. Ho provato a utilizzare la riga di comando per connettermi ai nodi della finestra mobile remota, ma ho ricevuto un messaggio Cannot connect to the Docker daemon at tcp://<remote_ip>:<port>. Is the docker daemon running?.

Sì, stanno correndo. Mi sono aggiunto al gruppo finestra mobile e posso accedere alla finestra mobile tramite SSHing nei nodi. Tuttavia, non riesco ad accedere a nessun nodo finestra mobile in remoto.

Ho modificato /etc/defaultper aggiungere / decommentareDOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"

Ho anche modificato /etc/init.d/dockere /etc/init/docker.confda includere DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock".

Ho riavviato il servizio docker, disconnesso e eseguito l'accesso più volte durante il processo, ma non riesco ancora a collegarmi al nodo remoto. Non riesco nemmeno a collegarmi al nodo locale passando l'IP.

Cosa mi sono perso? Quale configurazione in quale file espone l'API su 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:~$

Modifica: Running ps aux | grep -i dockerrestituisce questo -

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

2375 è in ascolto? ss -ntl
jscott,

No. Non c'è niente in ascolto su 2375. E non riesco a capire quale configurazione in quale file influisce su questo. ps auxSe ciò aiuta, ho incluso l'output di nella mia risposta.
Lord Loh.

Ho provato cose simili e sospetto che i file / etc / default / docker, /etc/init/docker.conf e /etc/init.d/docker siano semplicemente ignorati su Ubuntu 16.04 con un'installazione di docker-ce, qualcuno può confermare ? Penso che quando eseguo "status docker di servizio" ciò che realmente accade è "docker di stato systemctl", un altro sistema di gestione.
chrisinmtown,

Risposte:


21

Ho trovato una soluzione grazie al post di Ivan Krizsan .

Ho dovuto modificare /lib/systemd/system/docker.serviceil mio sistema Ubuntu 16.04.2 LTS per modificare la linea

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

poi

sudo systemctl daemon-reload
sudo systemctl restart docker.service

e tutto ha funzionato :-). Il prossimo passo è capire come proteggere il modulo demone docker che viene dirottato.


1
Confermo che questa modifica fa sì che Dockerd ascolti le richieste HTTP su Ubuntu 16.04 con docker-ce versione 17.06. È semplicemente sbagliato modificare direttamente lo script del servizio.
chrisinmtown,

7
Non modificare mai direttamente lo script del servizio docker (o qualsiasi altro script di servizio). SystemD ha una funzione di modifica differenziale integrata. Use systemctl edit docker.servicee systemctl creeranno un nuovo file con le tue modifiche. Ciò impedisce a un aggiornamento di cancellare le modifiche. SystemD unirà i due file in fase di esecuzione. Buon documento qui: digitalocean.com/community/tutorials/…
Routhinator,

Grazie! Questo è terribilmente utile. Continuo a ricevere avvisi durante gli aggiornamenti. Esaminerò questo: _)
Lord Loh.

4
Su Ubuntu Server 18.04, ha funzionato in questo modo:ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:4243
LUCIAN ALEXA il

quando uso l' -H tcp://impostazione da sola, senza l' -H fd://impostazione, non posso inviare e comandi client, ad es., informazioni sulla finestra mobile, versione della finestra mobile, ecc.
Chris F,

2

La directory / etc / default è dove i manutentori della distribuzione inseriscono i loro file di configurazione. Se si installa la finestra mobile direttamente dai repository Docker, questa directory non verrà utilizzata.

La directory / lib / systemd è dove i pacchetti installeranno i loro file systemd e sovrascriveranno tutte le modifiche lì durante l'aggiornamento. Se lo usi, le modifiche andranno perse.

Per apportare le tue modifiche a un file di unità systemd che persiste, puoi creare un file di unità in /etc/systemd/system/docker.service.d/, ad esempio qui è il mio standard /etc/systemd/system/docker.service. d / override.conf:

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

Questa sostituzione disattiva semplicemente tutti i flag della riga di comando sul demone dockerd da systemd. Una volta fatto, è possibile sovrascrivere ogni impostazione da /etc/docker/daemon.json che viene utilizzata dalla finestra mobile e, a seconda dell'impostazione, può essere ricaricata senza riavviare il demone. Ad esempio, ecco un esempio /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
}

Per i tuoi scopi, hai solo bisogno della linea lì dentro per impostare gli host.

Una parte estremamente importante del file di configurazione di cui sopra sono le impostazioni TLS. Se non si configura TLS reciproco tra client e server e si apre la finestra mobile per l'ascolto sulla rete, si esegue l'equivalente di un server Telnet aperto con accessi root consentiti senza password. Se preferisci ssh su telnet o se preferisci avere una password per il tuo account di root, devi configurare TLS. Le porte dell'API docker vengono frequentemente scansionate su Internet e troverai malware installato sul tuo host in breve tempo se salti mai questo passaggio di configurazione.

I dettagli completi su come configurare le chiavi TLS per client e server sono disponibili all'indirizzo: https://docs.docker.com/engine/security/https/


1
Un'ottima risposta che sopravviverà ai futuri aggiornamenti del servizio docker. Questo è il modo giusto per farlo.
Fopedush,

2

Se non si desidera riconfigurare e riavviare il demone docker, è possibile semplicemente collegare il socket unix a un socket TCP utilizzando ncat(dal nmappacchetto):

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

In alternativa, puoi utilizzare socat o altri strumenti .


sorprendente! posso eseguire questo comando in background? quando chiudo la connessione del mio terminale si perde
Felix,

ah ho trovato nohupe&
Felix il

0

Esiste una documentazione ufficiale che descrive come configurare il punto in cui il demone Docker è in ascolto delle connessioni .

systemd vs daemon.json

La configurazione di Docker per l'ascolto delle connessioni utilizzando sia il file di unità di sistema sia il file daemon.json provoca un conflitto che impedisce l'avvio di Docker.

Configurazione dell'accesso remoto con il file di unità systemd

  1. Utilizzare il comando sudo systemctl edit docker.service per aprire un file di sostituzione per docker.service in un editor di testo.

  2. Aggiungi o modifica le seguenti righe, sostituendo i tuoi valori.

    [Service]
    ExecStart=
    ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
    
  3. Salva il file.

  4. Ricarica la configurazione di systemctl.

    $ sudo systemctl daemon-reload
    
  5. Riavvia Docker.

    $ sudo systemctl restart docker.service
    
  6. Verifica se la modifica è stata rispettata esaminando l'output di netstat per confermare che dockerd è in ascolto sulla porta configurata.

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

Configurazione dell'accesso remoto con daemon.json

  1. Impostare l'array hosts in /etc/docker/daemon.json per connettersi al socket UNIX e a un indirizzo IP, come segue:

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

    La configurazione di Docker per l'ascolto delle connessioni utilizzando sia il file di unità di sistema sia il file daemon.json provoca un conflitto che impedisce l'avvio di Docker.

    1. Aggiungi o modifica le seguenti righe, sostituendo i tuoi valori.

      [Service]
      ExecStart=
      ExecStart=/usr/bin/dockerd
      
    2. Salva il file.

    3. Ricarica la configurazione di systemctl.

      $ sudo systemctl daemon-reload
      
  2. Riavvia Docker.

  3. Verifica se la modifica è stata rispettata esaminando l'output di netstat per confermare che dockerd è in ascolto sulla porta configurata.

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

Il client Docker rispetterà la DOCKER_HOSTvariabile di ambiente per impostare il -Hflag per il client. Utilizzare uno dei seguenti comandi:

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

o

$ export DOCKER_HOST="tcp://127.0.0.1:2375"
$ docker ps
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.