Você pode criar uma imagem a partir de um container, por exemplo você criou um container qualquer, configurou as aplicações, serviços, instalou os pacotes necessários, enfim deixou o container pronto para uso.
Para não ter que repetir este processo toda vez, é possível criar uma imagem a partir deste container com o comando docker commit e distribuir a imagem para outros hosts Docker, Publicar no Docker Hub ou Docker Registry, ou simplesmente empacotar com o tar e distribuir da melhor forma que você achar. Vamos ver como isto funciona.
Criando uma container
#docker run -ti --name webserver-nginx -h webserver-nginx ubuntu /bin/bash
Criei um container com o nome webserver-nginx e hostname webserver-nginx.
Utilizei a imagem pública Ubuntu, que foi baixada do Docker Hub.
Instalei o Nginx e configurei, atualizei a imagem, instalei o Php e etc.
Criando uma imagem
#docker commit 3b64e4b39127 imagemnginx:versao1
3b64e4b39127 – É o ID do nosso container, é a partir dele que vamos fazer o commit e criar uma nova imagem. Você pode consultar o id do container pelo comando “docker ps”.
3b64e4b39127 → webserver-nginx
imagemnginx:versao1 – Criamos uma imagem com a tag versao1. Quando você atualizar uma imagem é recomendado você atualizar a tag, ela é o seu controle de versão.
Criação e consulta da imagem
[root@docker-engine1 ~]# docker commit 3b64e4b39127 imagemnginx:versao1 sha256:fc511188b2fadc7a6aa3c97b10d4f1e32eeab4721571690d5f90d949b8bedefa [root@docker-engine1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE imagemnginx versao1 fc511188b2fa 21 seconds ago 291.4 MB
Utilizando a nova imagem
Vamos criar um container a partir desta nova imagem.
docker run -ti -p 80:80 –name novo-nginx -h novo-nginx imagemnginx:versao1
[root@docker-engine1 ~]# docker run -ti -p 80:80 --name novo-nginx -h novo-nginx imagemnginx:versao1 /bin/bash root@novo-nginx:/# dpkg -l| grep nginx ii nginx 1.4.6-1ubuntu3 all small, powerful, scalable web/proxy server ii nginx-common 1.4.6-1ubuntu3 all small, powerful, scalable web/proxy server - common files ii nginx-core 1.4.6-1ubuntu3 amd64 nginx web/proxy server (core version) root@novo-nginx:/# [root@docker-engine1 ~]# [root@docker-engine1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e169316ec53b imagemnginx:versao1 "/bin/bash" 40 seconds ago Up 38 seconds 0.0.0.0:80->80/tcp novo-nginx
Distribuindo as imagens
Tudo pronto, mas e agora como distribuir esta imagem?.
Você pode subir esta imagem para o Docker Hub, ou você pode copiar para um repositório local criado com o Docker Registry ou então empacotar com o tar.
Distribuindo as imagens através do Docker Registry
Também aplica-se para o Docker hub, a ideia é a mesma.
Eu já publiquei um tutorial ensinando a criar um repositório local com o Docker Registry, você pode conferir neste link Como criar um Docker Registry. O conceito é o mesmo para o Docker hub.
Registre a imagem no Docker Registre
#docker tag imagemnginx:versao1 repo-dockerimages.devopslab.com.br:5000/imagemnginx:versao1
Copie a imagem para o Docker Registry
#docker push repo-dockerimages.devopslab.com.br:5000/imagemnginx:versao1
[root@docker-engine1 ~]# docker tag imagemnginx:versao1 repo-dockerimages.devopslab.com.br:5000/imagemnginx:versao1 [root@docker-engine1 ~]# [root@docker-engine1 ~]# docker push repo-dockerimages.devopslab.com.br:5000/imagemnginx:versao1 The push refers to a repository [repo-dockerimages.devopslab.com.br:5000/imagemnginx] 761e340d23af: Pushed 5f70bf18a086: Pushed 1b82ce694c3b: Pushed db6b2d84f3c6: Pushed 05b940eef08d: Pushed versao1: digest: sha256:1476afd82aa17a0aa31747bf57df182c4e2486e5c7bb7ee3384f726adc472af5 size: 1341
Utilizando a imagem a partir de qualquer host da rede
Logue em qualquer Docker Host da sua rede e tente criar um container.
[root@docker-engine2 /]# docker run -ti --name nginx-testeimage -h nginx-testeimage repo-dockerimages.devopslab.com.br:5000/imagemnginx:versao1 bash root@nginx-testeimage:/# dpkg -l | grep nginx ii nginx 1.4.6-1ubuntu3 all small, powerful, scalable web/proxy server ii nginx-common 1.4.6-1ubuntu3 all small, powerful, scalable web/proxy server - common files ii nginx-core 1.4.6-1ubuntu3 amd64 nginx web/proxy server (core version) root@nginx-testeimage:/# [root@docker-engine2 /]# [root@docker-engine2 /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f31d5a478bf9 repo-dockerimages.devopslab.com.br:5000/imagemnginx:versao1 "bash" 17 seconds ago Up 15 seconds nginx-testeimage
Distribuindo as imagens na mão via pacote tar
Vou mostar como exportar e importar uma imagem Docker via pacote tar. Isto é uma opção em relação ao Docker Registry e Docker Hub.
Exportando a imagem
Primeiramente salve a imagem para um arquivo .tar.
#docker save repo-dockerimages.devopslab.com.br:5000/imagemnginx:versao1 > /tmp/minha-imagem.tar
[root@docker-engine1 ~]# docker save repo-dockerimages.devopslab.com.br:5000/imagemnginx:versao1 > /tmp/minha-imagem.tar [root@docker-engine1 ~]# ls -lh /tmp/minha-imagem.tar -rw-r--r-- 1 root root 291M Mar 30 00:49 /tmp/minha-imagem.tar
Importando a imagem
Importando a imagem
Agora basta copiar a imagem empacotada minha-imagem.tar para qualquer host e importar.
#docker load < minha-imagem.tar
root@docker-engine4 ~]# docker load < minha-imagem.tar [root@docker-engine4 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE repo-dockerimages.devopslab.com.br:5000/imagemnginx versao1 fc511188b2fa About an hour ago 291.4 MB [root@docker-engine4 ~]# docker run -ti --name container-teste-import -h container-teste-import repo-dockerimages.devopslab.com.br:5000/imagemnginx:versao1 bash root@container-teste-import:/# dpkg -l | grep nginx ii nginx 1.4.6-1ubuntu3 all small, powerful, scalable web/proxy server ii nginx-common 1.4.6-1ubuntu3 all small, powerful, scalable web/proxy server - common files ii nginx-core 1.4.6-1ubuntu3 amd64 nginx web/proxy server (core version) root@container-teste-import:/# [root@docker-engine4 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES deb7cd78e920 repo-dockerimages.devopslab.com.br:5000/imagemnginx:versao1 "bash" 51 seconds ago Up 50 seconds container-teste-import
Até a próxima.
Leonardo Macedo Cerqueira
Muito bom seus post sobre Docker. Aprendi muito com eles. Continue postando coisas legais assim. Obrigado!
Parabéns pelo post meu caro!
Poderia me ajudar com uma dúvida?
Faz 2 horas que comecei a usar o Docker e posso dizer alguma besteira, peço desculpas adiantadas.
Eu gostaria de usar um container com um serv web que terá os arquivos (sites) embarcados, como faço isso sem me preocupar ficar dando commit pra não perder os dados dos sites?
Grato!!!
Você pode montar um diretório de dados nos containers.
O diretório fica no Host e é compartilhado com todos os containers que você quiser.
Logo você fará apenas backup do diretório compartilhado, sem se preocupar em dar commit nas imagens.
Dê uma lida aqui para você entender melhor:
http://devopslab.com.br/docker-como-montar-uma-pasta-do-host-docker-dentro-de-um-container/
E neste aqui:
http://www.mundodocker.com.br/montando-volumes-docker/
Conforme sua necessidade, você vai trabalhar com algum cluster de file system, para garantir redundância, disponibilidade.