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                                     


sexta-feira, 15 de março de 2019

Administração de conteiners com Docker - Parte 1

O que é um conteiner?


Conteiner, ou jaula, é um forma de executar um sistema de forma isolada do resto do sistema operacional. Esse isolamento permite maior segurança tanto para a aplicação quanto para o sistema operacional. Diferente da virtualização, o aplicativo que roda no conteiner precisa ser compatível com o sistema operacinal do servidor hospedeiro, usando os mesmo recursos, como CPU, Ram e disco. 

Docker é uma plataforma de administração de conteiners livre desenvolvida pela Google e que pode ser integrada com os principais núvens públicas, como Amazon, Azure e Google Cloud. O Docker foi construído usando o conceito de DevOPS e tecnologias ágeis.

Instalação do Docker


Para instalar o Docker, no Debian, use o seguinte comando:
# apt-get install docker-ce

Veja se o Docker está instalado.
# docker --versionDocker version 18.09.0, build 4d60db4

Para que o usuário possa executar o docker é necessário que ele faça parte do grupo docker.
# usermod -G docker -a <usuario>

Verifique se o Docker está rodando.
# service docker status
[ ok ] Docker is running.

Comandos básicos

Agora que temos o Docker instalado podemos pesquisar o que existe de pronto nos repositórios. Por exemplo, podemos ver quais imagens temos disponíveis para o Wordpress.

$ docker search wordpress
NAME                          DESCRIPTION  STARS         OFFICIAL            AUTOMATED
wordpress                     The WordPress rich content management system…   2839   [OK]
bitnami/wordpress       Bitnami Docker Image for WordPress     102                         [OK]
appcontainers/wordpress Centos/Debian Based Customizable Wordpress C… 34    [OK]
etopian/alpine-php-wordpress Alpine WordPress Nginx PHP-FPM WP-CLI   20     [OK]
centurylink/wordpress             Wordpress image with MySQL removed.         14      [OK]
raulr/nginx-wordpress             Nginx front-end for the official wordpress:f… 12      [OK]
arm32v7/wordpress                 The WordPress rich content management system…   8
dalareo/wordpress-ldap   Wordpress images with LDAP support automatic…   6     [OK]
wodby/wordpress-nginx          Nginx for WordPress                             3                    [OK]
wodby/wordpress-php             PHP for WordPress                                3                    [OK]
dsteinkopf/wordpress              wordpress clone plus some php extensions     1          [OK]
owncloud/wordpress               Wordpress image for ownCloud websites           1
itherz/wordpress                      Wordpress                                              0                    [OK]

Imagens são bases de onde criaremos os conteiners. Podemos ter vários conteiners baseados numa mesma imagem. Você verá imagens, oficiais ou não, do Windows, FreeBSD, diversos sabores de Linux, e vários outros sistemas.

Vamos baixar a imagem do Wordpress para teste.
$ docker pull wordpress
Using default tag: latest
latest: Pulling from library/wordpress
6ae821421a7d: Pull complete
08f3d19635b0: Pull complete
dc8a54b8000b: Pull complete
b2c1d103db99: Pull complete
edfa752aa38a: Pull complete
583d37cbf2f0: Pull complete
c7846a240c1d: Pull complete
d8f9f0fd02fe: Pull complete
01d43e56770d: Pull complete
d7028d09ed0d: Pull complete
e7ada57130df: Pull complete
f8e18fc0e759: Pull complete
84b31f19dee2: Pull complete
5c0a2578817b: Pull complete
2fc1807539b8: Pull complete
62fcf2f6ca7b: Pull complete
64fda3ba2679: Pull complete
7500be78bfbe: Pull complete
Digest: sha256:37f9b9ba391302990b349daefe9fbf4691f79d4aa87e1af5f3617a3750e9678c
Status: Downloaded newer image for wordpress:latest
Agora podemos ver que temos uma imagem do Wordpress.
$ docker images
REPOSITORY   TAG               IMAGE ID           CREATED         SIZE
wordpress           latest              523eaf9f0ced        2 days ago          422MB

Apesar de termos uma imagem, ainda não temos nenhum conteiner rodando.
$ docker ps
CONTAINER ID  IMAGE COMMAND  CREATED  STATUS     PORTS         NAMES

