Docker – Como criar uma imagem Docker a partir de um Container utilizando o Docker commit

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

3 comentários sobre “Docker – Como criar uma imagem Docker a partir de um Container utilizando o Docker commit

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

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *