Mnemonic's Fike

Da genialidade à imbecilidade o limite é uma curva

Meetup Docker-SP: Docker na vida real

| Comments

No dia 18 de Novembro estarei no Meetup Docker São Paulo para falar um pouco da migração de serviços de infraestrutura para o Docker.

A apresentação vai ser um pouco diferente que fiz no TDC em Porto Alegre pelo tempo menor disponível para expor. Mas se estiver por lá, podemos conversar um pouco mais sobre containers. :)

A do TDC está logo mais abaixo:

Docker 1.3

| Comments

A versão 1.3 do Docker foi lançada recentemente. Eu gostei dela por duas razões.

Verificação da assinatura digital

O pessoal da DotCloud já tinha anunciado alguns repositórios oficiais de alguma ferramentas e linguagens de programação (C(++)/GCC, PHP, Go, Java, Nodejs, Python, Perl, Ruby, etc.). O Docker verifica se os repositórios oficiais estão íntegros, eles (os repositórios) são assinados com chave criptográficas. (Obs. procurando que tipos de chaves são e como são assinados)

Antes disso eu tinha um pouco de restrição com os repositórios de terceiros. Até então, preferia criar meus templates de containers.

Entrar num container em execução

Nas versões anteriores era um pouco trabalhoso para você entrar num container e analisar um problema que estivesse ocorrendo, exemplo: identificar um problema de permissão num diretório.

Na versões anteriores teria que ser feito assim:

Na criação do container deveria compartilhar os diretórios de log e da aplicação. Supondo que seja um servidor web simples, o dockerfile seria como o abaixo:

Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FROM debian:wheezy

MAINTAINER fike at midstorm.org

RUN apt-get udpate && apt-get install apache2

ADD mysite /var/www/