Agora podemos subir o primeiro conteiner do Wordpress.
$ docker run wordpress
WordPress not found in /var/www/html - copying now...
Complete! WordPress has been successfully copied to /var/www/html

Agora podemos ver que temos um conteiner rodando o Wordpress.
$ docker ps
CONTAINER ID IMAGE     COMMAND        CREATED   STATUS PORTS  NAMES
d746d4cd238c wordpress "docker-entrypoint.s…"About an hour agoUp 3 seconds 80/tcp dazzling_diffie

Reparem que o ID do conteiner é d746d4cd238c. Se você executar outro comando "docker run wordpress" outro conteiner será criado com outro id. Para parar um conteiner você deve executar o seguinte.
$ docker stop d746d4cd238c
d746d4cd238c

Vemos agora que nunhum conteiner está rodando.
$ docker ps
CONTAINER ID   IMAGE        COMMAND   CREATED STATUS  PORTS   NAMES

Se quisermos ver todos os conteiner, inclusive os que estão parados, digite:
$ docker ps -a
CONTAINER ID IMAGE      COMMAND     CREATED STATUS        PORTS NAMES
d746d4cd238c wordpress "docker-entrypoint.s…" 20 hours ago Exited (0) 34 seconds ago        dazzling_diffie

Para executarmos o conteiner novamente digitamos:
$ docker start d746d4cd238c
d746d4cd238c
$ docker ps
CONTAINER ID  IMAGE        COMMAND      CREATED STATUS  PORTS   NAMES
d746d4cd238c wordpress "docker-entrypoint.s…" About an hour ago Up 1 second 80/tcp        dazzling_diffie

Podemos usar também o comando "docker kill" para matar o conteiner. Isso poderá gerar inconsistências nos dados. Por isso, só o use em último caso. Kill não apaga o conteiner.

Podemos notar na saída do comando "docker ps" que o coteiner está ouvindo a pora 80 TCP. O Docker cria por padrão uma interface virtual na rede 172.17.0.0/16.
$ ip addr show dev docker0
6: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:00:e8:b2:2d brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:ff:fee8:b22d/64 scope link
       valid_lft forever preferred_lft forever

O primeiro conteiner terá o próximo IP disponível nesta rede, e o seu gateway será o IP 172.17.0.1, que é o IP da interface virtual do hospedeiro.
$ ping -c 1 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.094 ms
--- 172.17.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.094/0.094/0.094/0.000 ms

Você pode acessar a página do Wordpress digitando na barra do navegador:
http://172.17.0.2

Podemos apagar o conteiner com o comando:
$ docker rm d746d4cd238c
d746d4cd238c

Esse comando não apaga os volumes associados ao conteiner. Para apagar todos os volumes, digite:
$ docker rm -v d746d4cd238c
d746d4cd238c

Se quisermos apagar todos os conteiners, podemos usar o seguinte comando:
$ docker rm -v `docker ps -aq`

A opção -aq mostra somente os IDs dos conteiners, e isso será passado para o rm.

O mesmo pode ser feito para excluir as imagens. Lembre-se de que, para excluir uma imagen, deve-se excluir primeiro todos os conteiners que a usam.
$ docker rmi `docker images -q`
Untagged: wordpress:latest
Untagged: wordpress@sha256:37f9b9ba391302990b349daefe9fbf4691f79d4aa87e1af5f3617a3750e9678c


Nomeando conteiners


É interessante nomear um conteiner antes de criá-lo.
$ docker run -ti --name Olonca -d debian /bin/bash
9538911a284e0ca1df0b64202e46e5856b764a256d9b41879c230eaa467ce993

A opção -ti permite que entremos no conteiner no modo interativo. Com esse comando criamos um conteiner chamado Olonca derivado da imagem debian.
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
debian                        latest                d508d16c64cd       3 weeks ago           101MB
$ docker ps
CONTAINER ID IMAGE        COMMAND      CREATED  STATUS  PORTS   NAMES
9538911a284e      debian           "/bin/bash"         40 seconds ago Up    37 seconds Olonca

Podemos entrar no conteiner com a opção -ti.
$ docker exec -ti 9538911a284e /bin/bash

