Criando um repositório local de imagens Docker

Criando um repositório local de imagens Docker
Yuri Matheus
Yuri Matheus

Compartilhe

Criei algumas imagens no Dockere queria compartilhá-las com os outros desenvolvedores da empresa. Para isso, consigo usar os próprios repositórios do Docker, como o Docker Hub, ou o Docker Store. Lá nós colocamos nossas imagens e elas ficam disponíveis para download.

Porém se eu colocar minha imagens nesses repositórios, só vou conseguir baixá-las se estiver com internet. Quero que essas imagens fiquem sempre disponíveis na minha rede local. Dessa forma mesmo sem internet terei acesso a elas.

Mas como posso criar um repositórios de imagens local?

Criando o repositório

O Docker trabalha com containers. Então, nada mais justo, que seu repositório de imagens também seja um container. Então para criarmos nosso repositório local basta iniciarmos um container.

No Docker, esse repositório local se chama Registry. Então para criarmos nosso repositório local, basta ir até o servidor e digitar:

docker run registry

Mas dessa maneira travamos o terminal com a execução desse container, ou seja, não podemos utilizar esse terminal enquanto nosso container estiver rodando. Para que isso não ocorra, basta falar para o Docker rodar nosso container no background (-d).

docker run -d registry

Nosso Registry está rodando, mas como vamos acessá-lo? Quando nós acessamos um serviço na rede, por exemplo o site da Alura, precisamos ter acesso a esse serviço. Ou seja, precisamos de uma porta de acesso.

No caso de sites, a porta padrão é a porta 80. Já o nosso registry utiliza por padrão a porta 5000.

Então vamos dizer ao Docker para ele iniciar nosso repositório mapeando a porta (-p) 5000 do nosso host para a porta **5000 **do nosso container.

docker run -d -p 5000:5000 registry

Uma boa prática quando criamos containers é dar nomes para eles. Isso facilita sua administração. Como estamos criando um repositório de imagens, podemos dar o nome (--name) repositorio.

docker run -d -p 5000:5000 --name repositorio registry

Se nosso container do Registry cair, será um problema? Precisamos garantir que mesmo se o container caia, outro suba em seu lugar. Ou seja, queremos reiniciar (--restart) nosso container sempre que ele cair:

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

Legal, temos nosso container rodando! Contudo, quando mapeamos a porta do container com a porta do host, apenas dissemos para o Docker qual a porta do host corresponde a porta do container. Ainda precisamos liberar essa porta no servidor.

Para liberar essa porta, basta dizer para o firewall (firewall-cmd) adicionar uma regra, que no nosso caso pode ser permanente (--permanent), e adicionar a porta (--add-port) que queremos liberar. Também precisamos dizer qual o protocolo de comunicação que, neste caso, é o protocolo tcp

firewall-cmd --permanent --add-port=5000/tcp

Agora temos que reiniciar o firewall para que nossa alteração fique válida:

firewall-cmd --reload

Pronto nosso repositório foi criado. Agora os computadores da nossa rede podem enviar imagens para ele. Mas como enviamos uma imagem para o registry?

Banner da Escola de DevOps: Matricula-se na escola de DevOps. Junte-se a uma comunidade de mais de 500 mil estudantes. Na Alura você tem acesso a todos os cursos em uma única assinatura; tem novos lançamentos a cada semana; desafios práticos. Clique e saiba mais!

Enviando imagens para o registry

Vamos tentar enviar uma imagem para o nosso repositório. Em outra máquina vamos pegar uma imagem, por exemplo a imagem do Wordpress, e criar uma referência entre ela e o nosso repositório.

Logo, queremos dizer para o docker criar uma referência (tag) da imagem do wordpress com o nosso repositório. Neste caso, vou utilizar o endereço IP do nosso registry, que no meu caso é o 192.168.0.10, na porta 5000. E o nome dessa imagem no repositório também será wordpress.

docker tag wordpress 192.168.0.10:5000/wordpress

Agora tudo que precisamos fazer é enviar, de fato, a imagem para o repositório. Para isso, utilizamos o comando docker push passando a imagem que queremos colocar no servidor que no nosso é 192.168.0.10:5000/wordpress

docker push 192.168.0.10:5000/wordpress

Hum… por que não funcionou? No nosso servidor criamos o nosso registry, liberamos a porta no firewall e mesmo assim não conseguimos enviar a imagem para ele.

Como nós não utilizamos nenhum método de autenticação, nem certificados de segurança, o Docker considera esse nosso repositório inseguro.

Para conseguir enviar imagens para o nosso repositório, precisamos dizer para o controlador do Docker que confiamos nesse registry. Ou seja, precisamos dizer isso para o Docker Daemon.

Para dizer para o Docker Daemon que confiamos no nosso repositório, precisamos editar o seu arquivo de configuração. No Ubuntu 16.04, esse arquivo fica em /lib/systemd/system/docker.service.

Neste arquivo existe uma linha escrita ExecStart, vamos comentar essa linha (#) e em baixo vamos realizar nossa configuração.

Vamos dizer que quando o Docker iniciar (ExecStart) o daemon do Docker (/usr/bin/dockerd) vai adicionar um repositório considerado inseguro (--insecure-registry):

ExecStart=/usr/bin/dockerd --insecure-registry 192.168.0.10:5000

Agora vamos pedir para o sistema (systemctl) reiniciar o daemon (daemon-reload) para que nossas configurações passem a valer. Como essas são as configurações do Docker, vamos reiniciar (restart) esse serviço também:

systemctl daemon-reload

systemctl restart docker

Agora se tentarmos enviar nossa imagem para o servidor, obteremos sucesso:

docker push 192.168.0.10:5000/wordpress

Para saber mais

Colocar um repositório inseguro não é uma boa prática de segurança. Neste caso, só utilizamos para entender como funciona o registry.

Para aumentar a segurança do nosso repositório, podemos criar sistemas de autenticação e utilizar certificados de segurança. Um exemplo de como faz essas configurações, está na documentação do Docker.

Perceba que as imagens ficam no container repositorio que está no servidor. Ou seja, se esse container for excluído as imagens se perderão.

Por isso, uma boa prática é criar volumes entre o container e a máquina host. Pois, mesmo se o container for excluído, temos uma cópia das imagens na máquina.

Neste caso utilizamos o endereço IP para se comunicar com o repositório. Porém, podemos utilizar um nome como uma URI. Para isso, temos que configurar um serviço de DNS.

Docker e containers são um dos assuntos mais comentados nos dias de hoje. Muitas coisas foram facilitadas pelos containers, tanto na parte de infraestrutura, quanto na parte do desenvolvimento.

Por isso aqui na Alura temos um curso de Docker. Nele você aprenderá sobre como o Docker funciona, como utilizar e criar containers, como criar suas próprias imagens e muito mais.

Como os containers estão sendo muito utilizados, algumas ferramentas foram criadas para facilitar sua administração. Uma ferramenta muito utilizada é o Kubernetes.

Com ele conseguimos gerenciar nossos containers, criar balanceamento de cargas entre nossos container e realizar sua comunicação de uma forma mais simples.

No curso de Kubernetes você vê algumas dessas técnicas e, no final, consegue realizar o deploy da aplicação na nuvem.

Yuri Matheus
Yuri Matheus

Yuri é desenvolvedor e instrutor. É estudante de Sistemas de Informação na FIAP e formado como Técnico em Informática no Senac SP. O seu foco é nas plataformas Java e Python e em outras áreas como Arquitetura de Software e Machine Learning. Yuri também atua como editor de conteúdo no blog da Alura, onde escreve, principalmente, sobre Redes, Docker, Linux, Java e Python.

Veja outros artigos sobre DevOps