RUN apt-get autoremove -y && rm -rf /tmp/* /var/tmp/*

ENV APACHE_RUN_USER www-data

ENV APACHE_RUN_GROUP www-data

ENV APACHE_LOG_DIR

VOLUMES ["/var/log/apache2", "/var/www"]

CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]

Criando o container

1
fike@kamino:~$ docker build -t="mysimplesite"  .

Executando

1
fike@kamino:~$ sudo docker run -d -p  80:80 mysimplesite

Putz! Os internautas não estão conseguindo acessar meu site, ele está retornando 403.

Se não tiver uma versão mais recente do util-linux (> 2.27) não poderá usar o nsenter. Outra forma seria executar um segundo container e acessar os diretórios compartilhados do primeiro.

1
2
3
fike@kamino:~$ CONTAINERID=$(docker ps |grep mysimplesite|awk '{ print $1}'

fike@kamino:~$ docker run -it --volumes-from=$CONTAINERID /bin/bash

Se estiver usando um Fluent ou outro agregador de logs não precisaria disso, certo? Nesse caso, sim. Entretanto pode ocorrer de precisar inspecionar um container para verificar um vazamento de memória ou algo que necessite analisar a aplicação em produção.

Se o problema estiver relacionado a rede, a abordagem era parecida. Um bom exemplo, alterar uma zona DNS no Bind9 usando o rndc.

1
2
3
fike@kamino:~$ CONTAINERID=$(docker ps |grep mysimplesite|awk '{ print $1}'

fike@kamino:~$ docker run -it --volumes--from=$CONTAINERID --net='container:$CONTAINERID' mysimplesite /bin/bash

No 1.3 é bem mais simples.

1
2
3
fike@kamino:~$ CONTAINERID=$(docker ps |grep mysimplesite|awk '{ print $1}'

fike@kamino:~$ docker exec -it $CONTAINERID /bin/bash

Eu fui: TDC 2014- Edição POA

| Comments

Participar de eventos é sempre uma boa oportunidade de aprender coisas novas, aumentar o networking e repassar conhecimento ou algumas lições aprendidas. :)

Acredito que o pessoal da organização do TDC gostou da minha apresentação na edição de São Paulo (Você está preparado para um milhão de usuários?) porque eles aprovaram as três proposta que inscrevi.

Gostei bastante desta edição de Porto Alegre porque vi algumas coisas novas bem interessantes. As que destacam: (para mim)

No meu trabalho atual, costumo usar um quadro branco ou papel em detrimento à apresentações em Power Point/LibreOffice Impress para discutir com os clientes produtos e serviços, como também, definição de arquitetura.

Não sabia que isso era chamado de Visual Thinking, eu costumava chamar de “Quer que eu desenhe?” Aliás, alguns meses atrás comecei esboçar uma apresentação falando disso, vou aumentar a prioridade dela no meu TODO.

Nunca iria imaginar que uma apresentação sobre Software Delivery poderia ter encenação teatral, foi animal!

Foi muito interessante porque o Diogo usou o mesmo termo que eu para definir o Docker: “Disruptivo”. Bom, falei sobre ele na apresentação: “Docker na vida real

As outras apresentações foram sobre Web Performance – “Será que seu site está preparado para um milhão de usuários simultâneos?” e “Managenment 3.0 – a vida pós-agilidade


Será que seu site está preparado para um milhão de usuários simultâneos?

Docker na vida real

Managenment 3.0 – a vida pós-agilidade

PGDAY Campinas: Docker e PostgreSQL

| Comments

Fazia um bom tempo que não participava de um evento de PostgreSQL e finalmente a pude participar novamente. Fui no PGDAY Campinas e fiquei muito contente em ver muita coisas nova do PostgreSQL e o ecossistema em volta.

Aliás, teve ligthing talk e puder falar um pouco sobre como usar o PostgreSQL num container Docker.

Ah, já estava esquecendo. A organização do evento estava excelente, coffee-break também. Parabéns para o pessoal que organizou o PGDAY Campinas! :)

Purge debian packages marked with rc status

| Comments

Sometimes when I find a package that is installed on my computer (Debian), I found status rc but I never found a explanation in official documentation.

For now, my OS has the following packages marked rc status:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
fike@klatoon:~$ dpkg -l | grep ^[rc]

rc  libaacplus2:i386                      2.0.2-dmo1                            i386         AAC+ encoding library - runtime files
rc  libavcodec55:i386                     10:2.3.3-dmo3                         i386         Library to encode decode multimedia streams - runtime files
rc  libavresample1:i386                   10:2.3.3-dmo3                         i386         FFmpeg audio conversion library
rc  libavutil52:i386                      10:2.3.3-dmo3                         i386         FFmpeg avutil library - runtime files
rc  libavutil53:i386                      6:10.4-1                              i386         Libav utility library
rc  libcrystalhd3:i386                    1:0.0~git20110715.fdd2f19-11          i386         Crystal HD Video Decoder (shared library)
rc  libfaac0:i386                         1:1.28-dmo3                           i386         AAC audio encoder - library files.
rc  libfdk-aac0:i386                      1:0.1.3-dmo1                          i386         Fraunhofer FDK AAC codec library.
rc  libfftw3-long3:amd64                  3.3.4-1                               amd64        Library for computing Fast Fourier Transforms - Long precision
rc  libgssglue1:amd64                     0.4-2                                 amd64        mechanism-switch gssapi library
rc  libjim0.74:amd64                      0.74-3                                amd64        small-footprint implementation of Tcl - shared library
rc  liblcms1:i386                         1.19.dfsg2-1.5                        i386         Little CMS color management library
rc  libmkv0:amd64                         0.6.5.1-dmo3                          amd64        Alternitave to the official libmatroska/libebml libraries.
rc  libmp4v2-2:amd64                      2:2.0.0-dmo2                          amd64        MP4 container library - runtime files
rc  libswresample0:i386                   10:2.3.3-dmo3                         i386         FFmpeg audio rescaling library
rc  libupower-glib2:amd64                 0.99.0-3                              amd64        abstraction for power management - shared library
rc  libx265-25:amd64                      1.2-dmo1                              amd64        x264 video coding library.
rc  libx265-25:i386                       1.2-dmo1                              i386         x264 video coding library.
rc  libx265-31:i386                       1.3-dmo1                              i386         x264 video coding library
rc  libzvbi0:i386                         0.2.35-2                              i386         Vertical Blanking Interval decoder (VBI) - runtime files
rc  pcmciautils                           018-8                                 amd64        PCMCIA utilities for Linux 2.6

fike@klatoon:~$

Let us pick pcmciautils package as example. Checking if it doesn’t be installed on my OS.

1
2
3
4
fike@klatoon:~$ dpkg -L pcmciautils
Package `pcmciautils' does not contain any files (!)

fike@klatoon:~$ 

Now, opening “/var/lib/dpkg/status” file, here has the status all packages existents and search pcmciautils package status.

/var/lib/dpkg/status
1
2
3
4
5
6
...
Package: pcmciautils
Status: deinstall ok config-files
Priority: extra
Section: admin
...

A little strange “deinstall ok config-files” as status, right? Well, it’s more easy to understand. Checking again dpkg manual…

dpkg manual
1
2
3
4
5
6
7
8
9
10
11
fike@klatoon:~$man dpkg
...
   Package selection states
       install
              The package is selected for installation.

       hold   A package marked to be on hold is not handled by dpkg, unless forced to do that with option --force-hold.

       deinstall
              The package is selected for deinstallation (i.e. we want to remove all files, except configuration files).
...

Gotcha! Its more easy to understand. To pcmciautils packages, the rc status is because its removed and still has the configuration file.

1
2
3
4
5
fike@klatoon:~$ find /etc/ /var/ -name "*pcmcia*" -print 2> /dev/null
/etc/pcmcia
/var/lib/dpkg/info/pcmciautils.list
/var/lib/dpkg/info/pcmciautils.postrm
fike@klatoon:~$ 

The finally, removing all packages with rc status.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
root@klatoon:~# aptitude purge $(dpkg -l|grep ^[rc] | awk '{ print $2}')
The following packages will be REMOVED:
  libaacplus2:i386{p} libavcodec55:i386{p} libavresample1:i386{p} libavutil52:i386{p} libavutil53:i386{p} libcrystalhd3:i386{p} libfaac0:i386{p}
  libfdk-aac0:i386{p} libfftw3-long3{p} libgssglue1{p} libjim0.74{p} liblcms1:i386{p} libmkv0{p} libmp4v2-2{p} libswresample0:i386{p} libupower-glib2{p}
  libx265-25{p} libx265-25:i386{p} libx265-31:i386{p} libzvbi0:i386{p} pcmciautils{p}
0 packages upgraded, 0 newly installed, 21 to remove and 4 not upgraded.
Need to get 0 B of archives. After unpacking 0 B will be used.
Do you want to continue? [Y/n/?]
(Reading database ... 214094 files and directories currently installed.)
Removing libaacplus2:i386 (2.0.2-dmo1) ...
Purging configuration files for libaacplus2:i386 (2.0.2-dmo1) ...
Removing libavcodec55:i386 (10:2.3.3-dmo3) ...
Purging configuration files for libavcodec55:i386 (10:2.3.3-dmo3) ...
Removing libavresample1:i386 (10:2.3.3-dmo3) ...
Purging configuration files for libavresample1:i386 (10:2.3.3-dmo3) ...
Removing libavutil52:i386 (10:2.3.3-dmo3) ...
Purging configuration files for libavutil52:i386 (10:2.3.3-dmo3) ...
Removing libavutil53:i386 (6:10.4-1) ...
Purging configuration files for libavutil53:i386 (6:10.4-1) ...
Removing libcrystalhd3:i386 (1:0.0~git20110715.fdd2f19-11) ...
Purging configuration files for libcrystalhd3:i386 (1:0.0~git20110715.fdd2f19-11) ...
Removing libfaac0:i386 (1:1.28-dmo3) ...
Purging configuration files for libfaac0:i386 (1:1.28-dmo3) ...
Removing libfdk-aac0:i386 (1:0.1.3-dmo1) ...
Purging configuration files for libfdk-aac0:i386 (1:0.1.3-dmo1) ...
Removing libfftw3-long3:amd64 (3.3.4-1) ...
Purging configuration files for libfftw3-long3:amd64 (3.3.4-1) ...
Removing libgssglue1:amd64 (0.4-2) ...
Purging configuration files for libgssglue1:amd64 (0.4-2) ...
Removing libjim0.74:amd64 (0.74-3) ...
Purging configuration files for libjim0.74:amd64 (0.74-3) ...
Removing liblcms1:i386 (1.19.dfsg2-1.5) ...
Purging configuration files for liblcms1:i386 (1.19.dfsg2-1.5) ...
Removing libmkv0:amd64 (0.6.5.1-dmo3) ...
Purging configuration files for libmkv0:amd64 (0.6.5.1-dmo3) ...
Removing libmp4v2-2:amd64 (2:2.0.0-dmo2) ...
Purging configuration files for libmp4v2-2:amd64 (2:2.0.0-dmo2) ...
Removing libswresample0:i386 (10:2.3.3-dmo3) ...
Purging configuration files for libswresample0:i386 (10:2.3.3-dmo3) ...
Removing libupower-glib2:amd64 (0.99.0-3) ...
Purging configuration files for libupower-glib2:amd64 (0.99.0-3) ...
Removing libx265-25:i386 (1.2-dmo1) ...
Purging configuration files for libx265-25:i386 (1.2-dmo1) ...
Removing libx265-25:amd64 (1.2-dmo1) ...
Purging configuration files for libx265-25:amd64 (1.2-dmo1) ...
Removing libx265-31:i386 (1.3-dmo1) ...
Purging configuration files for libx265-31:i386 (1.3-dmo1) ...
Removing libzvbi0:i386 (0.2.35-2) ...
Purging configuration files for libzvbi0:i386 (0.2.35-2) ...
Removing pcmciautils (018-8) ...
Purging configuration files for pcmciautils (018-8) ...

root@klatoon:~#

Updating

@kretcheu saw by twitter another and best command to remove these packags.

1
#aptitude ~c

P.S. I know, I could went directly the final but it’s cool understand why of the things. :)

Banco do Brasil e OpenJDK

| Comments

Banco do Brasil e OpenJDK

Para usar o internet banking do Banco do Brasil num Debian 64 bits era um pouco mais trabalhoso do que outros sistemas operacionais. Para usá-lo, eu tinha uma máquina virtual (Virtualbox) 32 bits com Debian Wheezy instalado e o OpenJDK+Icedtea.

Poderia usar a JVM da Oracle? Sim, poderia mas é mais trabalhoso manter ela atualizada do que usar uma máquina virtual 32 bits.

Algum tempo atrás, o ricardoperera perguntou no canal de IRC do Debian Brasil (sim, ainda uso IRC…) se alguém tinha dica de como acessar o internet banking usando o Wheezy. Minha sugestão para ele foi usar uma vm em 32 bits e passei o template do Veewee para instalar tudo que precisa para acessar o internet banking.

O tiago_tm sugeriu uma abordagem melhor, usar o setarch.

setarch
1
fike@klatoon:/tmp$ setarch x86_64 --uname-2.6 iceweasel

TDC 2014 e palestra sobre Web Performance

| Comments

Apresentei no The Developer’s Conference 2014 (SP) dicas para melhorar desempenho para o usuário. Vai desde o básico de infraestrutura à técnicas de FEO (Front-End Optimization).

Participei pouco do evento mas o suficiente para dizer que estava com saudades de ir em eventos de tecnologia. Quase estava esqucendo, tenho que agradecer a organização pela oportunidade e se o vídeo da palestra for publicado em algum lugar, posto aqui depois.

Using httpie instead curl

| Comments

I love curl. It’s awesome to test many services like HTTP/HTTPS, FTP, IMAP, etc. But, curl sometimes is hard to use for my customers. So, I have recommended that they use the httpie.

In my main job, I use curl/httpie to see HTTP headers and cache problems. Then,
when I need to display evidence for my customers, I prefer to use httpie.

A simple example using only HTTP headers.

curl
1
2
3
4
5
6
7
8
9
10
11
12
fike@klatoon:~/d$ curl -I http://fernandoike.com
HTTP/1.1 200 OK
Date: Tue, 22 Jul 2014 14:40:56 GMT
Server: Apache/2.2.22
Last-Modified: Thu, 31 May 2012 20:17:19 GMT
ETag: "c57c-b1-4c15ac12cd1c0"
Accept-Ranges: bytes
Content-Length: 177
Vary: Accept-Encoding
Content-Type: text/html

fike@klatoon:~/d$ 
httpie
1
2
3
4
5
6
7
8
9
10
11
12
13
fike@klatoon:~/d$ http --headers http://fernandoike.com
HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Encoding: gzip
Content-Length: 146
Content-Type: text/html
Date: Tue, 22 Jul 2014 14:20:57 GMT
ETag: "c57c-b1-4c15ac12cd1c0"
Last-Modified: Thu, 31 May 2012 20:17:19 GMT
Server: Apache/2.2.22
Vary: Accept-Encoding

fike@klatoon:~/d$ 

Easy and simple, right? But this isn’t the most cool feature. The most cool httpie feature is the STDOUT colorized.

However, curl and httpie have a few differences. The curl option “-I” uses the HEAD HTTP method and httpie use GET HTTP method. The HEAD HTTP method can’t work in all scenarios because a firewall, IPS or WAF can block this method.

For the curl to haave the same behavior as httpie and use GET HTTP method, it must use more options:

curl
1
2
3
4
5
6
7
8
9
10
11
12
13
fike@klatoon:~/d$ curl -s -D - http://fernandoike.com -o /dev/null

HTTP/1.1 200 OK
Date: Tue, 22 Jul 2014 15:10:24 GMT
Server: Apache/2.2.22
Last-Modified: Thu, 31 May 2012 20:17:19 GMT
ETag: "c57c-b1-4c15ac12cd1c0"
Accept-Ranges: bytes
Content-Length: 177
Vary: Accept-Encoding
Content-Type: text/html

fike@klatoon:~/d$ 

For add HTTP headers using curl, you have to use “-H” option. For example, to add HTTP header to disable keep-alive connection.

curl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
fike@klatoon:~/d$ curl -H "Connection: close" -s -D - http://fernandoike.com -o /dev/null

HTTP/1.1 200 OK
Date: Tue, 22 Jul 2014 15:17:43 GMT
Server: Apache/2.2.22
Last-Modified: Thu, 31 May 2012 20:17:19 GMT
ETag: "c57c-b1-4c15ac12cd1c0"
Accept-Ranges: bytes
Content-Length: 177
Vary: Accept-Encoding
Connection: close
Content-Type: text/html

fike@klatoon:~/d$ 

And with httpie it’s simpler…

httpie
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
fike@klatoon:~/d$ http --headers http://www.fernandoike.com "Connection: close"

HTTP/1.1 200 OK
Accept-Ranges: bytes
Connection: close
Content-Encoding: gzip
Content-Length: 16424
Content-Type: text/html
Date: Tue, 22 Jul 2014 15:22:58 GMT
ETag: "2010c-d3fb-4fdd68cfc0d40"
Last-Modified: Thu, 10 Jul 2014 13:10:37 GMT
Server: Apache/2.2.22
Vary: Accept-Encoding

fike@klatoon:~/d$ 

Another example: adding HTTP headers if want identify if a URI is cacheable in a CDN. This case was tested on a site that uses Akamai.

curl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
fike@klatoon:~/d$ curl -H "Pragma: akamai-x-cache-on" -s -D - http://www.bestbuy.com -o /dev/null

HTTP/1.1 200 OK
Server: Apache
Content-Length: 4663
Content-Type: text/html
ETag: "7a10c27a970af1daf4b526ed08cd28c0:1343841543"
Expires: Tue, 22 Jul 2014 15:25:00 GMT
Cache-Control: max-age=0, no-cache, no-store
Pragma: no-cache
Date: Tue, 22 Jul 2014 15:25:00 GMT
X-Cache: TCP_MEM_HIT from a201-20-244-37.deploy.akamaitechnologies.com (AkamaiGHost/6.16.2.1-13049459) (-)
Connection: keep-alive

fike@klatoon:~/d$ 

The same test with httpie.

httpie
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
fike@klatoon:~/d$ http --headers http://www.bestbuy.com "Pragma: akamai-x-cache-on"

HTTP/1.1 200 OK
Cache-Control: max-age=0, no-cache, no-store
Connection: keep-alive
Content-Encoding: gzip
Content-Length: 1658
Content-Type: text/html
Date: Tue, 22 Jul 2014 15:23:55 GMT
ETag: "7a10c27a970af1daf4b526ed08cd28c0:1343841543"
Expires: Tue, 22 Jul 2014 15:23:55 GMT
Pragma: no-cache
Server: Apache
Vary: Accept-Encoding
X-Cache: TCP_HIT from a201-20-244-37.deploy.akamaitechnologies.com (AkamaiGHost/6.16.2.1-13049459) (-)

If you want search about Akamai HTTP headers, go to Stackoverflow link.

In conclusion, if you need something more friendly, use httpie. But if you need run more complex tests, curl is the tool.

P.S. Install httpie is simple a Debian like. Debian has official package.

1
#aptitude install httpie

Entendendo um pouco mais sobre containers

| Comments

Se está curioso em saber mais sobre containers Linux, especificamente sobre o Docker e como foi implementado. No blog do DotCloud tem alguns textos do Jérôme Petazzoni detalhando sobre o Docker e como funciona.

Tem um epub deles, é pequeno mas é bem legal de ler.

Containers Linux com Docker

| Comments

Docker é provavelmente o novo buzzword depois do OpenStack (se você lembrar de outro, comenta aí.). O Docker é desenvolvido em Go e usa a Apache License, ele algumas funcionalidades interessantes ao LXC como um repositório público de containers, DSL(Domain-Specific Language) bem simplicado para criar containers e fazer commit (como svn commit ou git commit) das alterações dos containers.

A página de manual do Docker tem uma explicação melhor que a minha.

Docker complementa o LXC, atuando como uma API de alto nível no nível de processo. Ele executa processos unix com forte garantia de isolamento e repetibilidade nos servidores.

O conceito de container é antigo no universo Unix/Linux e várias “implementações”, antes de virtualização ser amplamente usado era muito comum usar chroot para prover isolamento de serviços (BIND, Postfix, etc.). Outros tipos de containers muito usados no Linux são OpenVZ e Vserver mas nenhum deles teve uma adoção em massa tão grande como o Docker. Isso porque ele facilitou muito o trabalho para criar e manter os containers. Essas são alguns razões porque ele tem sido adotado por muitas empresas como: Googe, Red Hat, Baidu, Ebay, Yandex, Spotify, Canonical, etc.

A instalação, atualmente, é bem relativamente simples. A maioria das distribuições Linux suporta de alguma forma. No Debian está disponível nos repositórios oficiais para Sid e Jessie (a próxima versão estável).

Se quiser instalar o Docker no Wheezy (atual versão estável) terá que usar os pacotes mantido pela equipe do Docker e usar o kernel linux acima da versão 3.8. Provavelmente terá que usar o repositório Backports para isso, então terá que acrescentar no arquivo sources.list.

1
2
3
4
5
#echo "http://http.debian.net/debian/ wheezy-backports main non-free contrib" >> /etc/apt/sources.list.d/backports.list

#aptitude update

#aptitude -t wheezy-backports install linux-image-amd64 linux-headers-amd64

Os textos na internet mostram duas formas de instalar no Wheezy, uma usando o Docker empacotado para o Ubuntu e a outra baixando o binário diretamente do site do Docker.

1
#wget https://get.docker.io/builds/Linux/x86_64/docker-latest -O /usr/local/bin/docker

Mais detalhes de como instalar no Wheezy, recomendo ler os textos no Debian Administration.

No Jessie e no Sid, basta instalar via aptitude.

1
#aptitude install docker.io

O restante do texto e outros poderão ser escritos num futuro próximo, será usado como referência o Docker do repositório oficial do Debian.

O Docker tem um repositório público onde qualquer pode disponibilizar container para qualquer um usar. Algumas empresas estão suportando oficialmente seus produtos no Docker (Ubuntu e CentOS). Além dos repositórios oficiais tem uma grande variedade de container disponíveis, pode usá-las para testar softwares ou se confiar no autor do container usá-las para disponibilizar rapidamente um servidor JBoss, MongoDB, PostgreSQL, etc.

Para pesquisar os containers disponíveis é usando o search.

1
2
3
4
5
6
7
8
9
10
11
12
13
$docker.io search postgresql | head -n10

NAME                     DESCRIPTION                                     STARS  OFFICIAL  AUTOMATED
postgres                 PostgreSQL is a powerful, open source obje...   65
paintedfox/postgresql    A docker image for running Postgresql.          30                 [OK]
atlassian/jira           Atlassian Jira image with Postgresql.           11                 [OK]
helmi03/docker-postgis   PostGIS 2.1 in PostgreSQL 9.3                   9                  [OK]
zaiste/postgresql        PostgreSQL 9.2 - https://gist.github.com/z...   8
zumbrunnen/postgresql    PostgreSQL from apt.postgresql.org              6                  [OK]
orchardup/postgresql     https://github.com/orchardup/docker-postgr...   6                  [OK]
kamui/postgresql         PostgreSQL 9.3 with configurable login/dat...   5                  [OK]
tutum/postgresql         PostgreSQL Docker Image – listens on po...      4                  [OK]
[...]

No retorno do comando, alguns campos relevantes são NAME, STAR e AUTOMATED. NAME com “/” é dono do repositório e o nome do repositório, o STAR é o números de pessoas que marcaram como destaque o repositório e AUTOMATED é se o container foi criado automaticamente ou não. Talvez este seja o mais interessante ou “auditável” porque ele é gerado por um arquivo com os passos para criar o container que foi publicado no Github ou Bitbucket.

Se quiser um container usando o Debian como base, tem duas formas. Uma usando o repositório “semi-oficial” e a outra é você usando o debootstrap. Alguns desenvolvedores do Debian não recomendam usar o repositório semi-oficial porque ele está ligeiramente diferente da versão via debootstrap. Recomendo leitura do texto do Joey Hess que tem um ponto de vista interessante.

Pela simplicidade de usar containers com o Docker, pode-se esquecer alguns aspectos de segurança, então é recomendado fortemente ler o texto “CONTAINERS & DOCKER: HOW SECURE ARE THEY?” no blog do Docker e também a página de segurança na documentação oficial

Docker é uma das coisas mais legais que pude me envolver um pouco mais nos últimos tempos mas é importante lembrar que ele não é (e nem pode ser considerado) a nova bala de prata.