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:

[code language=\\\”bash\\\” light=\\\”true\\\”]
docker run –rm hello-world
[/code]

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:

[code language=\\\”bash\\\” light=\\\”true\\\”]
Hello from Docker!
This message shows that your installation appears to be working correctly.
[/code]

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:

[code language=\\\”bash\\\” light=\\\”true\\\”]
docker pull python:onbuild
[/code]

Verificando a versão do Python contida nessa imagem:

[code language=\\\”bash\\\” light=\\\”true\\\”]
docker run –rm -ti python:onbuild python –version
[/code]

A saída deverá ser algo como:

[code language=\\\”bash\\\” light=\\\”true\\\”]
Python 3.5.2
[/code]

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

[code language=\\\”bash\\\” light=\\\”true\\\”]
mkdir python-app && cd python-app
[/code]

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:

[code language=\\\”python\\\” title=\\\”simpleapp.py\\\”]
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)
[/code]

O segundo será o nosso requirements.txt:

[code language=\\\”bash\\\” light=\\\”true\\\”]
Flask>=0.9
[/code]

E por último o nosso Dockerfile:

[code language=\\\”bash\\\” light=\\\”true\\\”]
FROM python:onbuild
EXPOSE 8000
[/code]

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

[code language=\\\”bash\\\” light=\\\”true\\\”]
docker build -t myapp .
[/code]

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:

[code language=\\\”bash\\\” light=\\\”true\\\”]
docker run –name myapp-python -ti –rm -p 8000:8000 myapp
[/code]

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:

[code language=\\\”bash\\\” light=\\\”true\\\”]
docker pull node:onbuild
[/code]

Verificando a versão do node contida nessa imagem:

[code language=\\\”bash\\\” light=\\\”true\\\”]
docker run –rm -ti node:onbuild node –version
[/code]

A saída deverá ser algo como:

[code language=\\\”bash\\\” light=\\\”true\\\”]
v7.2.1
[/code]

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

[code language=\\\”bash\\\” light=\\\”true\\\”]
mkdir node-app && cd node-app
[/code]

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:

[code language=\\\”javascript\\\” title=\\\”server.js\\\”]
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!\\\’)
})
[/code]

O segundo será o nosso package.json:

[code language=\\\”javascript\\\” title=\\\”package.json\\\”]
{
"name": "hello-docker",
"private": true,
"dependencies": {
"express": "3.x"
},
"scripts": {
"start": "nodejs server.js"
}
}
[/code]

E por último o nosso Dockerfile:

[code language=\\\”bash\\\” light=\\\”true\\\”]
FROM node:onbuild
EXPOSE 3000
[/code]

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

[code language=\\\”bash\\\” light=\\\”true\\\”]
docker build -t myapp .
[/code]

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:

[code language=\\\”bash\\\” light=\\\”true\\\”]
docker run –name myapp-node -ti –rm -p 3000:3000 myapp
[/code]

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!


Comentários

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *