El docker
El programa CLI es independiente del demonio Docker que ejecuta sus contenedores. Aunque ambos componentes normalmente se ejecutan en su máquina local, puede ejecutar docker
comandos contra un host Docker remoto.
El uso de un host remoto puede ser útil en algunos escenarios. Puede configurar una instalación compartida de Docker Engine para un pequeño equipo de desarrollo. Luego, cada desarrollador podría conectarse a los contenedores remotos con su docker exec
local. comando.
Los hosts remotos suelen ser más valiosos cuando se tiene un servidor potente sin utilizar. Si su computadora portátil funciona lentamente o se está quedando sin almacenamiento, el uso de un host Docker dedicado en su red puede aumentar considerablemente el rendimiento. Todavía obtienes toda la comodidad del docker
local CLI en su terminal.
Configurando el host remoto
Asegúrese de tener Docker instalado en el sistema que será su host remoto. Solo necesitas el docker-cli
paquete en su máquina local, ya que no ejecutará Docker Engine.
Una instalación nueva de Docker proporciona un socket Unix de forma predeterminada. El acceso remoto requiere un socket TCP. Ejecute dockerd
(el ejecutable del demonio Docker) con -H
marca para definir los sockets a los que desea vincularse.
sudo dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
Este comando vinculará a Docker con el socket predeterminado de Unix y el puerto 2375 en la dirección de bucle invertido de su máquina. Puede vincular sockets y direcciones IP adicionales repitiendo -H
bandera.
Las banderas deben pasarse cada vez que ejecuta dockerd
. Si desea que persistan después de reiniciar, cree un alias de shell o modifique la definición del servicio Docker. Así es como puede lograr esto último con systemd
, que la mayoría de las distribuciones de Linux utilizan para la gestión de servicios.
Edite /etc/systemd/system/docker.service.d/options.conf
(o créelo si no existe). Encuentra el [Service]
sección y cambie el ExecStart
línea:
[Service] ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
Vuelva a cargar su systemd
configuración para aplicar los cambios:
sudo systemctl daemon-reload
Si Docker ya se está ejecutando, use sudo systemctl restart docker
para reiniciar el servicio. El demonio Docker ahora se vinculará al puerto TCP 2375 cada vez que se inicie. Asegúrese de que la configuración de su cortafuegos permita el tráfico al puerto. Si está utilizando ufw, ejecute ufw allow 2375
para abrir el puerto.
Conexión al host remoto
La CLI de Docker utiliza el DOCKER_HOST
variable de entorno para determinar el host al que conectarse. El socket Unix del demonio local se utilizará cuando la variable no esté configurada.
Puede usar un host remoto para un solo docker
comando anteponiendo el DOCKER_HOST
variables:
DOCKER_HOST=tcp://192.168.0.1:2375 docker run httpd:latest -d
Esto iniciará un nuevo contenedor desde el httpd:latest
imagen usando el motor Docker en 192.168.0.1:2375
.
Si va a ejecutar varios comandos en una sesión, exporte el DOCKER_HOST
variable en su shell:
export DOCKER_HOST=tcp://192.168.0.1:2375 docker run httpd:latest -d --name httpd docker ps docker rm httpd --force
Puedes hacer docker
use siempre un host remoto configurando DOCKER_HOST
globalmente en el archivo de configuración de su shell. Así es como lo harías en Bash:
echo "export DOCKER_HOST=tcp://192.168.0.1:2375" >> ~/.bashrc
Ahora el DOCKER_HOST
la variable de entorno se establecerá cada vez que se inicie su shell.
Mejora de la seguridad
El socket TCP básico está desprotegido. Cualquiera que pueda comunicarse con su máquina a través de la red puede usar el socket Docker para controlar sus contenedores.
Docker admite SSH en lugar de TCP. Esta suele ser una mejor opción si el host tiene un servidor SSH disponible. Evita que los usuarios no autenticados obtengan acceso. El uso de SSH no requiere configuración adicional. DOCKER_HOST
le permite pasar una cadena de conexión SSH:
DOCKER_HOST=ssh://user@hostname docker run -d --name httpd
Alternativamente, puede usar enlaces SSH para vincular directamente el socket Docker Unix del host remoto a su máquina local:
ssh -L /var/run/docker.sock:/var/run/docker.sock
Ahora no necesita usar DOCKER_HOST
en absoluto. El docker.sock
remoto estará vinculado a su contraparte local. Docker lo detectará automáticamente como su socket Unix estándar.
El uso de una de las soluciones basadas en SSH es la forma preferida de acercarse a la seguridad del demonio Docker. Docker también es compatible con TLS si proporciona una autoridad de certificación y claves de servidor y cliente:
dockerd --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H=0.0.0.0:2375
Ahora los clientes podrán conectarse en el puerto 2375 si presentan un certificado SSL válido de confianza de la autoridad de certificación ca.pem
.
RELACIONADO: ¿Qué es un archivo PEM y cómo se usa?
Creación de contextos
Docker le permite configurar varios "contextos" para conectarse a diferentes hosts. Se pueden usar contextos en lugar de DOCKER_HOST
Variable ambiental. Facilitan el cambio entre varios hosts remotos.
docker context create --docker host=tcp://192.168.0.1:2375 --description remote docker context create --docker host=unix:///var/run/docker.sock --description local
Estos comandos crean dos contextos diferentes:uno para su docker.sock
local y uno para una conexión remota.
Puede cambiar entre contextos usando el docker context use
comando:
docker context use remote # Container is started on "remote" docker run httpd:-latest -d docker context use local # Lists containers running on "local" docker ps
Los contextos son útiles cuando trabaja con varios hosts de Docker. Son menos complicados que restablecer continuamente el DOCKER_HOST
variable a medida que se mueve entre hosts.
Desventajas de los hosts remotos
Señalamos anteriormente que un host remoto puede mejorar el rendimiento de la compilación. Esta afirmación solo es cierta si la máquina que ejecuta Docker Engine es más rápida que su hardware local. El mayor inconveniente de un host remoto es la sobrecarga adicional de interactuar a través de la red. También se vuelve dependiente de la red:si pierde la conectividad, no podrá administrar sus contenedores.
Debe tener una conexión de red confiable de alta velocidad si va a utilizar un host remoto como su servidor de compilación principal. La primera docker build
stage envía el contenido del contexto de compilación de su imagen (generalmente su directorio de trabajo) a Docker Engine. Esto es rápido cuando Docker se ejecuta localmente, pero puede tardar mucho más en cargarse en una máquina remota.
Exponer una instancia de daemon de Docker a través de la red es un riesgo de seguridad. Debe asegurarse de que el acceso esté restringido a usuarios y dispositivos autorizados. La exposición involuntaria de un socket de daemon de Docker podría dar a los atacantes acceso ilimitado al host. Docker generalmente se ejecuta como root
por lo tanto, es fundamental que solo las personas de confianza puedan iniciar contenedores.
Conclusión
La configuración de un host Docker remoto le permite separar las instancias de su contenedor de su máquina de desarrollo local. Un servidor de compilación de Docker dedicado puede ofrecer un rendimiento mejorado y un mayor espacio de almacenamiento de imágenes.
Debe tener cuidado de auditar la seguridad de su implementación. Un socket TCP simple puede ser seguro en una red privada, pero no debe implementarse en ningún entorno sensible. El uso de SSH ayuda a mitigar los riesgos si practica una buena higiene de seguridad de SSH, como la autenticación obligatoria basada en claves.