Ir para o conteúdo
ou

Software livre Brasil

Tela cheia
 Feed RSS

Blog

27 de Maio de 2009, 0:00 , por Software Livre Brasil - | Ninguém está seguindo este artigo ainda.
cover do http://fernandoike.com

Building Debian images by jigdo

19 de Agosto de 2015, 19:03, por Mnemonic's Fike - 0sem comentários ainda

A friend asked me how to got a Debian Old Image, she wanted to download Debian Squeeze DVD image. Unfortunately, it’s impossible to download by Debian-CD mirror because Squeeze isn’t more maintainer. So, it’s possible to get a Image by Debian-CD primary server but it’s locate in Sweden. Nothing problem, right? Well, She lives in Brazil and the download time is a little bit more than 8 hours.

A good tool to “download” a Debian image is the Jigdo. It’s a program to synchronize repositories and generate Images. It get packages and build a image locally in your computer.

I made a simple test, I used jigdo to “download” the first Squeeze DVD by brazilian repository (Unicamp) and compare with a download image by PR (Primary Server). The difference was huge, PS download took a long time to finish (8 hours) and Unicamp mirror took 100 minutes.

Well, let’s go to practice.

Install jigdo

1
#aptitude install jigdo

Downloading and building image

The jigdo file (.jigdo) is simple list with all packages and hash of a instalation image. You need it to start the downloads. In this case, I used jigdo file to build first Squeeze DVD.

1
$jigdo-lite http://cdimage.debian.org/cdimage/archive/6.0.10/amd64/jigdo-dvd/debian-6.0.10-amd64-DVD-1.jigdo

Before to begin download, jidgo need some arguments. Fill arguments of your preference but remember that the argument more important is the mirror. If you have doubt what’s mirror is more fast, you can use netselect-apt to discovery. For my test, I’m used Unicamp mirror (http://debian.las.ic.unicamp.br/debian).

My jigdo-lite conf file.

1
2
3
4
5
6
7
8
9
$cat ~/.jigdo-lite
-------
jigdo=''
debianMirror='http://debian.las.ic.unicamp.br/debian/'
nonusMirror=''
tmpDir='.'
jigdoOpts='--cache jigdo-file-cache.db'
wgetOpts='--passive-ftp --dot-style=mega --continue --timeout=30'
scanMenu='

Nice, huh?

Take a coffee and forget to download Debian images using others programs (curl, wget, etc.). :)



FISL 16

10 de Agosto de 2015, 18:29, por Mnemonic's Fike - 0sem comentários ainda

FISL 16 aconteceu algumas semanas atrás… e depois de nem tão rigoroso inverno consegui rascunhar alguma coisas sobre o evento.

Impressões

Como sempre, sempre bom rever os amigos e conhecidos de inúmero projetos que participam. O evento não estava tão lotado como nos últimos anos que participei mas mesmo sim acredito que teve um bom público.

A internet até que funcionou razoavelmente bem, o wifi do evento era usável a maior parte do tempo e também gostei das palestras que assisti. Curti demais participar da Mini-Debconf realizada durante o FISL, fico feliz que em 2015 no Brasil serão (no mínimo) 3 Micro/Mini-Debconf. :)

As minhas apresentações

Este ano fiz duas apresentações no FISL16, uma sobre Web Performance e a outra sobre Management 3.0. A apresentação de de Web Performance foi a última vez que apresentei (acho), fiz algumas pequenas atualizações e acréscimo de exemplos que a deixou com +– 100 lâminas (slides). Já tem material suficiente para escrever um livro (quem sabe…). ;)

A apresentação sobre Management 3.0 é sobre como foi descobrir que usamos (equipe de TI que participei) esse conceito antes de saber que existiu um nome. Eu descobri Management 3.0 depois de participar de um curso de Scrum com Manoel Pimentel, isso foi alguns anos depois que já não era mais gerente. Ele me ajudou bastante para avaliar os erros e acertos como gerente. Recomendo para quem se interessar desempenhar o papel de líder de equipe ou chefia a estudar um pouco mais sobre tema.

