Prof. Me. Samuel Rodrigues
contato: samuelclerod@gmail.com
um projeto da comunidade open source; as ferramentas resultantes desse projeto; e a empresa Docker Inc, apoiadora do projeto
Docker é uma plataforma para desenvolvedores e sysdamins para desenvolver, implantar e executar aplicações com containers [linux]
Desenvolver
Implantar
Executar
São ambientes completamente isolados, com seus próprios processos, serviços e interfaces de rede, entretanto compartilhando o mesmo kernel do sistema operacional.
ambiente de execução que provê portabilidade
Sistemas Isolados
Aplicações Isolados
X
X
Cada maquina virtual tem seu próprio Sistema Operacional (Guest OS);
Isso exige muitos recursos da máquina host;
Como resultado disso:
É necessário “boot” do guest OS
Consome muitos recursos
Todos usam o kernel das máquinas host, e acima disso tudo está isolado (distribuição única);
o docker usa recursos do sistema de arquivos unix para criar ambientes isolados;
Como resultado disso:
Usa menos recursos
Pode iniciar em milisegundos
Ocupa menos espaço em disco
Usa menos memória
Percentual de aplicações containerizadas...
Percentual de aplicações containerizadas em produção
Ambiente seguro, limpo e portável
Não tem que se procupar com dependecias perdidas, pacotes e outras dores
Um comando para instalar o app
Execução de cada App em seu próprio ambiente isolado com suas próprias libs.
Pode-se reverter versões antigas dos ambientes
Automatizar teste, integração e empacotamento
Ambiente reciclável
Reduzir/eliminar preocupações sobre compatibilidade em outras plataformas
Torna o ciclo de vida inteiro mais eficiente, consistente e repetitível
Aumenta a qualidade do código produzido por desenvolvedores
Elimina inconsistências entre ambientes de teste, desenvolvimento e produção
Promove a separação de preocupações
Retorno fácil para versões funcionais (Fallback to Working)
Aumento significante da velocidade e conficabilidade para implantação e integração contínuas
Velocidade de implantação
Portabilidade
Performance
Custo
Tamanho
Menos recursos de hosts
Vamos usar essa aqui 👇
☝Vamos demonstrar essas opções
Docker Toolbox???
DEPRECATED
Para verificar a versão:
docker --version
Para ver mais informações:
docker info
Utilizando a imagem de teste do hello-world
docker run hello-world
Lista a imagem do hello-world
docker image ls
Lista o hello-world container
docker container ls --all
Se ainda estivesse executando, não seria necessário o opção --all
Problema
Solução
# Use an official Python runtime as a parent image
FROM python:2.7-slim
# Set the working directory to /app
WORKDIR /app
# Copy the current directory contents into the container at /app
COPY . /app
# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# Make port 80 available to the world outside this container
EXPOSE 80
# Define environment variable
ENV NAME World
# Run app.py when the container launches
CMD ["python", "app.py"]
Crie mais dois arquivos na pasta (são usados no Dockerfile):
Flask
Redis
from flask import Flask
from redis import Redis, RedisError
import os
import socket
# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)
app = Flask(__name__)
@app.route("/")
def hello():
try:
visits = redis.incr("counter")
except RedisError:
visits = "<i>cannot connect to Redis, counter disabled</i>"
html = "<h3>Hello {name}!</h3>" \
"<b>Hostname:</b> {hostname}<br/>" \
"<b>Visits:</b> {visits}"
return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
requirements.txt
app.py
Na pasta do projeto, no mesmo nível do Dockerfile digite:
docker build --tag=friendlyhello .
Para verificar se a imagem foi criada digite
docker image ls
Execute o app, mapeando a porta 4000 da sua máquina para a porta 80 publicada usando -p:
docker run -p 4000:80 friendlyhello
docker container ls
docker container stop <Container NAME or ID>
docker container ls
docker run -d -p 4000:80 friendlyhello
Se você não tem uma conta Docker, se registre em hub.docker.com.
docker login
A notação para associar uma imagem logal com um repositório é username/repository:tag.
A tag é opcional, mas recomendada pois é o mecanismo o qual o registro versiona as imagens no docker.
para realizarmos o registro da nossa imagens digitamos algo como :
docker tag image username/repository:tag
No meu caso:
docker tag friendlyhello samuelclerod/get-started:v1
Para listar e visualizar as tags use:
docker image ls
Para publicar uma imagem tageada usamos:
docker push username/repository:tag
No meu caso:
docker push samuelclerod/get-started:v1
E para recuperar a imagem e executar:
docker run -p 4000:80 samuelclerod/get-started:v1
Utilizando Compose, vamos configurar e executar uma aplicação Rails/PostgreSQL..
Mas antes de tudo, instale o Compose !
FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y \
build-essential libpq-dev nodejs postgresql-client
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp
Crie uma pasta e nela insira do Dockerfile descrito abaixo:
source 'https://rubygems.org'
gem 'rails', '~>5'
O Gemfile
O Gemfile.lock VAZIO
version: '3'
services:
db:
image: postgres
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- 3000:3000
depends_on:
- db
docker-compose run web rails new . --force --database=postgresql
O esqueleto abaixo irá gerar toda a estrutura da aplicação rails utilizando banco postgresql
Para usuários linux e mac é necessário repara os arquivos que foram gerados no container com root
sudo chown -R $USER:$USER .
docker-compose build
Com o Gemfile modificado, precisamos construir novamente
Por default, Rails espera um banco de dados no rodando no localhost
É necessário apontar para o container db e mudar o banco e o username com o padrão da imagem do postgresql.
Modifique o arquivo config/database.yml com codigo ao lado:
default: &default
adapter: postgresql
encoding: unicode
host: db
username: postgres
password:
pool: 5
development:
<<: *default
database: myapp_development
test:
<<: *default
database: myapp_test
Agora podemos iniciar os containers com:
docker-compose up
Crie o banco em outro terminal com:
Acesse a página inicial da aplicação em http://localhost:3000.
docker-compose run web rake db:create
Parar a aplicação
docker-compose restart
Reiniciar a aplicação
docker-compose down
Se modificar o Gemfile ou o docker-compose.yml para tentar outras configurações, é necessário reconstruir.
Nesses caso execute:
docker-compose run web bundle install
docker-compose up --build
Para mais informações, visite o documentação do docker-compose