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!

  • Edson Junior

    Boa noite Ricardo eu acompanhei seus artigos gostei muito, eu estou iniciando com docker e tenho uma duvida. No meu caso eu trabalho com Symfony2, quando eu levanto um servidor com ngix ou apache, como eu faço para ter dois projetos diferente rodando? sendo os dois usando symfony2.

  • Edson Junior

    Boa noite Ricardo eu acompanhei seus artigos gostei muito, eu estou iniciando com docker e tenho uma duvida. No meu caso eu trabalho com Symfony2, quando eu levanto um servidor com ngix ou apache, como eu faço para ter dois projetos diferente rodando? sendo os dois usando symfony2.

  • Pingback: Primeiros passos com Docker – Aécio Pires()

  • Pingback: Primeiros passos com Docker – Aécio Pires()