¿Cómo expongo la API de Docker sobre TCP?

13

Estoy usando portainer y no puedo administrar puntos finales remotos. Intenté usar la línea de comando para conectarme a los nodos remotos del acoplador, pero recibí un mensaje Cannot connect to the Docker daemon at tcp://<remote_ip>:<port>. Is the docker daemon running?.

Sí, ellos están corriendo. Me agregué al grupo de acopladores y puedo acceder a los acopladores mediante SSH en los nodos. Sin embargo, no puedo acceder a ningún nodo acoplable de forma remota.

Modifiqué /etc/defaultpara agregar / descomentarDOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"

También modifiqué /etc/init.d/dockere /etc/init/docker.confincluí DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock".

Reinicié el servicio de Docker, cerré sesión e inicié sesión varias veces en el proceso, pero aún no puedo conectarme al nodo remoto. Ni siquiera puedo conectarme al nodo local pasando la IP.

¿Qué me perdí? ¿Qué configuración en qué archivo expone la API sobre 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:~$

Editar: Ejecutar ps aux | grep -i dockerdevuelve esto -

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
fuente
¿Está escuchando 2375? ss -ntl
jscott
No. No hay nada escuchando en 2375. Y no puedo entender qué configuración en qué archivo afecta esto. He incluido el resultado de ps auxen mi respuesta si eso ayuda.
Lord Loh
Intenté cosas similares y sospecho que los archivos / etc / default / docker, /etc/init/docker.conf y /etc/init.d/docker simplemente se ignoran en Ubuntu 16.04 con una instalación de docker-ce, ¿alguien puede confirmar? ? Creo que cuando ejecuto "service docker status" lo que realmente sucede es "systemctl status docker", un sistema de administración completamente diferente.
chrisinmtown

Respuestas:

21

Encontré una solución gracias a la publicación de Ivan Krizsan .

Tuve que editar /lib/systemd/system/docker.serviceen mi sistema Ubuntu 16.04.2 LTS para modificar la línea

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

luego

sudo systemctl daemon-reload
sudo systemctl restart docker.service

y todo funcionó :-). El siguiente paso es descubrir cómo proteger el formulario de Docker Daemon que está siendo secuestrado.

Lord Loh
fuente
1
Confirmo que este cambio hace que Dockerd escuche las solicitudes HTTP en Ubuntu 16.04 con docker-ce ver 17.06. Simplemente se siente mal modificar el script de servicio directamente.
chrisinmtown
77
Nunca edite el script de servicio de Docker (o cualquier script de servicio) directamente. SystemD tiene una función de edición diferencial incorporada. Use systemctl edit docker.servicey systemctl creará un nuevo archivo con sus ediciones. Esto evita que una actualización borre sus cambios. SystemD fusionará los dos archivos en tiempo de ejecución. Buen documento aquí: digitalocean.com/community/tutorials/…
Routhinator
¡Gracias! Esto es terriblemente útil. Sigo recibiendo advertencias durante las actualizaciones. Investigaré esto: _)
Lord Loh.
44
En Ubuntu Server 18.04, funcionó así:ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:4243
LUCIAN ALEXA
Cuando uso la -H tcp://configuración por sí mismo, sin el -H fd://ajuste, no puedo emitir y los comandos del cliente, por ejemplo .., información estibador, versión estibador, etc.
Chris F
2

El directorio / etc / default es donde los encargados de la distribución colocan sus archivos de configuración. Si instala Docker directamente desde los repositorios de Docker, este directorio no se utilizará.

El directorio / lib / systemd es donde los paquetes instalarán sus archivos systemd, y sobrescribirán cualquier cambio allí en la actualización. Si usa esto, sus cambios se perderán.

Para realizar sus propios cambios en un archivo de unidad systemd que persisten, puede crear un archivo de unidad en /etc/systemd/system/docker.service.d/, por ejemplo, aquí está mi /etc/systemd/system/docker.service estándar. d / override.conf:

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