Se preferir, podemos executar um comando dentro do conteiner.
$ docker exec -ti 9538911a284e hostname
9538911a284e


Trocando arquivos com o conteiner


Podemos copiar arquivos de/para o conteiner.

$ docker ps
CONTAINER ID  IMAGE         COMMAND  CREATED  STATUS   PORTS    NAMES
90b9504cb87a debian   "/bin/bash" 41 minutes ago Up 39 minutes                  Limit_ram2
bdbd7f583122 debian   "/bin/bash" 42 minutes ago Up 31 minutes                  Limit_ram
9538911a284e  debian        "/bin/bash"   2 hours ago  Up 40 minutes               Olonca
$ docker exec 90b9504cb87a ls /tmp 
$ docker cp tmp/20190301.txt 90b9504cb87a:/tmp
$ docker exec 90b9504cb87a ls /tmp
20190301.txt

Em algumas situações, o conteiner deverá utilizar uma pasta no host como se fosse nele. Podemos fazer isso com o parâmetro -v. Por exemplo, vamos montar a pasta /home/ricardo/tmp/ftp na pasta /home/ftp do conteiner.
$ mkdir /home/ricardo/tmp/ftp
$ docker run -ti --name FTP -v /home/ricardo/tmp/ftp:/home/ftp debian /bin/bash
root@5b348f6bb9b1:/# exit
exit
$ docker ps -a
CONTAINER ID IMAGE       COMMAND   CREATED STATUS        PORTS  NAMES
5b348f6bb9b1  debian   "/bin/bash"  14 seconds ago Exited (0) 7 seconds ago            FTP
9538911a284e  debian   "/bin/bash" 3 hours ago    Up About an hour                 Olonca
$ docker start 5b348f6bb9b1
5b348f6bb9b1 
$ docker ps 
CONTAINER ID IMAGE        COMMAND      CREATED  STATUS  PORTS   NAMES
5b348f6bb9b1   debian          "/bin/bash" 25 seconds ago Up 2 seconds                       FTP
9538911a284e   debian       "/bin/bash"    3 hours ago    Up About an hour              Olonca
$ docker exec 5b348f6bb9b1 ls /home/ftp 
$ touch /home/ricardo/tmp/ftp/teste 
$ docker exec 5b348f6bb9b1 ls /home/ftp
teste
Podemos montar um volume somente como leitura.

$ docker run -ti --name FTP2 -v /home/ricardo/tmp/cd:/mnt/cdrom:ro debian /bin/bash

Para ver os mapeamentos digite o seguinte:
$ docker inspect -f {{.Mounts}} FTP
[{bind  /home/ricardo/tmp/ftp /home/ftp   true rprivate}]
$ docker inspect -f {{.Mounts}} FTP2
[{bind  /home/ricardo/tmp/cd /mnt/cdrom  ro false rprivate}]

Você pode criar uma pasta no conteiner que poderá ser compartilhada com outros conteiners.
$ docker run -ti -v /home --name dados debian /bin/bashroot@38a438db1903:/# exit
exit 
$ docker start 38a438db1903
38a438db1903 
$ docker inspect -f {{.Mounts}} dados
[{volume 7bc9d12f3fdc7d6527052d7ac488cdadd17b811f37680d8cff201da9b86d4fb1 /var/lib/docker/volumes/7bc9d12f3fdc7d6527052d7ac488cdadd17b811f37680d8cff201da9b86d4fb1/_data /home local  true }]