Um milhão de usuários simultâneos

Um milhao de usuários simultâneos

O vídeo da apresentação pode ser acessado por aqui e aqui.

Management 3.0

Management 3.0 – a vida pós-agilidade

O vídeo da apresentação pode ser acessado por aqui.



Eventos em Maio de 2015

11 de Maio de 2015, 14:45, por Mnemonic's Fike - 0sem comentários ainda

Essa semana estarei participando de dois eventos como palestrante.

Devcamp

O Devcamp é a “A maior conferência de desenvolvimento de software do interior São Paulo” e esterei apresentando sobre a minha experiência em migrar para Docker. Docker é novo buzzword um projeto de automação de deploys de aplicações dentro de contêineres. Se estiver por lá e quiser tomar um café, estarei a disposição.

Meetup Germinadora

Provavelmente é a última vez que apresente essa palestra sobre Web Performance (“Um milhão de usuários simultâneos”). Não que eu não goste de falar sobre o tema, pelo contrário (gosto bastante)! Tem algumas partes específicas dessa apresentação que quero abordar numa próxima vez.

Se estiver de bobeira por aqui em São Paulo, passe por lá.



Docker 1.6 lançado

27 de Abril de 2015, 17:48, por Mnemonic's Fike - 0sem comentários ainda

O lançamento da versão 1.6 veio com boas novidades, algumas delas são do ecossistema mas cabe destacar: Docker Compose, Docker Machine e o Registry. O Compose é o antigo Fig, ele facilita bastante se você trabalho com sistemas em múltiplos containers. O Machine permite criar uma infraestrutura Docker rapidamente, seja numa máquina virtual (exemplo: Virtualbox) ou mesmo numa IaaS (AWS, Digital Ocean, etc.).

As funcionalidades da versão 1.6 que gostei foram:

  • Suporte a Image Labels No Dockerfile pode adicionar um campo extra para usar como identificação sua. Isso permite pesquisar informações de containers e imagens usando esse campo.

  • Logging Drivers Ficou bem mais fácil enviar os logs para um Syslog ou similares. Muita gente tem dificuldade de lidar com os logs do container até essa versão.

  • Alterar as imagens de containers sem recriá-las A partir desta versão é possível alterar algumas coisas numa imagem de container sem a necessidade de gerar novamente.

  • Ulimit A minha favorita, agora é possível alterar alguns parâmetros do ulimit, bom para serviços que usam muito processos como banco de dados.

Para saber mais, acesse o blog do Docker que tem mais informações.

Obs.: Ah, a versão 1.6 está na Experimental no Debian e infezlimente não entrou na Jessie, mas logo estará disponível no Backports.

Obs.2: O original dessa imagem é do blog do Docker.



docker 1 dot 6 lancado

27 de Abril de 2015, 0:00, por Fike's Mnemonics - 0sem comentários ainda

{% img center /images/docker-1.6.png %}

O lançamento da versão 1.6 veio com boas novidades, algumas delas são do ecossistema mas cabe destacar: Docker Compose, Docker Machine e o Registry. O Compose é o antigo Fig, ele facilita bastante se você trabalho com sistemas em múltiplos containers. O Machine permite criar uma infraestrutura Docker rapidamente, seja numa máquina virtual (exemplo: Virtualbox) ou mesmo numa IaaS (AWS, Digital Ocean, etc.).

As funcionalidades da versão 1.6 que gostei foram:

  • Suporte a Image Labels No Dockerfile pode adicionar um campo extra para usar como identificação sua. Isso permite pesquisar informações de containers e imagens usando esse campo.

  • Logging Drivers Ficou bem mais fácil enviar os logs para um Syslog ou similares. Muita gente tem dificuldade de lidar com os logs do container até essa versão.

  • Alterar as imagens de containers sem recriá-las A partir desta versão é possível alterar algumas coisas numa imagem de container sem a necessidade de gerar novamente.

  • Ulimit A minha favorita, agora é possível alterar alguns parâmetros do ulimit, bom para serviços que usam muito processos como banco de dados.

