Docker – Como criar seu próprio servidor de imagens Docker com o Docker Registry

devopslab.com.br

Docker – Como criar seu próprio servidor de imagens Docker com o Docker Registry

Normalmente quando você quer subir um container docker você utiliza as imagens do Docker Hub, este é o padrão.
Porém você pode querer que suas imagens fiquem na sua própria infraestrutura.
Veja alguns motivos para ter seu próprio servidor de imagens Docker.

* Privacidade – Você não quer carregar suas imagens do Docker Hub, já que o Docker Hub é público, logo todos terão acesso as suas imagens Docker.
* Disponibilidade – Não depender unicamente do Docker Hub.
* Segurança – Configurar suas próprias políticas de segurança para o acesso as imagens.
* Velocidade – Mantendo seu servidor de imagens na sua própria rede, você não vai precisar baixar as imagens da internet, aumentando consideravelmente sua velocidade de download.
* CI e CD – Facilidade de integração contínua e entrega contínua, já que suas imagens personalizadas estarão disponíveis para todos os hosts Docker da sua infraestrutura.

Pré-requisitos e Infraestrutura

* Sistema operacional CentOS 7 x86_64 instalação mínima e atualizado.
* Recomendo ter um servidor dedicado para ser o repositório de imagens.
* Configure um domínio dedicado para o repositório de imagens.

Infraestrutura
1 Host Docker (Docker Engine).
1 Container Docker Registry (Servidor de Imagens) dentro do host Docker.

1. Instalação do Docker Engine

A ferramenta que vamos utilizar para criar o nosso servidor de imagens Docker é o Docker Registry.

Porém o Docker Registry precisa ter o Docker Engine instalado, então logado no seu Host Docker (CentOS 7) instale o Docker Engine.

Crie o repositório Docker.
#vi /etc/yum.repos.d/docker.repo

Instale o Docker Engine, inicie e habilite no startup do servidor.

#yum install docker-engine

#systemctl start docker

#systemctl enable  docker

2. Criação de um domínio para o servidor de imagens Docker Registry

Crie um domínio para ser o seu repositório. Este domínio tem que ter o mesmo IP do seu Host Docker (não é o Ip do container), já que ele precisa ser acessado de toda sua rede.

Meu domínio: repo-dockerimages.devopslab.com.br

3. Criação de Certificados SSL

Como nós queremos que nosso servidor de imagens fique acessível para todos os hosts da nossa rede, por padrão o Docker Registry vem habilitado para trabalhar via https, então nós vamos gerar um certificados SSL para o Docker Registry. Você pode e até recomendo utilizar certificados válidos, mas neste Lab vamos utilizar certificados auto-assinados.
*É possível desativar o certificado SSL.

#mkdir -p /etc/ssl/certs/docker

#openssl req -newkey rsa:4096 -nodes -sha256 -keyout /etc/ssl/certs/docker/repo-dockerimages.devopslab.com.br.key -x509 -days 365 -out /etc/ssl/certs/docker/repo-dockerimages.devopslab.com.br.crt

Preencha as informações do certificado e no campo “Common Name” configure seu domínio.

Penalidade ao utilizar certificado auto-assinados
Infelizmente ao utilizar certificados auto-assinados você terá que informar para todos os seus hosts Docker para confiar no certificado, bastando copiar o certificado .crt para todos os hosts Docker.
Se fossem certificados válidos isto não aconteceria.

#mkdir -p /etc/docker/certs.d/repo-dockerimages.devopslab.com.br:5000

#cp -v /etc/ssl/certs/docker/repo-dockerimages.devopslab.com.br.crt  /etc/docker/certs.d/repo-dockerimages.devopslab.com.br:5000

#systemctl restart docker

4. Instalação e configuração do servidor de imagens Docker Registry

Vamos instalar o Docker Registry, ele que vai armazenar e distribuir nossas imagens psts nossa Infraestrutura.

O Docker Registry roda dentro de um container, por isto instalamos o Docker Engine.

docker run -d -p 5000:5000 --restart=always --name repo-dockerimages -h repo-dockerimages.devopslab.com.br -v /etc/ssl/certs/docker:/etc/ssl/certs/docker -e REGISTRY_HTTP_TLS_CERTIFICATE=/etc/ssl/certs/docker/repo-dockerimages.devopslab.com.br.crt -e REGISTRY_HTTP_TLS_KEY=/etc/ssl/certs/docker/repo-dockerimages.devopslab.com.br.key registry:2

