quinta-feira, 21 de março de 2019

Administração de conteiners com Docker - Parte2

Atualização de uma imagem


Depois de criar um conteiner e personalizá-lo podemos salvá-lo como uma imagem que poderá ser usado em outros conteiner. Por exemplo, vamos executar o conteiner do Drupal.
$ docker start 471f35e0eb01
471f35e0eb01

Agora vamos entrar nele e personalizá-lo
$ docker exec -ti 47c616dc4a45 /bin/bash
root@471f35e0eb01:/var/www/html# apt-get update
Hit:1 http://security-cdn.debian.org/debian-security stretch/updates InRelease                 
Hit:2 http://security-cdn.debian.org/debian-security buster/updates InRelease                 
Ign:3 http://cdn-fastly.deb.debian.org/debian stretch InRelease                                         
Hit:4 http://cdn-fastly.deb.debian.org/debian stretch-updates InRelease                           
Hit:5 http://cdn-fastly.deb.debian.org/debian buster InRelease
Hit:6 http://cdn-fastly.deb.debian.org/debian buster-updates InRelease
Hit:7 http://cdn-fastly.deb.debian.org/debian stretch Release
Reading package lists... Done 
root@471f35e0eb01:/var/www/html# apt-get upgrade
Reading package lists... Done
Building dependency tree     
Reading state information... Done
Calculating upgrade... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
root@471f35e0eb01:/var/www/html# apt-get install tcpdump
Reading package lists... Done
Building dependency tree     
Reading state information... Done
The following additional packages will be installed:
  libpcap0.8
The following NEW packages will be installed:
  libpcap0.8 tcpdump
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 553 kB of archives.
After this operation, 1553 kB of additional disk space will be used.
Do you want to continue? [Y/n]
Get:1 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 libpcap0.8 amd64 1.8.1-3 [138 kB]
Get:2 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 tcpdump amd64 4.9.2-1~deb9u1 [415 kB]
Fetched 553 kB in 0s (785 kB/s)
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package libpcap0.8:amd64.
(Reading database ... 13152 files and directories currently installed.)
Preparing to unpack .../libpcap0.8_1.8.1-3_amd64.deb ...
Unpacking libpcap0.8:amd64 (1.8.1-3) ...
Selecting previously unselected package tcpdump.
Preparing to unpack .../tcpdump_4.9.2-1~deb9u1_amd64.deb ...
Unpacking tcpdump (4.9.2-1~deb9u1) ...
Processing triggers for libc-bin (2.24-11+deb9u4) ...
Setting up libpcap0.8:amd64 (1.8.1-3) ...
Setting up tcpdump (4.9.2-1~deb9u1) ...
Processing triggers for libc-bin (2.24-11+deb9u4) ...
root@471f35e0eb01:/var/www/html# exit
exit
$ docker commit 471f35e0eb01 olonca:drupal_0.0.1
sha256:a22929c381d18f77d9aabf15655943b2b458b4f2c550b5847eb26df1c0b7957e0 
$ docker images | grep drupal
olonca                   drupal_0.0.1        a22929c381d1        43 seconds ago      516MB
drupal                   import              ade021154dfd        7 days ago          506MB
drupal                   latest              47a58c95e8e4        2 weeks ago         446MB


Checando as mudanças entre conteiners


Você pode ver o que mudou de uma versão para outra em um conteiner.
$ docker diff 471f35e0eb01
C /run
C /run/apache2
A /run/apache2/apache2.pid
C /tmp
A /tmp/update-cache-3e8379a4
A /tmp/update-cache-3e8379a4/business-8.x-1.7.tar.gz
A /tmp/update-cache-3e8379a4/md_foto-7.x-1.0.tar.gz
A /tmp/update-cache-3e8379a4/7.x-1.0
A /tmp/update-cache-3e8379a4/8.x-1.x-dev
...

Onde:

A - adicionado
C - modificado
D - apagado


Exportando e importando conteiners


Podemos também exportar um conteiner para poder ser usado em outro host.
$ docker export 471f35e0eb01 -o tmp/drupal.tar

Agora podemos importar a imagem em outro host.
$ docker import tmp/drupal.tar drupal:import
sha256:b44ff95466308592f7a321bbd303e9712286cea14f5d7cde54b4b2458ed60632
$ docker images | grep drupal
drupal                   import              b44ff9546630        13 minutes ago      507MB
olonca                   drupal_0.0.1        a22929c381d1        18 hours ago        516MB
drupal                   latest              47a58c95e8e4        2 weeks ago         446MB
Da mesma forma que exportamos e importamos conteiner, podemos exportar e importar imagens.
$ docker save -o tmp/export.tar drupal:import

E agora importamos a imagem.
$ docker load -i tmp/export.tar
Loaded image: drupal:import


Criando imagens com DockerFile


Já vimos como criar uma imagem partindo de um arquivo Dockerfile. Agora vamos ver mais alguns parâmetros interessantes.

ENTRYPOINT [comando]
Comando que será executado quando o conteiner for iniciado. Só pode ser alterado pelo parâmetro --entrypoint.

CMD [comando]
O mesmo que ENTRYPOINT, mas pode ser modificado pelo docker run.

EXPOSE
Porta TCP a ser exposta no conteiner.

ADD
Adiciona arquivos ao conteiner.


Boas práticas na criação de conteiners


Vamos ver algumas boas práticas para a criação de imagens.

  • Rode um único processo por conteiner. O ideal é que cada conteiner rode um único serviço. Isso vai isolá-lo dos demais serviços.
  • Dados críticos devem ficar fora do conteiner, num volume separado. Os dados que são críticos para o sistema deverão estar fora do conteiner. Isso vai evitar a perda ou modificação indesejada de dados ao se modificar uma imagem.
  • Dê preferência às imagens oficiais. Com as imagens oficiais você tem a certeza de que a equipe está fazendo o melhor, e que você não vai precisar se preocupar com ela. 
  • Evite criar imagens com muitos comandos RUN. Cada comando RUN cria uma nova camada na imagem, e isso é ruim. Sendo possível, crie um único RUN com vários comandos dentro dele.
  • Evite usar ADD para copiar arquivos. O ADD é melhor utilizado para copiar um grande volume de dados para a imagem. Dê preferência ao COPY.



Versionamento de images


Podemos trabalhar com verisonamento das imagens do Docker. Por exemplo:
$ docker images | grep firewall
firewall                 latest              6f002f760a84        6 days ago          200MB  
$ docker tag firewall firewall:0.0.1 
$ docker images | grep firewall
firewall                 0.0.1               5fa0d3d002af        7 days ago          141MB
firewall                 latest              6f002f760a84        6 days ago          200MB


Armazenando suas imagens no Docker Hub


Para poder disponibilizar sua imagem personalizada no Docker Hub, primeiro crie  teu login do site dockerhub.com. Depois crie o teu repositório.


Antes de enviar uma imagem é necessário configura o Docker para usar o Docker Hub.
$ docker login

Isso vai criar um arquivo em ~/.docker/config.json contendo as credencias para acesso ao Docker Hub.

Agora precisamo tagear uma imagem com o nome do repositório.
$ docker tag <imagem> <repositório>/<imagem>

Por exemplo, criei o repositório do Docker Hub chamado "olonca" e vou colocar a imagem "firewall". Então digito o seguinte comando:
$ docker tag firewall olonca/firewall

Agora é só mandar a imagem para o Docker Hub.
$ docker push olonca/firewall 
The push refers to repository [docker.io/olonca/firewall]
e82360136055: Layer already exists
b264c55bfb17: Layer already exists
07fd7ba63325: Layer already exists
3808c16f973a: Layer already exists
914f219d7bea: Layer already exists
ad254c3a20a7: Layer already exists
6c4a95532de5: Layer already exists
13d5529fd232: Layer already exists
latest: digest: sha256:aea299b3c4ae22cd454d50e0c56d1f53e40006b0e0352a5573872b72df1f8962 size: 2005

Agora a imagem já vai aparecer tanto no site do Docker quanto nas pesquisas do docker search.

$ docker search olonca
NAME                DESCRIPTION         STARS               OFFICIAL            AUTOMATED
olonca/firewall                         0                                     


Nenhum comentário:

Postar um comentário