Esa anulación simplemente deshabilita todos los indicadores de línea de comando para el demonio dockerd de systemd. Una vez hecho esto, puede anular cada configuración de /etc/docker/daemon.json que utiliza Docker, y dependiendo de la configuración, se puede volver a cargar sin reiniciar el demonio. Por ejemplo, aquí hay un ejemplo /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
}

Para sus propósitos, solo necesita la línea allí para configurar los hosts.

Una parte extremadamente importante del archivo de configuración anterior son las configuraciones de TLS. Si no configura TLS mutuo entre el cliente y el servidor, y abre la ventana acoplable para escuchar en la red, está ejecutando el equivalente de un servidor Telnet abierto con inicios de sesión raíz permitidos sin contraseña. Si prefiere ssh sobre telnet, o si prefiere tener una contraseña para su cuenta raíz, debe configurar TLS. Los puertos de la API de Docker se escanean con frecuencia en Internet, y encontrará malware instalado en su host en poco tiempo si alguna vez omite este paso de configuración.

Los detalles completos sobre cómo configurar las claves TLS para el cliente y el servidor se pueden encontrar en: https://docs.docker.com/engine/security/https/

BMitch
fuente
1
Una muy buena respuesta que sobrevivirá a futuras actualizaciones del servicio de Docker. Esta es la forma correcta de hacerlo.
Fopedush el
2

Si no desea reconfigurar y reiniciar su Docker Daemon, simplemente puede conectar el socket Unix a un socket TCP utilizando ncat(desde el nmappaquete):

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

Como alternativa, puede usar socat u otras herramientas .

Eadmaster
fuente
¡increíble! ¿Puedo encontrar este comando en segundo plano? cuando cierro mi conexión de terminal se pierde
Felix
ah encontré nohupy&
Felix
0

Existe una documentación oficial que describe cómo configurar dónde el demonio Docker escucha las conexiones .

systemd vs daemon.json

La configuración de Docker para escuchar conexiones utilizando el archivo de unidad systemd y el archivo daemon.json provoca un conflicto que impide que Docker se inicie.

Configuración de acceso remoto con archivo de unidad systemd

  1. Use el comando sudo systemctl edit docker.service para abrir un archivo de anulación para docker.service en un editor de texto.

  2. Agregue o modifique las siguientes líneas, sustituyendo sus propios valores.

    [Service]
    ExecStart=
    ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
    
  3. Guarda el archivo.

  4. Vuelva a cargar la configuración systemctl.

    $ sudo systemctl daemon-reload
    
  5. Reinicie Docker.

    $ sudo systemctl restart docker.service
    
  6. Verifique si el cambio se cumplió revisando la salida de netstat para confirmar que dockerd está escuchando en el puerto configurado.

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

Configurar acceso remoto con daemon.json

  1. Establezca la matriz de hosts en /etc/docker/daemon.json para conectarse al zócalo UNIX y una dirección IP, de la siguiente manera:

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

    La configuración de Docker para escuchar conexiones utilizando el archivo de unidad systemd y el archivo daemon.json provoca un conflicto que impide que Docker se inicie.

    1. Agregue o modifique las siguientes líneas, sustituyendo sus propios valores.

      [Service]
      ExecStart=
      ExecStart=/usr/bin/dockerd
      
    2. Guarda el archivo.

    3. Vuelva a cargar la configuración systemctl.

      $ sudo systemctl daemon-reload
      
  2. Reinicie Docker.

  3. Verifique si el cambio se cumplió revisando la salida de netstat para confirmar que dockerd está escuchando en el puerto configurado.

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

El cliente Docker respetará la DOCKER_HOSTvariable de entorno para establecer el -Hindicador para el cliente. Use uno de los siguientes comandos:

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

o

$ export DOCKER_HOST="tcp://127.0.0.1:2375"
$ docker ps
ROY
fuente