quinta-feira, 19 de janeiro de 2017

devopslab.com.br

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

0 comentários: