Docker: Criando suas próprias imagens – Parte III/III

O post de hoje é pra mostrar como criar suas imagens do docker, publicá-las no Docker Hub (Registry) e depois usar/disponibilizar onde precisar.

O primeiro passo é instalar o docker:

 

Uma vez instalado, vamos iniciá-lo:

Agora vamos criar nosso diretório de trabalho

Dentro do nosso diretório de trabalho vamos criar dois arquivos para serem adicionados à nossa imagem pelo Dockerfile. Uma delas é um arquivo para ser configurado o repositório epel e outro é o conteúdo do index.html que será servido pelo nosso Nginx nesta demonstração:

O primeiro é o arquivo epel.repo:

O segundo o index.html:

Em seguida vamos criar nosso Dockerfile:

 

O que fazem estas linhas de comando:

FROM centos:6 = Indica que utilizaremos a imagem base do Centos 6, do repositório do CentOS no Dockerhub (Registry) (https://registry.hub.docker.com/_/centos/)

MAINTAINER Ricardo Martins <contato@ricardomartins.com.br> = O nome e contato do mantenedor da imagem

ADD epel.repo /etc/yum.repos.d/ = Adiciona o conteúdo do arquivo epel.repo dentro de /etc/yum.repos.d. Isto é necessário para que seja utilizado o repositório do Epel para a instalação do Nginx

RUN yum update -y = Atualiza o sistema

RUN yum install -y nginx = Instala o Nginx

RUN echo “daemon off;” >> /etc/nginx/nginx.conf = De acordo com o conceito de funcionamento do Docker, um container deve rodar apenas um serviço. Sendo assim, em vez de rodar serviços em background, devem rodar em foreground. Então este comando desabilita a execução do nginx como daemon.

RUN rm -rf /usr/share/nginx/html/* = Remove o conteúdo de /usr/share/nginx/html/

ADD index.html /usr/share/nginx/html/ = Adiciona o arquivo index.html em /usr/share/nginx/html/

CMD /usr/sbin/nginx -c /etc/nginx/nginx.conf = Informa o comando a ser executado ao iniciar o container

EXPOSE 80 = Usado para informar qual porta o container docker irá “escutar”.

Agora vamos criar nossa imagem com o comando abaixo:

Neste caso, estaremos criando a nossa imagem dentro do repositório rmartins/nginx com a tag teste. O “.” no final da linha informa para procurar o Dockerfile no diretório atual. A saída do comando está exibida abaixo, contendo todas as tasks realizadas:

Uma vez finalizado, podemos ver as imagens disponíveis no nosso cache local:

Note que temos duas imagens: 1601aa313bde e f6808a3e4d9e. A primeira é a que acabamos de gerar. A segunda é a que foi usada para gerar a nossa, uma vez que especificamos para utilizar uma imagem base do CentOS 6. O que aconteceu é que o docker baixou do repositório do CentOS no Dockerhub (Registry) e a imagem base do CentOS 6.

O próximo passo é publicar a nossa imagem no repositório do Dockerhub (Registry), uma vez que por enquanto ele existe apenas localmente. Para isso, você deve ter um usuário e senha previamente cadastrados em http://hub.docker.com. Depois de criar seu usuário, rode o comando de login e informe seus dados. No meu caso:

Feito isso você já está logado no Dockerhub (Registry), então basta fazer o push da sua imagem no seu repositório:

Feito isso, você já pode conferir a imagem no repositório. Neste caso, acesse em https://registry.hub.docker.com/u/rmartins/nginx/

Agora a imagem do nosso container já está disponibilizada para todos na internet. Aos interessados em usar, basta rodar o comando abaixo depois de instalar o docker:

Por padrão o docker irá procurar informada em cache. Neste caso encontrou pois criamos esta imagem localmente, porém se estivesse apenas testando uma imagem disponibilizada por alguem no Dockerhub (Registry), o docker iria realizar o download para a máquina e em seguida rodar o container desta imagem.

Conferindo a execução do container:

Ao acessar http://ip.do.host será visualizado o nginx rodando, com o index.html customizado:

Docker1

Fazendo alterações:

Se quiser, você pode acessar o shell do container e realizar alterações:

Seremos direcionados para dentro do container:

Então vou alterar o arquivo index.html, inserindo uma linha a mais, conforme abaixo:

 

Agora vamos sair do container (basta escrever “exit” – sem aspas) e visualizar as alterações:

E por fim criar uma nova imagem baseando-se no container atual:

Publicando no Dockerhub (Registry) a imagem alterada:

Note que não informei uma tag específica, então esta imagem ganha uma tag padrão, chamada latest.

Agora vou dar stop no container em execução:

E subir nossa outra imagem alterada:

Acessando:

Docker2

Mais um teste para finalizar. Identificando o container em execução com o nginx alterado:

Dando stop nele:

Iniciando o container com a imagem do Nginx original:

Validando:

Docker3

Conferindo os dois no Dockerhub (Registry):

Docker4

Até a próxima!