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 AUTOMATEDolonca/firewall 0
Nenhum comentário:
Postar um comentário