devopslab.com.brDocker – 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.repoInstale 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 ubuntuRegistre a imagem no Docker Registre
#docker tag ubuntu repo-dockerimages.devopslab.com.br:5000/meuproprioubuntu:latestCopie a imagem para o Docker Registry
#docker push repo-dockerimages.devopslab.com.br:5000/meuproprioubuntu:latestVeja 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