E agora podemos montar esse volume em um novo conteiner.
$ docker run -ti --volumes-from dados centos /bin/bash
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
a02a4930cb5d: Pull complete
Digest: sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426
Status: Downloaded newer image for centos:latest 
[root@bb85fcc8b5f0 /]# exit
exit 
$ docker inspect -f {{.Mounts}} dados
[{volume 7bc9d12f3fdc7d6527052d7ac488cdadd17b811f37680d8cff201da9b86d4fb1 /var/lib/docker/volumes/7bc9d12f3fdc7d6527052d7ac488cdadd17b811f37680d8cff201da9b86d4fb1/_data /home local  true }] 
$ docker ps -a
CONTAINER ID IMAGE    COMMAND CREATED STATUS            PORTS   NAMES
bb85fcc8b5f0 centos "/bin/bash" 39 minutes ago Exited (0) About a minute ago eager_lumiere
38a438db1903 debian "/bin/bash"  43 minutes ago Up 43 minutes                            dados
247f457f6d81  debian  "/bin/bash" About an hour ago   Up About an hour                FTP2
5b348f6bb9b1  debian "/bin/bash"  2 hours ago       Up 2 hours                                  FTP
90b9504cb87a debian "/bin/bash" 3 hours ago  Exited (0) 2 hours ago            Limit_ram2
bdbd7f583122 debian "/bin/bash" 3 hours ago  Up 3 hours                                Limit_ram
9538911a284e debian  "/bin/bash"  5 hours ago   Up 3 hours                                  Olonca 
$ docker start bb85fcc8b5f0
bb85fcc8b5f0 
$ docker ps
CONTAINER ID IMAGE        COMMAND      CREATED  STATUS  PORTS   NAMES
bb85fcc8b5f0 centos   "/bin/bash" 40 minutes ago Up 2 seconds                  eager_lumiere
38a438db1903 debian       "/bin/bash"   43 minutes ago Up 43 minutes                     dados
247f457f6d81  debian       "/bin/bash"   About an hour ago  Up About an hour          FTP2
5b348f6bb9b1 debian       "/bin/bash"   2 hours ago       Up 2 hours                             FTP
bdbd7f583122 debian      "/bin/bash" 3 hours ago  Up 3 hours                           Limit_ram
9538911a284e debian       "/bin/bash"   5 hours ago     Up 3 hours                           Olonca
$ docker inspect -f {{.Mounts}} eager_lumiere
[{volume 7bc9d12f3fdc7d6527052d7ac488cdadd17b811f37680d8cff201da9b86d4fb1 /var/lib/docker/volumes/7bc9d12f3fdc7d6527052d7ac488cdadd17b811f37680d8cff201da9b86d4fb1/_data /home local  true }] 
$ docker inspect -f {{.Mounts}} dados
[{volume 7bc9d12f3fdc7d6527052d7ac488cdadd17b811f37680d8cff201da9b86d4fb1 /var/lib/docker/volumes/7bc9d12f3fdc7d6527052d7ac488cdadd17b811f37680d8cff201da9b86d4fb1/_data /home local  true }]

Trabalhando com rede


Podemos levantar um conteiner e mapear uma porta TCP para ser espelhada no hospedeiro. Com isso não é necessário criar um NAT para esse serviço.
$ docker run -ti --name Drupal -p 80:80 -d drupal /bin/bash

$ docker exec -ti 471f35e0eb01 /bin/bash 
rro@471f35e0eb01:/var/www/html# /etc/init.d/apache2 start
[....] Starting Apache httpd web server: apache2AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
. ok  
root@471f35e0eb01# exit
exit 
$ docker ps 
CONTAINER ID IMAGE        COMMAND       CREATED STATUS  PORTS   NAMES
471f35e0eb01 drupal "docker-php-entrypoi…" 4 minutes ago Up 4 minutes 0.0.0.0:80->80/tcp Drupal
9538911a284e debian   "/bin/bash"         6 days ago     Up 3 hours                          Olonca

Agora acesse o site pelo endereço http://localhost


Criando images


Você também pode criar imagens personalizadas. Para isso crie um arquivo chamado Dockerfile com o seguinte conteúdo.
    FROM <imagem>
    ENV <variavel=valor>
    RUN <comandos>
    COPY <origem> <destino>
  
FROM é o modelo que você vai usar, como "debian".
ENV define variáveis de ambiente que serão usadas na imagem personalizada.
RUN são os comandos que você quer executar na imagem.
COPY pode ser usado para copiar arquivos da máquina hospedeira para a imagem.

Agora rode o comando:

$ docker build -t <nome> .

Por exemplo, vamos criar uma imagem baseada em Debian só com o iptables.
$ cat Dockerfile
FROM debian
RUN apt-get update
RUN apt-get install -y apt-utils
RUN apt-get install -y iptables
RUN apt-get upgrade -y
$ docker build -t firewall .
Sending build context to Docker daemon  1.721MB
Step 1/5 : FROM debian
 ---> d508d16c64cd
Step 2/5 : RUN apt-get update
 ---> Running in c653b4fcf3b8
