Contêineres pra todo lado

Aviso aos navegantes!

O post contém cenas fortes de Shell Linux, Python, Node.JS e conteinerização. É considerado um post para usuários intermediários. Blz?

O que é Docker?

Docker é a mais famosa tecnologia de “conteinerização” da atualidade. Mas o que fez ela chegar nesse nível? Por que é tão utilizado? E como assim build, ship and run? Essas e outras informações você vê aqui no Globo Repórter… ( Opa, me empolguei! ) aqui no blog do Tá safo! :).

chapelin-2016-rede-globo

Contêineres não são novidade no mundo da virtualização, existem abordagens que são do início dos anos 2000 como FreeBSD jail e Linux Containers, mas elas não eram práticas e essa foi a grande vantagem da plataforma Docker.

Não vou fazer um tutorial de Docker. Já tem um post disso aqui no blog.

Por quê Docker?

Então, praticidade é a palavra chave. Com uma plataforma composta por vários serviços que cobrem (de maneira simples) etapas compreendidas desde o desenvolvimento à entrega de software, Docker ganhou o mundo.

Beleza, mas como é essa tal praticidade? Por que a gente já tem ferramentas de automatização de configuração que ajudam e muito a montar um servidor de aplicação.

Então, aqui a gente vai dar uma olhada rápida em como começar a usar Docker no ambiente de desenvolvimento e num próximo momento a gente fala sobre como colocar em produção e tals.

Testando a instalação local

Para testar a nossa instalação local do Docker executaremos:

docker run --rm hello-world

Se estiver tudo ok com a instalação, uma nova imagem será baixada do docker hub e iniciar um contêiner com base nela. A saída de texto deverá ser algo como:

Hello from Docker!
This message shows that your installation appears to be working correctly.

Usando no desenvolvimento de aplicações

A intenção dessa seção é dar alguns exemplos simples de como usar Docker para desenvolver aplicações em algumas linguagens. Usaremos imagens Docker oficiais, disponíveis no Docker Hub.

Com Python

A imagem usada aqui é a python:onbuild. Para este exemplo iremos utilizar uma aplicação simples com Flask.

Primeiro iremos baixar a imagem com docker pull:

docker pull python:onbuild

Verificando a versão do Python contida nessa imagem:

docker run --rm -ti python:onbuild python --version

A saída deverá ser algo como:

Python 3.5.2

Crie um diretório para a sua nova aplicação e entre nele:

mkdir python-app && cd python-app

Precisamos criar alguns arquivos para a nossa aplicação flask. O primeiro deles será o simpleapp.py. Segue o exemplo de uma aplicação que apenas exibe Hello world from Python & Docker! no navegador:

from flask
import Flask
import sys
import optparse
import time

app = Flask(__name__)

start = int(round(time.time()))

@app.route("/")
def hello_world():

    return "Hello world from Python & Docker!"

if __name__ == '__main__':
    parser = optparse.OptionParser(usage="python simpleapp.py -p ")
    parser.add_option('-p', '--port', action='store', dest='port',\
     help='The port to listen on.')
    (args, _) = parser.parse_args()
    if args.port == None:
        print ("Missing required argument: -p/--port")
        sys.exit(1)
    app.run(host='0.0.0.0', port=int(args.port), debug=False)

O segundo será o nosso requirements.txt:

Flask>=0.9

E por último o nosso Dockerfile:

FROM python:onbuild
EXPOSE 8000

Agora podemos criar a imagem da nossa aplicação com:

docker build -t myapp .

Esse Dockerfile é simplificado porque utilizamos a tag onbuild da imagem. Ela traz consigo uma série de instruções pré definidas.

Então vamos iniciar um contêiner a partir dessa imagem com:

docker run --name myapp-python -ti --rm -p 8000:8000 myapp
Explicando os argumentos:
  • –name: nome do contêiner que será executado;
  • -ti: conecta as entradas e saídas padrão do contêiner (stdin e stdout) com um pseudo-terminal do hospedeiro;
  • –rm: remove o contêiner quando a execução for encerrada;
  • -p: conecta a porta 8000 do hospedeiro com a porta 8000 do contêiner.

E podemos acessar a nossa aplicação em http://localhost:8000

Com Node.js

A imagem usada aqui é a node:onbuild. Para este exemplo iremos utilizar uma aplicação simples com Express.

Primeiro iremos baixar a imagem com docker pull:

docker pull node:onbuild

Verificando a versão do node contida nessa imagem:

docker run --rm -ti node:onbuild node --version

A saída deverá ser algo como:

v7.2.1

Crie um diretório para a sua nova aplicação e entre nele:

mkdir node-app && cd node-app

Precisamos criar alguns arquivos para a nossa aplicação express. O primeiro deles será o server.js. Segue o exemplo de uma aplicação que apenas exibe Hello World! no navegador:

var express = require('express')
var app = express()

app.get('/', function (req, res) {
  res.send('Hello World!')
})

app.listen(3000, function () {
  console.log('Example app listening on port 3000!')
})

O segundo será o nosso package.json:

{
    "name": "hello-docker",
    "private": true,
    "dependencies": {
        "express": "3.x"
    },
    "scripts": {
        "start": "nodejs server.js"
    }
}

E por último o nosso Dockerfile:

FROM node:onbuild
EXPOSE  3000

Agora podemos criar a imagem da nossa aplicação com:

docker build -t myapp .

Esse Dockerfile é simplificado porque utilizamos a tag onbuild da imagem de node. Ela traz consigo uma série de instruções pré definidas.

Então vamos iniciar um contêiner a partir dessa imagem com:

docker run --name myapp-node -ti --rm -p 3000:3000 myapp
Explicando os argumentos:
  • –name: nome do contêiner que será executado;
  • -ti: conecta as entradas e saídas padrão do contêiner (stdin e
    stdout) com um pseudo-terminal do hospedeiro;
  • –rm: remove o contêiner quando a execução for encerrada;
  • -p: conecta a porta 3000 do hospedeiro com a porta 3000 do
    contêiner.

E podemos acessar a nossa aplicação em http://localhost:3000

Pra onde ir agora?

Agora que vocês já estão iniciados no maravilhoso mundo do Docker, deem uma olhada nas referências que eu coloquei aqui embaixo que tem muita coisa útil.

Outros posts sobre Docker vão surgindo de acordo com a interação de vocês. Vamos criar um canal #docker no Slack do Tá Safo!, acessem lá: http://slack.tasafo.org.

Referências:

Dei uma compilada nas referências utilizadas ao decorrer do artigo e adicionei mais algumas que achei interessantes.

  1. Introdução ao Docker para o Desenvolvedor Node.js, Heitor Tashiro Sergent
  2. Express – Hello world example
  3. Docker – Onbuild tag
  4. Expressjs
  5. Docker hub
  6. Introdução ao Docker, Joseph Ramos
  7. Iniciando com o Docker: dicas práticas para começar a usar agora mesmo – André Kiffer
  8. Flask
  9. What is docker
  10. Blog da Codeship

Até a próxima!

Anúncios

O que tu achas?

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s