web-dev-qa-db-fra.com

Comment exposer l'API Docker sur TCP?

J'utilise portainer et je ne parviens pas à gérer les points de terminaison distants. J'ai essayé d'utiliser la ligne de commande pour me connecter à des nœuds de docker distants, mais j'ai reçu un message Cannot connect to the Docker daemon at tcp://<remote_ip>:<port>. Is the docker daemon running?.

Oui, ils courent. Je me suis ajouté au groupe Docker et je peux accéder à Docker par SSHing dans les nœuds. Cependant, je ne peux accéder à aucun nœud Docker à distance.

J'ai modifié /etc/default pour ajouter/décommenter 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"

J'ai également modifié /etc/init.d/docker et /etc/init/docker.conf inclure DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock".

J'ai redémarré le service Docker, je me suis déconnecté et connecté plusieurs fois au cours du processus, mais je ne parviens toujours pas à me connecter au nœud distant. Je ne peux même pas me connecter au nœud local en passant l'IP.

Qu'est-ce que j'ai raté? Quelle configuration dans quel fichier expose l'API sur 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:~$

Modifier: En cours d'exécution ps aux | grep -i docker renvoie ceci -

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
13
Lord Loh.

J'ai trouvé une solution grâce à Post d'Ivan Krizsan .

Je devais éditer /lib/systemd/system/docker.service sur mon système Ubuntu 16.04.2 LTS pour modifier la ligne

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

puis

Sudo systemctl daemon-reload
Sudo systemctl restart docker.service

et tout a fonctionné :-). L'étape suivante consiste à comprendre comment protéger le formulaire de démon docker détourné.

22
Lord Loh.

Le répertoire/etc/default est l'endroit où les responsables de la distribution placent leurs fichiers de configuration. Si vous installez Docker directement à partir des référentiels de Docker, ce répertoire ne sera pas utilisé.

Le répertoire/lib/systemd est l'endroit où les packages installeront leurs fichiers systemd, et ils écraseront toutes les modifications lors de la mise à niveau. Si vous l'utilisez, vos modifications seront perdues.

Pour apporter vos propres modifications à un fichier d'unité systemd qui persistent, vous pouvez créer un fichier d'unité dans /etc/systemd/system/docker.service.d/, par ex. voici mon /etc/systemd/system/docker.service.d/override.conf standard:

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

Cette substitution désactive simplement tous les indicateurs de ligne de commande pour le démon dockerd de systemd. Une fois cela fait, vous pouvez remplacer chaque paramètre de /etc/docker/daemon.json qui est utilisé par docker et, selon le paramètre, peut être rechargé sans redémarrer le démon. Par exemple. voici un exemple /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
}

Pour vos besoins, vous n'avez besoin que de la ligne pour définir les hôtes.

Les paramètres TLS sont une partie extrêmement importante du fichier de configuration ci-dessus. Si vous ne configurez pas TLS mutuel entre le client et le serveur, et que vous ouvrez Docker pour écouter sur le réseau, vous exécutez l'équivalent d'un serveur Telnet ouvert avec des connexions root autorisées sans mot de passe. Si vous préférez ssh à telnet, ou si vous préférez avoir un mot de passe pour votre compte root, vous devez configurer TLS. Les ports de l'API Docker sont fréquemment analysés sur Internet et vous trouverez des logiciels malveillants installé sur votre hôte dans un court laps de temps si jamais vous sautez cette étape de configuration.

Tous les détails sur la façon de configurer les clés TLS pour le client et le serveur sont disponibles sur: https://docs.docker.com/engine/security/https/

4
BMitch

Si vous ne voulez pas reconfigurer et redémarrer votre démon docker, vous pouvez simplement relier le socket unix à un socket TCP en utilisant ncat (à partir du package nmap ):

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

Comme alternative, vous pouvez utiliser socat ou autres outils .

2
eadmaster

Il existe une documentation officielle décrivant comment Configurer où le démon Docker écoute les connexions .

systemd vs daemon.json

La configuration de Docker pour écouter les connexions à l'aide du fichier d'unité systemd et du fichier daemon.json provoque un conflit qui empêche Docker de démarrer.

Configuration de l'accès à distance avec le fichier d'unité systemd

  1. Utilisez la commande Sudo systemctl edit docker.service pour ouvrir un fichier de remplacement pour docker.service dans un éditeur de texte.

  2. Ajoutez ou modifiez les lignes suivantes en remplaçant vos propres valeurs.

    [Service]
    ExecStart=
    ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
    
  3. Enregistrez le fichier.

  4. Rechargez la configuration systemctl.

    $ Sudo systemctl daemon-reload
    
  5. Redémarrez Docker.

    $ Sudo systemctl restart docker.service
    
  6. Vérifiez si la modification a été respectée en examinant la sortie de netstat pour confirmer que dockerd écoute sur le port configuré.

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

Configuration de l'accès à distance avec daemon.json

  1. Définissez le tableau d'hôtes dans /etc/docker/daemon.json pour se connecter au socket UNIX et à une adresse IP, comme suit:

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

    La configuration de Docker pour écouter les connexions à l'aide du fichier d'unité systemd et du fichier daemon.json provoque un conflit qui empêche Docker de démarrer.

    1. Ajoutez ou modifiez les lignes suivantes en remplaçant vos propres valeurs.

      [Service]
      ExecStart=
      ExecStart=/usr/bin/dockerd
      
    2. Enregistrez le fichier.

    3. Rechargez la configuration systemctl.

      $ Sudo systemctl daemon-reload
      
  2. Redémarrez Docker.

  3. Vérifiez si la modification a été respectée en examinant la sortie de netstat pour confirmer que dockerd écoute sur le port configuré.

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

Le client Docker honorera le DOCKER_Host variable d'environnement pour définir le -H drapeau pour le client. Utilisez l'une des commandes suivantes:

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

ou

$ export DOCKER_Host="tcp://127.0.0.1:2375"
$ docker ps
1
ROY