Get:3 http://security-cdn.debian.org/debian-security stretch/updates InRelease [94.3 kB]
Ign:1 http://cdn-fastly.deb.debian.org/debian stretch InRelease
Get:2 http://cdn-fastly.deb.debian.org/debian stretch-updates InRelease [91.0 kB]
...
Removing intermediate container c653b4fcf3b8
 ---> 1fb31b2efe4d
Step 3/5 : RUN apt-get install -y apt-utils
 ---> Running in 022f86a9d7cb
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
  libapt-inst2.0
The following NEW packages will be installed:
  apt-utils libapt-inst2.0
0 upgraded, 2 newly installed, 0 to remove and 7 not upgraded.
Need to get 602 kB of archives.
After this operation, 1607 kB of additional disk space will be used.
...
Removing intermediate container 022f86a9d7cb
 ---> 09974d670efb
Step 4/5 : RUN apt-get install -y iptables
 ---> Running in 2b2a14386488
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
  libip4tc0 libip6tc0 libiptc0 libnetfilter-conntrack3 libnfnetlink0
  libxtables12
Suggested packages:
  kmod
The following NEW packages will be installed:
  iptables libip4tc0 libip6tc0 libiptc0 libnetfilter-conntrack3 libnfnetlink0
  libxtables12
0 upgraded, 7 newly installed, 0 to remove and 7 not upgraded.
Need to get 609 kB of archives.
After this operation, 2222 kB of additional disk space will be used.
Get:1 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 libnfnetlink0 amd64 1.0.1-3 [13.5 kB]
Get:2 http://cdn-fastly.deb.debian.org/debian stretch/main amd64 libip4tc0 amd64 1.6.0+snapshot20161117-6 [67.8 kB]
...
Removing intermediate container 2b2a14386488
 ---> 520d7a44e5d4
Step 5/5 : RUN apt-get upgrade -y
 ---> Running in b062393ac802
Reading package lists...
Building dependency tree...
Reading state information...
Calculating upgrade...
The following packages will be upgraded:
  base-files gpgv libc-bin libc6 libsystemd0 libudev1 multiarch-support
7 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 4631 kB of archives.
After this operation, 4096 B of additional disk space will be used.
Get:1 http://security-cdn.debian.org/debian-security stretch/updates/main amd64 libsystemd0 amd64 232-25+deb9u9 [281 kB]
Get:2 http://security-cdn.debian.org/debian-security stretch/updates/main amd64 libudev1 amd64 232-25+deb9u9 [126 kB]
...
Removing intermediate container b062393ac802
 ---> da1e417ebd51
Successfully built da1e417ebd51
Successfully tagged firewall:latest

Agora temos uma imagem do Debian chamada firewall que já possui o iptables.
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
firewall            latest              da1e417ebd51        About an hour ago   140MB
wordpress        latest              4771adb1849c        3 days ago                421MB
drupal              latest              47a58c95e8e4         3 days ago                446MB
debian              latest              d508d16c64cd        4 weeks ago             101MB
centos              latest              1e1148e4cc2c         3 months ago            202MB 
$ docker run -ti -d firewall /bin/bash
47c616dc4a45b0468a7b67f10a689eed303db1d95358def850807d78331ddef7 
$ docker ps
CONTAINER ID IMAGE        COMMAND      CREATED STATUS  PORTS    NAMES
47c616dc4a45 firewall "/bin/bash" 13 seconds ago Up 3 seconds         pedantic_elbakyan
471f35e0eb01 drupal "docker-php-entrypoi…" 24 hours ago Up 6 hours 0.0.0.0:80->80/tcp Drupal
$ docker exec -ti 47c616dc4a45 iptables -nL
iptables v1.6.0: can't initialize iptables table `filter': Permission denied (you must be root)
Perhaps iptables or your kernel needs to be upgraded.
Com isso já dá para ir brincando com o Docker. 

terça-feira, 15 de janeiro de 2019

Gnome-nettool, uma ferramenta gráfica para análise de rede

O ambiente gráfico Gnome tem uma ferramenta para análise de rede, o Gnome-nettool.


Com ela podemos fazer análise de ping, netstat, traceroute, nslookup, whois e até pesquisa de portas remotas como o nmap.