Para saber mais, acesse o blog do Docker que tem mais informações.

Obs.: Ah, a versão 1.6 está na Experimental no Debian e infezlimente não entrou na Jessie, mas logo estará disponível no Backports.

Obs.2: O original dessa imagem é do blog do Docker.



Debian Jessie (8) lançado

26 de Abril de 2015, 21:53, por Mnemonic's Fike - 0sem comentários ainda

O Debian continua executando o plano de dominação do universo. As duas novidades é que a eleição do novo líder do projeto, Neil McGovern, após dois mandatos do Lucas Nussbaum.

A outra novidade é que nova versão estável (Jessie) do Debian foi lançada no dia 25 de Abril de 2015 com a narração da mudança do Wheezy para a Jessie. Se quiser ver como foi o lançamento, use a hashgtag #releasingjessie

São 75 idiomas suportadas na instalação, systemd como sistema de inicialização padrão, MySQL, MariaDB, Samba 4.1, PostgreSQL 9.4, etc. São mais de 43 mil pacotes a partir de 21 mil (pacotes) fonte. Suporte a numa nova arquitetura (ARM64). O tempo de freezing desta versão foi relativamente curto, 171 dias.

Pouco? Bom, o restante das novidades você pode ler mais [aqui][debianews].

Quem diria?

Nos anos que trabalhei como consultor de tecnologias em software livre/código aberto, era muito difícil integrar ou substituir sistemas proprietários. Principalmente nos casos de servidores, storages e/ou equipamento de backups.

O trabalho maior não era o técnico, era de reverter o marketing negativo. Coisas como: “Não tem licença, como é que você irá acreditar numa empresa que não é dona do produto”, “A comunidade vai dar suporte? Fica esperando, então!”, “O fornecedor de hardware não suporta o Debian, se quiser use uma distribuição comercial”, “Um Sistema Operacional que só usa tela preta? Isso é anos 80!”

Depois de alguns e bons anos o que mudou? Muita coisa, tanto que a Microsoft participou das festas de lançamento da Jessie.



iprf 2015 e linux

2 de Março de 2015, 0:00, por Fike's Mnemonics - 0sem comentários ainda

aptitude install libgtk2.0-0:i386 libpangox-1.0-0:i386 libpangoxft-1.0-0:i386 libidn11:i386 libglu1-mesa:i386

root para instalar o receitanet



Configuração de compressão gzip para sites e ranking de CDN

24 de Dezembro de 2014, 1:55, por Software Livre Brasil - 0sem comentários ainda

Estava lendo um texto do Steve Souders sobre a alteração da configuração padrão gzip na Fastly. Fastly é uma CDN concorrente da Akamai e tem clientes como Twitter, Shopify, The Guardian, Rakuten, etc.

Ele cita como chegaram no template padrão da configuração deles usando os dados do HTTP Archive, este é um projeto que consolida testes executados usando a versão pública do Webpagetest. Os testes são executados em mais ou menos 18 mil URLs e tem relatórios variados, por exemplo: número médio de requisições HTTP por página, crescimento do HTML nas páginas, etc.

Tanto do Steve Souders quanto no site HTTP Archive fazem referência ao Bigqueries com diversas consultas realizadas na base dados do HTTP Archive. Um texto postado no Bigqueries chamou-me a atenção, era sobre o Ranking de CDNs considerandos as páginas mais populares.

Ele considerou apenas as páginas que estavam sendo entregues por alguma CDN e não considerou todas as requisições HTTP das páginas. Usei o BigQuery do Google considerando os dados disponíveis do HTTP Archive no mês de Novembro de 2014 para responder: Quais são as CDNs mais populares ao analisar as requisições HTTP?

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT cdn, num, ROUND(ratio*100) as percent FROM (
  SELECT cdn, COUNT(cdn) as num, RATIO_TO_REPORT(num) OVER() ratio   FROM (
     SELECT CASE
       WHEN _cdn_provider IN ('')
         THEN 'None'
         ELSE 'CDN'
       END as cdn
      FROM httparchive:runs.2014_11_01_requests,
           httparchive:runs.2014_11_15_requests,
           httparchive:runs.2014_11_01_requests_mobile,
           httparchive:runs.2014_11_15_requests_mobile
   ) GROUP BY cdn
) ORDER BY percent DESC

