Esta pagina se ve mejor con JavaScript habilitado

Registry Docker

 ·  🎃 kr0m

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:

curl http://distfiles.gentoo.org/releases/amd64/autobuilds/current-stage3-amd64/stage3-amd64-20150723.tar.bz2 | bzcat | docker import - ‘gentoo’
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:

vi /etc/conf.d/docker

DOCKER_OPTS="--insecure-registry=registry.alfaexploit.com:5000"
/etc/init.d/docker stop
/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:

mkdir -p /var/lib/docker/certs
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:

mkdir -p /etc/docker/certs.d/registry.alfaexploit.com:5000/
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 1 -s TRUSTED_HOST -p tcp –dport 5000 -j ACCEPT
iptables -I INPUT 2 -p tcp –dport 5000 -j DROP

Si se ha configurado con TCP plano:

docker run -d -p 5000:5000 –restart=always –name registry registry:2

Si se ha configurado TLS:

docker run -d -p 5000:5000 -v /var/lib/docker/certs:/certs -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.alfaexploit.com.crt -e REGISTRY_HTTP_TLS_KEY=/certs/registry.alfaexploit.com.key –restart=always –name registry registry:2

Por defecto las imágenes se almacenan dentro del contenedor, si queremos hacerlo en un directorio externo podemos hacerlo utilizando volúmenes:

docker run -d -p 5000:5000 -v /var/lib/docker/certs:/certs -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.alfaexploit.com.crt -e REGISTRY_HTTP_TLS_KEY=/certs/registry.alfaexploit.com.key -v /myregistrydata:/var/lib/registry -e REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/var/lib/registry –restart=always –name registry registry:2

Podemos ver las imágenes locales, para subirla al repo hay que tagearla indicando el servidor registry y el puerto:

docker ps

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            
docker images
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 tag gentoo/mysql registry.alfaexploit.com:5000/kr0m/gentoo_mysql
docker push registry.alfaexploit.com:5000/kr0m/gentoo_mysql

Efectivamente ahora tenemos una imágen nueva que se descargaría del server registry:

docker images

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:

docker run -i -t registry.alfaexploit.com:5000/kr0m/gentoo_mysql /bin/bash

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

Si te ha gustado el artículo puedes invitarme a un RedBull aquí