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.
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.