E quais foram as CDNs mais usadas naquele período?

1
2
3
4
5
6
7
8
9
10
SELECT provider, round(100*ratio) as percent, num
FROM (SELECT REGEXP_REPLACE(_cdn_provider,r'^$', 'None') as provider, count(*) as num, RATIO_TO_REPORT(num) OVER() ratio
 FROM httparchive:runs.2014_11_01_requests,
      httparchive:runs.2014_11_15_requests,
      httparchive:runs.2014_11_01_requests_mobile,
      httparchive:runs.2014_11_15_requests_mobile
 WHERE  _cdn_provider != ''
GROUP BY provider
)
ORDER BY num desc LIMIT 10

A surpresa no ranking é o Google, porque ele seria considerado uma CDN?

Para tentar entender, outra consulta buscando os principais hostnames/domínios que estão na CDN do Google.

1
2
3
4
5
6
7
8
9
SELECT req_host, count(req_host) as num
FROM httparchive:runs.2014_11_01_requests,
     httparchive:runs.2014_11_15_requests,
     httparchive:runs.2014_11_01_requests_mobile,
     httparchive:runs.2014_11_15_requests_mobile
WHERE _cdn_provider = 'Google'
GROUP BY req_host
ORDER BY num DESC
LIMIT 20

Basicamente, a CDN da Google entrega seus próprios serviços: Analytics, Adsense, Doubleclick, Youtube, etc. Os hostnames fonts.googleapis.com, ajax.googleapis.com estão relacionados a iniciativas do Goolgle de hospedar alguns frameworks javascripts e webfonts gratuitamente.

Então, o Google poderia ser considerado um fornecedor de CDN? Um pouco difícil de definir porque não existe um documento canonical (RFC) que defina CDN. A Wikipedia tem artigo sobre CDN e a primeira frase tem uma boa definição

A content delivery network or content distribution network (CDN) is a large distributed system of servers deployed in multiple data centers across the Internet. The goal of a CDN is to serve content to end-users with high availability and high performance. CDNs serve a large fraction of the Internet content today, including web objects (text, graphics and scripts), downloadable objects (media files, software, documents), applications (e-commerce, portals), live streaming media, on-demand streaming media, and social networks.

Se a for usado a definição da Wikipedia para CDN, pode-se afirmar que alguns serviços do Google são uma CDN. Entretanto, se descartar o Google como CDN e consideramos que as demais restantes são CDNs que seus usuários paguem para entregar o seu conteúdo. Como ficaria o ranking com as 15 mais usadas?

1
2
3
4
5
6
7
8
9
10
SELECT provider, round(100*ratio) as percent, num
FROM (SELECT REGEXP_REPLACE(_cdn_provider,r'^$', 'None') as provider, count(*) as num, RATIO_TO_REPORT(num) OVER() ratio
  FROM httparchive:runs.2014_11_01_requests,
       httparchive:runs.2014_11_15_requests,
       httparchive:runs.2014_11_01_requests_mobile,
       httparchive:runs.2014_11_15_requests_mobile
  WHERE _cdn_provider != 'Google' AND _cdn_provider != ''
GROUP BY provider
)
ORDER BY num desc

Dentre as acima listadas, as que tem ou tera ponto de presença no Brasil: Akamai, Cloudflare, EdgeCast, CloudFront, Fastly, MaxCDN (NetDNA), CDNetwokrs, ChinaNetCenter, Level3, Incapsula e Highwinds.

Voltando ao início e aoEu texto do Souders sobre compressão, ele propôs que habilite/configure a compressão quando as respostas HTTP tiverem :

