Docker 4 engineers

jeffquesadojeffque

uma conversa sobre baleias

No começo

  • existia a máquina
  • compilava local
  • instalava

Confiável?

Faz-me rir

Rise of distros

  • apt-get install xpto zyx
  • dependente de distro
  • "funciona na minha máquina"

Instalando tudo

  • java
  • redis
  • postgres
  • extensões nativas

Dependências

  • daemons
    • postgres
    • redis
    • sidekiq
  • execs
    • cronjobs
    • onetime/perdidas
  • libs
    • adicionam poder a execs/daemons
    • plugins

Usando docker

smoke test

docker run hello-world

Alternativa ao docker desktop: rancher desktop

Por que alternativa?

screenshot dos preços do docker desktop

Grátis para uso PESSOAL

Por que docker?

  • na real: container
  • docker: container feito com sucesso
  • container: alegria de usar deps

Por que container?

VM

  • VM é mais pesado
  • disco, memória, processamento
  • outro SO levantado

Por que container?

Container

  • mantém a kernel (não é outro SO INTEIRINHO)
  • leve para levantar
  • roda como processo
  • CLI fofa =3

Brincando de docker

Bora testar mudar o banco?

  • autal: app X, postgres 14.5-alpine
  • desejo: app X, postgres 15
  • app X: rodando local, eg IDE
  • testar em paralelo?

1º terminal

docker run -e 'POSTGRES_PASSWORD=my-secret-pw' --rm \
  -p 5430:5432 postgres:15

2º terminal

docker run -e 'POSTGRES_PASSWORD=my-secret-pw' --rm \
  -p 5432:5432 postgres:14-alpine
conexão com sucesso porta 5432conexão com sucesso porta 5430
  • subir instância do app X, apontando localhost:5432
  • subir instância do app X, apontando localhost:5430
  • testar em paralelo e ser feliz 😁

Explicando o comando

  • criou uma instância nova
docker run ... postgres:15
  • passou uma variável de ambiente
-e 'POSTGRES_PASSWORD=my-secret-pw'

Explicando o comando

  • mapeou porta
-p 5430:5432
  • antes do : => porta da máquina
  • depois do : => porta do programa

    • o postgres acha que está escutando a 5432

Ciclo de vida?

docker run ...        # inicia um novo container
docker run --rm ...   # igual mas se auto remove
docker start ...      # acorda um container parado
docker stop ...       # para um container
docker create ...     # cria um novo container parado
docker remove ...     # remove o container

Precisa inspecionar algo dentro do container?

docker exec -it <container> <comando> [args do comando...]
  • Por que o postgres rodou em primeiro plano?

    • Porque não era um daemon
docker run -d ...

Como fazer o container "persistir"?

  • compartilha uma pasta
docker run -v <dir-na-minha-máquina>:<dir-no-docker>
  • precisa ser caminho absoluto

Posso testar uma aplicação?

YEP!!!

  • Lembra do banco?
  • Muda para imagem da sua app!
  • Easy peasy lemon squeezy

Como subir um ambiente?

  • bash hell? 🤪
  • docker compose!!

O que é docker compose?

  • descrição de um ambiente
  • serviços + apps
  • exemplo: server + maria db + ngingx

Compose

services:
backend:
build:
context: backend
target: builder
secrets:
- db-password
depends_on:
db:
condition: service_healthy
db:
image: mariadb:10-focal
command: '--default-authentication-plugin=mysql_native_password'
restart: always
healthcheck:
test: ['CMD-SHELL',
'mysqladmin ping -h 127.0.0.1 \
--password="$$(cat /run/secrets/db-password)" --silent'
]
interval: 3s
retries: 5
start_period: 30s
secrets:
- db-password
volumes:
- db-data:/var/lib/mysql
environment:
- MYSQL_DATABASE=example
- MYSQL_ROOT_PASSWORD_FILE=/run/secrets/db-password
expose:
- 3306
proxy:
image: nginx
volumes:
- type: bind
source: ./proxy/nginx.conf
target: /etc/nginx/conf.d/default.conf
read_only: true
ports:
- 80:80
depends_on:
- backend
volumes:
db-data:
secrets:
db-password:
file: db/password.txt
# copied from:
# https://github.com/docker/awesome-compose/blob/master/nginx-golang-mysql/compose.yaml

construindo app

obrigado

blog

computaria