Porta 5000 – Mapeamos a porta 5000 do Docker Host para a porta 5000 do container Docker Registry.
repo-dockerimages – O nome do conteiner é repo-dockerimages e o hostname é repo-dockerimages.devopslab.com.br.
–restart=always – Inicia o container automáticamente em caso de reboot do Host Docker.
registry:2 – É a atual imagem do Docker Registry.
/etc/ssl/certs/docker – Mapeamos a pasta do Host Docker no container.
REGISTRY_HTTP_TLS_CERTIFICATE e REGISTRY_HTTP_TLS_KEY – São os certificados.

[root@docker-engine3 docker]# docker run -d -p 5000:5000 --restart=always --name repo-dockerimages -h repo-dockerimages.devopslab.com.br -v /etc/ssl/certs/docker:/etc/ssl/certs/docker -e REGISTRY_HTTP_TLS_CERTIFICATE=/etc/ssl/certs/docker/repo-dockerimages.devopslab.com.br.crt -e REGISTRY_HTTP_TLS_KEY=/etc/ssl/certs/docker/repo-dockerimages.devopslab.com.br.key registry:2

17135760f0d7f41cafda7d89ae28f23b784ffcaa9bc903442b8a462e96179a2f

Verifique o container e a imagem.
#docker ps; docker images

[root@docker-engine3 docker]# docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES

17135760f0d7        registry:2          "/bin/registry /etc/d"   31 seconds ago      Up 27 seconds       0.0.0.0:5000->5000/tcp   repo-dockerimages

[root@docker-engine3 docker]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

registry            2                   83139345d017        2 weeks ago         165.8 MB

[root@docker-engine3 docker]#

Copie uma imagem do Docker Hub
Você pode criar sua imagem tanto copiando do Docker Hub ou a partir de um arquivo Dockerfile. Neste caso nós vamos copiar o Ubuntu do Docker Hub.
#docker pull ubuntu

Registre a imagem no Docker Registre
#docker tag ubuntu repo-dockerimages.devopslab.com.br:5000/meuproprioubuntu:latest

Copie a imagem para o Docker Registry
#docker push repo-dockerimages.devopslab.com.br:5000/meuproprioubuntu:latest

Veja que minha imagem é baseada na última versão do Ubuntu, eu criei a imagem no Docker Registry com um nome personalizado, no caso meuproprioubuntu.

Baixe a imagem para o seu Docker Host
Logue em qualquer Host Docker da sua rede e crie um container baseado na imagem meuproprioubuntu.

Lembre-se de antes ter copiado o certificado .crt para a pasta /etc/docker/certs.d/dominio:5000

#docker pull repo-dockerimages.devopslab.com.br:5000/meuproprioubuntu

Crie um container Docker utilizando a imagem do seu repositório.
#docker run -i -t repo-dockerimages.devopslab.com.br:5000/meuproprioubuntu bash

[root@docker-engine1 /]# docker pull repo-dockerimages.devopslab.com.br:5000/meuproprioubuntu

Using default tag: latest

latest: Pulling from meuproprioubuntu

Digest: sha256:26dd18522d97a782202df80035d40c2b3d1f6732670c4650c5b099ceb3a7e17c

Status: Image is up to date for repo-dockerimages.devopslab.com.br:5000/meuproprioubuntu:latest

[root@docker-engine1 /]# docker run --name containerteste -h containerteste.com.br -i -t repo-dockerimages.devopslab.com.br:5000/meuproprioubuntu bash

root@containerteste:/# lsb_release -a

No LSB modules are available.

Distributor ID:    Ubuntu

Description:    Ubuntu 14.04.4 LTS

Release:    14.04

Codename:    trusty

root@containerteste:/# hostname

containerteste.com.br

Mais um exemplo.
Registrando uma imagem CentOS no Docker Registry.

# docker pull centos

# docker tag centos repo-dockerimages.devopslab.com.br:5000/centos

# docker push repo-dockerimages.devopslab.com.br:5000/centos

Criando um Container.

# docker run -ti repo-dockerimages.devopslab.com.br:5000/centos /bin/bash

# cat /etc/redhat-release

CentOS Linux release 7.2.1511 (Core)

Para finalizar
Em produção eu recomendo você utilizar um certificado válido, devido a segurança e agilidade, já que com um certificado válido você não precisará copiar o .crt para todos os hosts Docker.

Pense em colocar este servidor de imagens em HA, ou seja crie um Loadbalancer com pelo menos 2 servidores Docker Registry, e utilize algum cluster de Filesystem para armazenamento como GFS, Xtreemfs, NFS ou faça o mapeamento de pastas para um serviço pago de storage como o S3 da Amazon.

Tudo que foi escrito aqui você pode encontrar também em:
https://docs.docker.com/registry/

Obrigado

Leonardo Macedo Cerqueira

Comentários