Extensions: js css html json ico eot otf ttf

Ou

Content-Type: text/html application/x-javascript text/css application/javascript text/javascript text/plain text/xml application/json application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/xml font/eot font/opentype font/otf image/svg+xml image/vnd.microsoft.icon

A configuração padrão na Akamai é:

Content-Type: text/html text/css application/x-javascript text/xml text/plain application/json text/javascript *

Fazendo consulta similar ao do Souders para saber “Quais os content-types mais mais recorrentes acima de 1 mil recorrências e que tiveram compressão habilitada?”.

1
2
3
4
5
6
7
8
SELECT content_type, round(100*ratio) as percent, num
FROM
  (SELECT count(resp_content_type) as num,
    REGEXP_REPLACE(resp_content_type,r';.*', '') as content_type, RATIO_TO_REPORT(num) OVER() ratio
    FROM httparchive:runs.2014_11_01_requests
    WHERE NOT (resp_content_type contains 'image' OR resp_content_type contains 'audio' OR resp_content_type = '') AND _gzip_save > 0
    GROUP BY content_type HAVING num > 1000)
ORDER BY num DESC;

Da lista, pode-se descartar alguns: application/octet-stream (formato genérico de arquivos), text/x-component (formato microsoft antigo, não mais usado), application/x-shockwave-flash, font/woff e application/x-www-form-urlencoded. Os três últimos são formatos já com compressão e fazer compressão num servidor web ou CDN é usar o processamento desnecessariamente.

Juntado as listas, a regra a ser configurado no servidor web, proxy reverso ou CDN será:

Extensions: js css html json ico eot otf ttf

Content-Type: text/html application/x-javascript text/css application/javascript text/javascript text/plain text/xml application/json application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/xml font/eot font/opentype font/otf image/svg+xml image/vnd.microsoft.icon text/x-js.

Acrescentado o text/x-js na lista de Content-Type, um site poderá ter mais requisições HTTP compressão, consequentemente o site terá o tráfego de rede menor. Claro, sem esquecer de mencionar que o usuário poderá ter uma experência melhor com as páginas do site já que elas poderão ser menores e mais rápidas.

Nas novas configurações na Akamai estou acrescentando os Content-Type e os arquivos para as regras de compressão e cache como abaixo:

Regra de compressão

Regra de Cache

Os resultados e comentários sobre ranking das CDNs estão no texto que publiquei publicado no Bigqueries.

Obs.: As expressões regulares no BigQuery são baseadas no RE2, recomendo fortemente ler a documentação dele.

Links

http://httparchive.org/

http://httparchive.org/trends.php

http://en.wikipedia.org/wiki/Content_delivery_network

http://www.fastly.com/blog/new-gzip-settings-and-deciding-what-to-compress/

http://bigqueri.es/t/whats-the-popularity-of-different-cdns/477

https://cloud.google.com/bigquery/query-reference

https://code.google.com/p/re2/wiki/Syntax



Meetup Docker-SP: Docker na vida real

17 de Novembro de 2014, 12:44, por Software Livre Brasil - 0sem comentários ainda

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

23 de Outubro de 2014, 15:02, por Software Livre Brasil - 0sem comentários ainda

