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 <[email protected]> = 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:
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:
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:
Conferindo os dois no Dockerhub (Registry):
Até a próxima!