Criando imagens Docker com Dockerfile

Veja nesse artigo como criar ou modificar uma imagem docker a partir do arquivo Dockerfile no Docker.

[ Hits: 23.003 ]

Por: Rafael Brito Gomes em 22/04/2015


Introdução



Nesse artigo que escrevi sobre Docker, expliquei como modificar uma imagem docker usando COMMIT. Mas, propositalmente, não comentei que essa não é a melhor prática.

Evitei tocar nesse assunto para não frustrar o aprendizado, pois é necessário aprender como funciona o COMMIT, com DIFF e afins.
Linux: Criando imagens Docker com Dockerfile
A melhor forma de modificar uma imagem Docker é recriando-a, ou seja, modificando seu Dockerfile ou criando um Dockerfile novo tendo a imagem escolhida como base. Nesse artigo, falaremos sobre tudo isso.

Dockerfile

Dockerfile é um arquivo que contém um conjunto de instruções necessárias para se criar uma imagem Docker, ou seja, com posse do Dockerfile de uma determinada imagem, basta modificar o que deseja e recriar a imagem "do zero".

Isso pode demorar um pouco mais, mas essa imagem será muito mais "enxuta" e você terá controle total do seu estado, o que seria bem mais difícil no modelo de efetuar Commit de um container.

Caso não tenha o Dockerfile, você pode usar uma imagem à sua escolha como base e então criar a sua imagem como uma camada acima.

Sintaxes básicas

FROM :: É a imagem base. Normalmente é usada com nome de distribuição (Debian, Ubuntu e afins), pois não precisaremos criar toda estrutura, certo?

MAINTAINER :: É onde se especifica o autor da imagem.

RUN :: São as instruções que serão executadas para criação da imagem em questão.

ENTRYPOINT :: Especifica o que o que será executado ao iniciar o container. Ele age como precedente à sintaxe CMD, ou seja, caso o ENTRYPOINT seja "top", o CMD pode ser "-b", que nesse caso ele executaria o top em modo batch. Uma vez que o ENTRYPOINT não seja especificado, e um CMD seja usado, o ENTRYPOINT padrão é "/bin/sh -c".

EXPOSE :: Usado para informar qual porta o container docker irá "escutar". Docker usa essa informação para interconexão entre containers, ao utilizar links. EXPOSE não define qual porta será exposta para o hospedeiro ou tornar possível o acesso externo para portas do container em questão. Para expor essas portas, utilize em tempo de inicialização da imagem a flag "-p" ou "-P".

Para explicação mais exaustiva das sintaxes já explanadas e outras novas, acesse essa documentação

Criando a imagem

Crie uma pasta com o comando abaixo:

# mkdir nginx

Entre nessa pasta:

# cd nginx

Então, crie um arquivo chamado "Dockerfile" com o seguinte conteúdo:

FROM debian
MAINTAINER Rafael Gomes <gomex@riseup.net>
RUN apt-get update
RUN apt-get install -y nginx
ENTRYPOINT ["/usr/sbin/nginx"]
EXPOSE 80

Com esse Dockerfile, temos:
  • Uma imagem com base na imagem do Debian, ou seja, não precisamos nos preocupar com o sistema básico.
  • O autor dessa imagem sou eu. :)
  • Primeiro eu atualizo a base do APT-GET e então instalo o nginx.
  • Ao iniciar essa imagem, ela executará o nginx automaticamente.
  • A porta exposta para possível interconexão entre containers é a 80.

Neste link tem um ótimo documento explicando as boas práticas na criação de um Dockerfile.

Com o Dockerfile preenchido, execute o comando abaixo para criar sua imagem:

# docker build -t=gomex/nginx .

Substitua "gomex" pelo seu usuário da nuvem pública do docker. E no lugar de "nginx", o nome da sua imagem.

Ao terminar, pode efetuar o push para a nuvem pública e assim proporcionar a distribuição da sua imagem:

# docker push gomex/nginx

Pronto! Agora já tem sua imagem prontinha, totalmente "enxuta" e disponível para que outra pessoa possa baixar e utilizar.

Por hoje é só pessoal. Logo teremos mais artigos sobre Docker.

Fiquem atentos.

   

Páginas do artigo
   1. Introdução
Outros artigos deste autor

Monitorando automaticamente o Docker com Zabbix

Docker - Infraestrutura simples e rápida

Leitura recomendada

Compiz e as estações do ano

Mapa da Cultura no Debian 7.0 - Instalação com Nginx usando Phusion Passenger

Bacula - Instalação no XenServer 6

Café com leite, gerenciador de lan house e cyber café

Terminator - Multiterminais em Janela Única

  
Comentários
[1] Comentário enviado por tonnytg em 26/01/2016 - 10:16h

Você citou no artigo que é mais seguro e boa prática gerar uma nova imagem com o processo do arquivo Dockerfile,
porém você utiliza uma imagem já criada no sistema. Acredito que a informação ficou vaga, pois tenho duas interpretações e isso me deixa confuso.

Dúvidas :
1 - Gerar uma nova imagem não seria do zero ? Instalar e formatar com os arquivos ?
2 - O que você está fazendo com o Dockerfile é a mesma coisa que o Commit baseado na imagem base ubuntu por exemplo, não vi vantagem se ambos processos utilizarem a base por exemplo #docker pull ubuntu"



Att. Antonio Thomacelli Gomes
http://www.tonnytg.com.br

[2] Comentário enviado por gomex em 26/01/2016 - 22:46h


Você citou no artigo que é mais seguro e boa prática gerar uma nova imagem com o processo do arquivo Dockerfile,
porém você utiliza uma imagem já criada no sistema. Acredito que a informação ficou vaga, pois tenho duas interpretações e isso me deixa confuso.

Dúvidas :
1 - Gerar uma nova imagem não seria do zero ? Instalar e formatar com os arquivos ?


Não. Gerar uma nova imagem é usar uma imagem como base e informar apenas o que deseja mudar via especificação do Dockerfile.


2 - O que você está fazendo com o Dockerfile é a mesma coisa que o Commit baseado na imagem base ubuntu por exemplo, não vi vantagem se ambos processos utilizarem a base por exemplo #docker pull ubuntu"


Não, no Dockerfile você tem a mudança rastreável em um arquivo descritivo (Dockerfile). No caso do Commit você faz tudo manual e depois executa um commit para aplicar suas mudanças a partir de uma imagem base.

[3] Comentário enviado por Lisandro em 28/06/2016 - 11:46h

Parabéns. Muito bom.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts