Podemos habilitar el acceso remoto a Docker de cualquier host simplemente añadiendo el parámetro ‘-H tcp://0.0.0.0:2376’ cuando arrancamos el demonio de docker. Por ejemplo:
docker daemon -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock
El problema aquí es que abre una API Rest accesible desde cualquier sitio y por cualquiera. Si queremos montar un cluster de servidores Docker seguro deberemos hacer lo siguiente:
Generando los certificados de seguridad
Primero deberemos crear una autoridad certificadora para después generar los certificados de clientes y servidores. En mi caso, generaré un certificado para el servidor ‘midocker.com’. Aquí dejo todo el script para generar los certificados(Irá pidiendo passwords y configuraciones):
# Creamos las distintas carpetas mkdir certsdb mkdir certreqs mkdir crl mkdir private echo "01" > ca.srl # Generamos claves para nuestra RSA openssl genrsa -des3 -out "private/ca-private-key.pem" 2048 openssl req -new -x509 -days 365 -key "private/ca-private-key.pem" -out "private/ca-public-key.pem" # Generamos claves para nuestro servidor Docker(midocker.com) openssl genrsa -des3 -out "private/server-private-key.pem" 2048 # Solicitud de firma y firma del certificado del servidor openssl req -subj '/CN=midocker.com' -new -key "private/server-private-key.pem" -out "certreqs/server.csr" openssl x509 -req -days 365 -in "certreqs/server.csr" -CA "private/ca-public-key.pem" -CAkey "private/ca-private-key.pem" -CAserial "ca.srl" -out "certsdb/server-cert.pem" # Generamos las claves del cliente openssl genrsa -des3 -out "private/client-private-key.pem" 2048 # Solicitud de firma y firma del certificado del cliente openssl req -subj '/CN=client' -new -key "private/client-private-key.pem" -out "certreqs/client.csr" echo extendedKeyUsage = clientAuth > extfile.cnf openssl x509 -req -days 365 -in "certreqs/client.csr" -CA "private/ca-public-key.pem" -CAkey "private/ca-private-key.pem" -CAserial "ca.srl" -out "certsdb/client-cert.pem" -extfile extfile.cnf # Eliminamos clave de paso en el cliente y el servidor openssl rsa -in "private/server-private-key.pem" -out "private/server-private-key.pem" openssl rsa -in "private/client-private-key.pem" -out "private/client-private-key.pem"
Configuración del servidor Docker
Ahora que ya tenemos todos los certificados, vamos a arrancar nuestro servidor Docker para que haga uso de los certificados(Atención!! Acordaros de parar el servicio Docker si lo tenéis ya encendido):
sudo docker daemon --tlsverify –tlscacert="<path-to>/ca-public-key.pem" --tlscert="<path-to>/server-cert.pem" --tlskey="<path-to>/server-private-key.pem" -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock
De esta manera, la API Rest de Docker aceptará cualquier certificado que esté firmado por la autoridad certificadora.
Accediendo al Docker remoto
Si queréis acceder al docker remoto tendréis que ponerle a Docker los siguientes parámetros para indicarle el host, certificado, etc. (El siguiente ejemplo debería devolver los contenedores que se están ejecutando en el terminal):
docker --tlsverify –tlscacert="<path-to>/ca-public-key.pem" –tlscert="<path-to>/client-cert.pem" –tlskey="<path-to>/client-private-key.pem" -H=midocker.com:2376 ps
Bonus track 1: Configurando el servicio en Ubuntu
Si queremos que al iniciar el servidor arranque ya con esta configuración deberéis añadirle los parámetros en el fichero ‘/etc/init/docker.conf’:
# ... script # modify these in /etc/default/$UPSTART_JOB (/etc/default/docker) DOCKER=/usr/bin/$UPSTART_JOB DOCKER_OPTS= if [ -f /etc/default/$UPSTART_JOB ]; then . /etc/default/$UPSTART_JOB fi DOCKER_OPTS='--tlsverify –tlscacert="<path-to>/ca-public-key.pem" --tlscert="<path-to>/server-cert.pem" --tlskey="<path-to>/server-private-key.pem" -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock' exec "$DOCKER" -d $DOCKER_OPTS end script # ...
Una vez hecho esto podéis reiniciar el servicio(A mi me gusta siempre para y arrancar…):
# Paramos sudo service docker stop # Arrancamos sudo service docker start
Bonus track 2: Usando docker-machine
Si queréis usar docker-machine para la gestión de máquinas podéis crear la máquina con el siguiente comando:
docker-machine create -d none --url=tcp://midocker.com:2376 midocker.com
Una vez hecho esto deberéis editar la configuración del fichero ‘