Esse programa pode ser instalado com o pacote gnome-nettool. Após instalado, procure o ícone de "Ferramentas de Rede".




quinta-feira, 3 de janeiro de 2019

Previsões para o futuro

Como em todo ano, vou fazer as minhas previsões para o futuro. Essas previsões não são fruto da minha imaginação. Elas são baseadas em artigos científicos que li durante alguns anos.

Primeiro, vamos rever as previsões que acertei.

  • Uso intenso de smartphones, computação em nuvem e mobilidade;
  • Pagamento eletrônico através do celular;
  • Popularização da rede 4G;
  • Aumento do uso de virtualização na área de TI;
  • Ampla utilização da banda larga no Brasil;
  • Fim da TV analógica;
  • Uso mais intenso do HTML 5;
  • Televisores 4K serão o padrão;
  • Envio de sondas para Marte e Júpiter;
  • Uso de realidade aumentada;
  • Uso de drones para monitoramento e pequenas entregas;
  • Domínio do Android no mercado de smartphones;
  • Internet residencial de 100mbps;
  • Volta do crescimento econômico do Brasil;


O que esperar para esse ano?

  • Banda larga chegará a 95% dos lares brasileiros;
  • Uma rede de satélites poderá disponibilizar internet para o mundo todo;
  • 59% da população mundial terá um smartphone;
  • 91% das linhas telefônicas serão móveis;
  • A energia solar começará a ser usada em larga escala;
  • Poderá entrar em operação um avião supersônico comercial;
  • A Suíça implantará um carteiro robô;
  • Um mamute poderá ser ressussitado;


Em 2 anos

  • A chave cripográfica de 2048 bits será considerada insegura;
  • Sistemas ligados ao corpo monitorarão a saúde de pacientes;
  • O mundo terá 21 bilhões de dispositivos conectados na internet;
  • Todos os dispositivos eletrônicos deverão estar conectados na internet de alguma forma;
  • Todas as cidades da Europa terão wifi gratuíto;
  • Fim do suporte ao Windows 7;
  • Fim do IPv4 na África;
  • Aparecerão as primeiras redes exclusivamente IPv6;
  • 70% da população mundial terá um smartphone;
  • A internet da coisas (IoT) e sistemas cognitivos serão corriqueiros;
  • As pessoas conversarão mais com robôs do que com pessoas reais;
  • 92% do processamento das empresas será na núvem;
  • 59% das pessoas usarão a núvem;
  • As viagens à Lua voltarão;
  • Mars One enviará sua primeira sonda para Marte;
  • China vai enviar sondas à Marte;
  • Construção de um hotel espacial;
  • Desativação do telescópio Hubble;
  • Uso mais intenso de carros elétricos e autônomos;
  • Sistemas de compartilhamento de carros serão mais usados, fazendo a venda de autos diminuir;
  • As pessoas passarão a gravar todas as conversas telefônicas;
  • Começarão as vendas de TV 8K;
  • Operações poderão ser feitas à distância;
  • O câncer será a principal causa de mortes no Brasil;
  • A China será o maior exportador do mundo;
  • A Arábia Saudita vai inaugurar o prédio mais alto do mundo com 1km de altura;
  • Chegará ao mercado a carne cultivada, sem abate de animais;


Em 5 anos

  • Banda larga de 100mbps em todas as residências do Brasil;
  • Mais da metade do tráfego de internet será feita por utensílios domésticos;
  • SpaceX deve enviar a primeira espaçonave da primeira fase de colonização de Marte;
  • SpaceX deverá ter viagens turísticas em torno da Lua;
  • ESA deve lançar uma sonda com destino à Júpiter;
  • Nasa deve construir uma base na Lua;
  • A Nigéria deverá ser o terceiro país mais populoso do mundo;