<p><img src="http://www.fernandoike.com/images/solomon-keynote-penguin-authentication-300x235.png" /></p> <p>A <a href="https://blog.docker.com/2014/10/docker-1-3-signed-images-process-injection-security-options-mac-shared-directories/">versão 1.3</a> do <a href="http://www.docker.com">Docker</a> foi lançada recentemente. Eu gostei dela por duas razões.</p> <h2>Verificação da assinatura digital</h2> <p>O pessoal da DotCloud já tinha <a href="https://blog.docker.com/2014/09/docker-hub-official-repos-announcing-language-stacks/">anunciado</a> alguns repositórios oficiais de alguma ferramentas e linguagens de programação (<strong>C(++)/GCC</strong>, <strong>PHP</strong>, <strong>Go</strong>, <strong>Java</strong>, <strong>Nodejs</strong>, <strong>Python</strong>, <strong>Perl</strong>, <strong>Ruby</strong>, 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)</p> <p>Antes disso eu tinha um pouco de restrição com os repositórios de terceiros. Até então, preferia criar meus templates de containers.</p> <h2>Entrar num container em execução</h2> <p>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.</p> <p>Na versões anteriores teria que ser feito assim:</p> <p>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:</p> <span>Dockerfile </span> <div><table><tr><td><pre><span>1</span> <span>2</span> <span>3</span> <span>4</span> <span>5</span> <span>6</span> <span>7</span> <span>8</span> <span>9</span> <span>10</span> <span>11</span> <span>12</span> <span>13</span> <span>14</span> <span>15</span> <span>16</span> <span>17</span> <span>18</span> <span>19</span> </pre></td><td><pre><code><span>FROM debian:wheezy </span><span> </span><span>MAINTAINER fike at midstorm.org </span><span> </span><span>RUN apt-get udpate <span>&amp;&amp;</span> apt-get install apache2 </span><span> </span><span>ADD mysite /var/www/ </span><span> </span><span>RUN apt-get autoremove -y <span>&amp;&amp;</span> rm -rf /tmp/* /var/tmp/* </span><span> </span><span>ENV APACHE_RUN_USER www-data </span><span> </span><span>ENV APACHE_RUN_GROUP www-data </span><span> </span><span>ENV APACHE_LOG_DIR </span><span> </span><span>VOLUMES <span>[</span><span>"/var/log/apache2"</span>, <span>"/var/www"</span><span>]</span> </span><span> </span><span>CMD <span>[</span><span>"/usr/sbin/apache2"</span>, <span>"-D"</span>, <span>"FOREGROUND"</span><span>]</span> </span></code></pre></td></tr></table></div> <h3>Criando o container</h3> <div><table><tr><td><pre><span>1</span> </pre></td><td><pre><code><span>fike@kamino:~<span>$ </span>docker build -t<span>=</span><span>"mysimplesite"</span> . </span></code></pre></td></tr></table></div> <h3>Executando</h3> <div><table><tr><td><pre><span>1</span> </pre></td><td><pre><code><span>fike@kamino:~<span>$ </span>sudo docker run -d -p 80:80 mysimplesite </span></code></pre></td></tr></table></div> <h3>Putz! Os internautas não estão conseguindo acessar meu site, ele está retornando 403.</h3> <p>Se não tiver uma versão mais recente do util-linux (> 2.27) <a href="http://jpetazzo.github.io/2014/03/23/lxc-attach-nsinit-nsenter-docker-0-9/">não poderá usar</a> o nsenter. Outra forma seria executar um segundo container e acessar os diretórios compartilhados do primeiro.</p> <div><table><tr><td><pre><span>1</span> <span>2</span> <span>3</span> </pre></td><td><pre><code><span>fike@kamino:~<span>$ CONTAINERID</span><span>=</span><span>$(</span>docker ps |grep mysimplesite|awk <span>&#39;{ print $1}&#39;</span> </span><span> </span><span>fike@kamino:~<span>$ </span>docker run -it --volumes-from<span>=</span><span>$CONTAINERID</span> /bin/bash </span></code></pre></td></tr></table></div> <p>Se estiver usando um <a href="http://www.fluentd.org/">Fluent</a> 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.</p> <p>Se o problema estiver relacionado a rede, a abordagem era parecida. Um bom exemplo, alterar uma zona DNS no Bind9 usando o <strong>rndc</strong>.</p> <div><table><tr><td><pre><span>1</span> <span>2</span> <span>3</span> </pre></td><td><pre><code><span>fike@kamino:~<span>$ CONTAINERID</span><span>=</span><span>$(</span>docker ps |grep mysimplesite|awk <span>&#39;{ print $1}&#39;</span> </span><span> </span><span>fike@kamino:~<span>$ </span>docker run -it --volumes--from<span>=</span><span>$CONTAINERID</span> --net<span>=</span><span>&#39;container:$CONTAINERID&#39;</span> mysimplesite /bin/bash </span></code></pre></td></tr></table></div> <p>No 1.3 é bem mais simples.</p> <div><table><tr><td><pre><span>1</span> <span>2</span> <span>3</span> </pre></td><td><pre><code><span>fike@kamino:~<span>$ CONTAINERID</span><span>=</span><span>$(</span>docker ps |grep mysimplesite|awk <span>&#39;{ print $1}&#39;</span> </span><span> </span><span>fike@kamino:~<span>$ </span>docker <span>exec</span> -it <span>$CONTAINERID</span> /bin/bash </span></code></pre></td></tr></table></div>



Docker 1.3

23 de Outubro de 2014, 15:02, por Software Livre Brasil - 0sem comentários ainda

<p><img src="http://www.fernandoike.com/images/solomon-keynote-penguin-authentication-300x235.png" /></p> <p>A <a href="https://blog.docker.com/2014/10/docker-1-3-signed-images-process-injection-security-options-mac-shared-directories/">versão 1.3</a> do <a href="http://www.docker.com">Docker</a> foi lançada recentemente. Eu gostei dela por duas razões.</p> <h2>Verificação da assinatura digital</h2> <p>O pessoal da DotCloud já tinha <a href="https://blog.docker.com/2014/09/docker-hub-official-repos-announcing-language-stacks/">anunciado</a> alguns repositórios oficiais de alguma ferramentas e linguagens de programação (<strong>C(++)/GCC</strong>, <strong>PHP</strong>, <strong>Go</strong>, <strong>Java</strong>, <strong>Nodejs</strong>, <strong>Python</strong>, <strong>Perl</strong>, <strong>Ruby</strong>, 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)</p> <p>Antes disso eu tinha um pouco de restrição com os repositórios de terceiros. Até então, preferia criar meus templates de containers.</p> <h2>Entrar num container em execução</h2> <p>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.</p> <p>Na versões anteriores teria que ser feito assim:</p> <p>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:</p> <span>Dockerfile </span> <div><table><tr><td><pre><span>1</span> <span>2</span> <span>3</span> <span>4</span> <span>5</span> <span>6</span> <span>7</span> <span>8</span> <span>9</span> <span>10</span> <span>11</span> <span>12</span> <span>13</span> <span>14</span> <span>15</span> <span>16</span> <span>17</span> <span>18</span> <span>19</span> </pre></td><td><pre><code><span>FROM debian:wheezy </span><span> </span><span>MAINTAINER fike at midstorm.org </span><span> </span><span>RUN apt-get udpate <span>&amp;&amp;</span> apt-get install apache2 </span><span> </span><span>ADD mysite /var/www/ </span><span> </span><span>RUN apt-get autoremove -y <span>&amp;&amp;</span> rm -rf /tmp/* /var/tmp/* </span><span> </span><span>ENV APACHE_RUN_USER www-data </span><span> </span><span>ENV APACHE_RUN_GROUP www-data </span><span> </span><span>ENV APACHE_LOG_DIR </span><span> </span><span>VOLUMES <span>[</span><span>"/var/log/apache2"</span>, <span>"/var/www"</span><span>]</span> </span><span> </span><span>CMD <span>[</span><span>"/usr/sbin/apache2"</span>, <span>"-D"</span>, <span>"FOREGROUND"</span><span>]</span> </span></code></pre></td></tr></table></div> <h3>Criando o container</h3> <div><table><tr><td><pre><span>1</span> </pre></td><td><pre><code><span>fike@kamino:~<span>$ </span>docker build -t<span>=</span><span>"mysimplesite"</span> . </span></code></pre></td></tr></table></div> <h3>Executando</h3> <div><table><tr><td><pre><span>1</span> </pre></td><td><pre><code><span>fike@kamino:~<span>$ </span>sudo docker run -d -p 80:80 mysimplesite </span></code></pre></td></tr></table></div> <h3>Putz! Os internautas não estão conseguindo acessar meu site, ele está retornando 403.</h3> <p>Se não tiver uma versão mais recente do util-linux (> 2.27) <a href="http://jpetazzo.github.io/2014/03/23/lxc-attach-nsinit-nsenter-docker-0-9/">não poderá usar</a> o nsenter. Outra forma seria executar um segundo container e acessar os diretórios compartilhados do primeiro.</p> <div><table><tr><td><pre><span>1</span> <span>2</span> <span>3</span> </pre></td><td><pre><code><span>fike@kamino:~<span>$ CONTAINERID</span><span>=</span><span>$(</span>docker ps |grep mysimplesite|awk <span>&#39;{ print $1}&#39;</span> </span><span> </span><span>fike@kamino:~<span>$ </span>docker run -it --volumes-from<span>=</span><span>$CONTAINERID</span> /bin/bash </span></code></pre></td></tr></table></div> <p>Se estiver usando um <a href="http://www.fluentd.org/">Fluent</a> 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.</p> <p>Se o problema estiver relacionado a rede, a abordagem era parecida. Um bom exemplo, alterar uma zona DNS no Bind9 usando o <strong>rndc</strong>.</p> <div><table><tr><td><pre><span>1</span> <span>2</span> <span>3</span> </pre></td><td><pre><code><span>fike@kamino:~<span>$ CONTAINERID</span><span>=</span><span>$(</span>docker ps |grep mysimplesite|awk <span>&#39;{ print $1}&#39;</span> </span><span> </span><span>fike@kamino:~<span>$ </span>docker run -it --volumes--from<span>=</span><span>$CONTAINERID</span> --net<span>=</span><span>&#39;container:$CONTAINERID&#39;</span> mysimplesite /bin/bash </span></code></pre></td></tr></table></div> <p>No 1.3 é bem mais simples.</p> <div><table><tr><td><pre><span>1</span> <span>2</span> <span>3</span> </pre></td><td><pre><code><span>fike@kamino:~<span>$ CONTAINERID</span><span>=</span><span>$(</span>docker ps |grep mysimplesite|awk <span>&#39;{ print $1}&#39;</span> </span><span> </span><span>fike@kamino:~<span>$ </span>docker <span>exec</span> -it <span>$CONTAINERID</span> /bin/bash </span></code></pre></td></tr></table></div>



docker 1 dot 3

23 de Outubro de 2014, 0:00, por Fike's Mnemonics - 0sem comentários ainda

{% img center /images/solomon-keynote-penguin-authentication-300x235.png %}

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:

{% codeblock Dockerfile lang:bash %}

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”]

{% endcodeblock %}

Criando o container

{% codeblock lang:bash %}

fike@kamino:~$ docker build -t=“mysimplesite” .

{% endcodeblock %}

Executando

{% codeblock lang:bash %}

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

{% endcodeblock %}

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.

{% codeblock lang:bash %} fike@kamino:~$ CONTAINERID=$(docker ps |grep mysimplesite|awk ‘{ print $1}’

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

{% endcodeblock %}

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.

{% codeblock lang:bash %} fike@kamino:~$ CONTAINERID=$(docker ps |grep mysimplesite|awk ‘{ print $1}’

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

{% endcodeblock %}

No 1.3 é bem mais simples.

{% codeblock lang:bash %} fike@kamino:~$ CONTAINERID=$(docker ps |grep mysimplesite|awk ‘{ print $1}’

fike@kamino:~$ docker exec -it $CONTAINERID /bin/bash {% endcodeblock %}



Eu fui: TDC 2014- Edição POA

19 de Outubro de 2014, 20:40, por Software Livre Brasil - 0sem comentários ainda

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 TDCtdc 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

19 de Setembro de 2014, 15:03, por Software Livre Brasil - 0sem comentários ainda

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

12 de Setembro de 2014, 19:55, por Software Livre Brasil - 0sem comentários ainda

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:~#

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