Preparar servidor público para Docker-ce

El programa de hoy trata sobre cómo levantar servicios de docker en un servidor público que podéis contratar en cualquier lugar, por ejemplo en Neodigit, que es donde trabajo y donde os atenderán de maravilla.

El primer paso será instalar los requisitos previos para docker-ce que son:

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

Luego tendremos que añadir el repositorio con su llave previa e instalar docker-ce:

sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
sudo apt-get update
sudo apt-get install docker-ce

Una vez instalado docker-ce en el servidor remoto configuraremos docker para que acepte conexiones desde fuera, para ello editaremos /lib/systemd/system/docker.service y modificaremos la siguiente línea:

ExecStart=/usr/bin/dockerd -H fd://

Por esta otra

ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:4243

Tened cuidado porque esta parte de la configuración al usar docker-ce es diferente al antiguo docker.io pues ya no se edita más el /etc/default/docker y el puerto por defecto también cambia.

Ahora podemos configurar el firewall y las actualizaciones automáticas:

apt-get install iptables
iptables -A INPUT -s x.x.x.x/32 -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT

mkdir /etc/iptables
iptables-save > /etc/iptables/rules.v4
apt-get install iptables-persistent

apt-get install unattended-upgrades
dpkg-reconfigure --priority=low unattended-upgrades

donde x.x.x.x es vuestra IP, luego tendremos que ir añadiendo más servicios además del ssh en el puerto 22, como es el puerto 4243 que hemos utilizado para docker:

iptables -A INPUT -s x.x.x.x/32 -p tcp -m tcp --dport 4243 -m state --state NEW -j ACCEPT

Y después de cada iteración guardamos la configuración:

iptables-save > /etc/iptables/rules.v4

Aunque yo lo que suelo hacer a veces es editar el fichero de rules.v4 y luego hace un restore, en fin, para gustos colores.

En mi caso me voy a apoyar en portainer, del que ya hablé en el capítulo Podcast #86: Portainer y docker remoto y en el Podcast #61: Gestión de contenedores Docker con portainer. Ojo que el capítulo 86 está grabado con docker.io y este con docker.ce y es ahí donde están las diferencias comentadas antes.

En nuestro portainer añadiremos el endpoint correspondiente y ya podremos empezar a trabajar con ello.

Para instalar portainer en vuestro PC o donde queráis recordad que podéis ver las instrucciones en portainer.io, pero que de todos modos es algo tan sencillo como instalar docker y luego

docker volume create --name portainer_data
docker run --restart=always -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data portainer/portainer
En este punto para levantar servicios tenemos dos opciones de funcionamiento:
  1. Tenemos una IP pública por cada servicio.
  2. Tenemos un puerto diferente por cada servicio.
  3. Vamos compartiendo el puerto para varios servicios y utilizamos un balanceador o proxy.

La configuración de un proxy con nginx ya la comentamos en el Podcast #86: Portainer y docker remoto de este mismo podcast.

Por poner un ejemplo os dejo aquí la configuraicón de mi proxy http para que veáis como he montado el proxy para mi lector de feeds.

root@faa9c71eee55:/etc/nginx/conf.d# cat default.conf
server {
listen 80;#Puerto de escucha
server_name rss.eduardocollado.com; #Nombre o IP de servidor
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
set $match "$1::$http_referer";
proxy_pass http://172.17.0.3; #ip privada y puerto si es distinto a 80
}

Enlace relacionado:

Colaboratorio: Redes en Docker: exposición de puertos


La música de hoy es de Kevin MacLeod y podéis descargarla de https://incompetech.com/