Em 10 anos

  • A internet terá 1 trilhão de dispositivos;
  • 80% da população mundial terá acesso à internet;
  • Todas as casas da Europa terão internet de 100mbps;
  • Entrará em funcionamento a rede 5G;
  • Windows 10 não terá mais suporte;
  • O celulares brasileiros precisarão de 10 digitos;
  • Uso de robôs para trabalhos domésticos;
  • Comercialização de robôs sexuais;
  • 5% de tudo o que consumimos será feito com impressora 3D;
  • Órgãos para transplante poderão ser feitos em impressoras 3D;
  • Teremos internet doméstica com 500mpbs;
  • Micros domésticos terão 20Tb de espaço;
  • Os processadores atingirão velocidades de terahertz;
  • Lentes de contato projetarão imagens diretamente no olho;
  • Teremos dispositivos controlados pela mente;
  • A Nasa deverá enviar uma sonda para a Europa, lua de Júpiter;
  • A maioria dos carros serão elétricos;
  • Uma sonda deverá ser enviada à Vênus;
  • Primeiros astronautas em Marte;
  • Sonda da ESA deve chegar a Júpiter;
  • A estação espacial ISS será desativada;
  • Uber terá carros voadres parecidos com drones;
  • 10% dos veículos serão autônomos;
  • A profissão de motorista começará a desaparecer;
  • China deve enviar astronautas à Lua;
  • 10% do PIB mundial será baseado em moedas digitais;
  • Teremos ciborges;
  • 66% da população mundial não terá acesso à água potável;
  • O mundo terá 8 bilhões de pessoas;
  • Veneza ficará desabitada;
  • Modificações genéticas aumentarão a expectativa de vida;

Em 20 anos

  • Será possível fazer backup da mente;
  • Teremos computadores quânticos;
  • China deverá ter rede de comunicação quântica;
  • Inteligência Artificial estará no cotidiano das pessoas;
  • Bug do timestamp;
  • As casas terão monitores embutidos nas paredes;
  • Faremos exames ao usar o banheiro ou escovar os dentes;
  • Teremos implantes que aumentarão nossa audição e visão;
  • Todas as pessoas estarão conectadas na internet de alguma forma;
  • Deve começar a construção de uma cidade no espaço;
  • Lançamentos de pequenas naves em direção a Alfa Centauri e Próxima B
  • Uma sonda deverá orbitar Ganimedes;
  • O mundo terá 8 bilhões de habitantes;
  • Haverá uma vacina contra a AIDS;
  • Suécia deverá extinguir o papel moeda;
  • China será a maior economia do mundo;
  • A temperatura média da Terra deverá subir 0,5ºC;
  • Os oceanos se elevarão 6cm em média;
  • A espectativa de vida será de 72 anos em média no mundo;
  • Criação de nervos e sangue artificiais;
  • Dormiremos em conchas acústicas;
  • A Índia será o país mais populoso do mundo;
  • O monte Kilimanjaro deixará se ser coberto por neve;
  • A população do Brasil começará a diminuir;

Em 50 anos

  • Será possível fazer download e upload de/para o cérebro;
  • Teremos vários dispositivos implantados no corpo;
  • A rede 6G deve entrar em operação;
  • Teremos links residenciais de 5gbps;
  • Os computadores domésticos terão 500Tb de espaço;
  • Os processadores terão velocidades de petahertz;
  • Volta do cometa Halley;
  • Teremos um elevador espacial;
  • Turismo espacial terá um preço acessível;
  • Colonização de Marte;
  • Carros movidos a gasolina não mais existirão;
  • O homossexualismos será considerado normal;
  • Pessoas congeladas por criogenia serão ressucitadas;
  • Será possível fazer transplante de cérebro;
  • Será possível fazer escolhas genéticas;
  • Será possível clonar humanos;
  • A temperatura média da Terra será 5ºC mais quente se comparado a 2010;
  • Os oceanos terão mais plástico do que peixe;
  • O Brasil será a quarta economia mundial. A Índia será a terceira;
  • O mundo terá 9 bilhões de habitantes;
  • A Índia será o país mais populoso do mundo;
  • A Amazônia terá mais cerrado do que floresta tropical;

Em 100 anos

  • A humanidade chegará à Próxima Centauri;
  • Não haverá gelo no Pólo Norte, fazendo o nível do mar subir 90cm;
  • O mundo terá 11 bilhões de habitantes;
  • 66% da floresta Amazônica terá desaparecido se comparado a 2006;
  • O rio Amazonas vai secar;
  • Haverá um único governo mundial e uma única moeda;

Em 200 anos

  • Haverá uma população auto-sustentável em Marte