El repositorio público de Docker está bien para hacer las pruebas iniciales de testing pero si se va a montar un entorno en producción es indispensable utilizar nuestras propias imágenes de sistemas operativos y nuestro propio servidor registry, de este modo tendremos nuestro repo de SO/Apps privado.
Para generar nuestra imágen base de gentoo es tan sencillo como bajarnos el stage3 de la web de gentoo e importarlo como imagen Docker:
docker run -ti gentoo /bin/bash
Si queremos tener nuestro propio github de imágenes de docker debemos instalar registry.
Este se puede configurar de dos modos:
- TLS: Idóneo para entornos en producción
- TCP: Testing
Si queremos utilizar TCP debemos modificar la config de Docker, estamos indicando en el servidor de cómputo que puede conectarse sin TLS al servidor de registry:
DOCKER_OPTS="--insecure-registry=registry.alfaexploit.com:5000"
/etc/init.d/docker start
En cambio si estamos montando un servidor que va a pasar a producción tenemos dos opciones:
- Comprar un certificado TLS: Solo hay que configurar la parte del servidor.
- Auto-generar un certificado: Hay que configurar el servidor y los clientes.
Yo voy a optar por autogenerarlo:
cd /var/lib/docker/certs
openssl req -newkey rsa:4096 -nodes -sha256 -keyout registry.alfaexploit.com.key -x509 -days 365 -out registry.alfaexploit.com.crt
Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:AAAAAAA
Locality Name (eg, city) []:BBBBBB
Organization Name (eg, company) [Internet Widgits Pty Ltd]:alfaexploit.com
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:registry.alfaexploit.com
Email Address []:kr0m@alfaexploit.com
En cada uno de los nodos de cómputo (el propio servidor también) metemos el certificado autofirmado como de confianza:
cp /var/lib/docker/certs/registry.alfaexploit.com.crt /etc/docker/certs.d/registry.alfaexploit.com:5000/ca.crt
/etc/init.d/docker stop
/etc/init.d/docker start
NOTA: Por supuesto registry.alfaexploit.com debe resolver al servidor de cómputo donde esté el contenedor con registry.
Filtramos el acceso a nuestro servidor registry por iptables tanto en servidores de testing como en servidores en producción:
iptables -I INPUT 2 -p tcp –dport 5000 -j DROP
Si se ha configurado con TCP plano:
Si se ha configurado TLS:
Por defecto las imágenes se almacenan dentro del contenedor, si queremos hacerlo en un directorio externo podemos hacerlo utilizando volúmenes:
Podemos ver las imágenes locales, para subirla al repo hay que tagearla indicando el servidor registry y el puerto:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e15dac3ce5a1 registry:2 "registry cmd/regist 23 seconds ago Restarting (1) 7 seconds ago 0.0.0.0:5000->5000/tcp registry
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
gentoo/mysql latest fd8d51641254 3 days ago 1.542 GB
gentoo/updated_sinpasswd latest c3b9f653bf61 3 days ago 1.175 GB
gentoo_imported latest b1c4c04c1d2b 3 days ago 1.345 GB
gentoo/updated latest 4eedf047deb9 3 days ago 1.175 GB
gentoo latest 264d2b032543 3 days ago 773.1 MB
registry 2 b4ad0b763f11 2 weeks ago 548.6 MB
docker push registry.alfaexploit.com:5000/kr0m/gentoo_mysql
Efectivamente ahora tenemos una imágen nueva que se descargarÃa del server registry:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
registry.alfaexploit.com:5000/kr0m/gentoo_apache latest 5e8bc79dc6de 3 days ago 1.187 GB
Para desplegar nuestro contenedor en otro nodo de cómputo:
Si hemos configurado TLS debemos aceptar nuestra CA como de confianza en cada nodo de cómputo:
mkdir -p /etc/docker/certs.d/registry.alfaexploit.com:5000/
scp
root@registry.alfaexploit.com
:/etc/docker/certs.d/registry.alfaexploit.com:5000/ca.crt /etc/docker/certs.d/registry.alfaexploit.com:5000/
/etc/init.d/docker stop
/etc/init.d/docker start