Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Docker, na minha máquina funciona... e no servi...

Docker, na minha máquina funciona... e no servidor também!

Uma base sobre Docker, da instalação a publicação de uma imagem e composição.

Avatar for Marcelo Toledo

Marcelo Toledo

July 04, 2020

Other Decks in Programming

Transcript

  1. Overview • Conhecimentos básicos • Instalação • Algumas dificuldades •

    Algumas vantagens • Origem dos containers • Definindo a imagem base • Montando sua própria imagem • Dockerfile • Publicando uma imagem • Compondo
  2. Conhecimentos Básicos O que é? -> compartilha recursos do SO

    (kernel) e isola as dependências (libs e configurações) em pacotes (containers) Containers -> Um pacote portátil PaaS -> (Software, Infrastructure, Platform) as a Service
  3. Instalação sudo pacman -Syu docker docker-compose # instalação dos pacotes

    sudo groupadd docker # cria um novo grupo p rodar sem sudo sudo usermod -aG docker $USER # adiciona seu usuário systemctl start docker.service # inicia o serviço docker systemctl enable docker.service # habilita o serviço na inicialização do sistema -> Logout e Login
  4. Algumas vantagens Leve e limpo Seguro Portátil Escalável Fácil de

    executar Evidencia as dependências Não depende de + instalações Na minha máquina funciona Menos surpresas no deploy “Funciona” em todos os SO
  5. Origem dos containers Containers são gerados a partir de imagens

    Origem das imagens: • Local: Dockerfile • Repositório remoto: Docker Hub
  6. Definindo a imagem base Dependências da sua aplicação • Saber

    o que você vai precisar ajuda • Escolher a distribuição (!) Tipo da aplicação • API-only (Back End) • Front End • Back + Front
  7. Definindo a imagem base Debian -> muito utilizado pela estabilidade

    (média entre 350 a 500mb) CODENAME VERSION RELEASE EOL BOOKWORM 12 - - BULLSEYE 11 - - BUSTER 10 2019/07/06 ~ 2022 STRETCH 9 2017/06/17 2020/07/06 JESSIE 8 2015/04/25 2018/06/17 WHEEZY 7 2013/05/04 2016/04/25 SQUEEZE 6.0 2011/02/06 2014/05/31
  8. Definindo a imagem base Alpine -> Small - Simple -

    Secure (média entre 100 a 200mb) Atenção para versões das bibliotecas e outros recursos como: Kernel, GCC, GO, Python, Perl, Rust, Ruby, Git, etc VERSION RELEASE KERNEL GCC RUBY NODEJS GO v3.12.0 2020/05/22 5.4.43 9.3.0 2.7.1.r3 12.17.0.r0 1.13.11 v3.11.0 2019/12/06 5.4.5 9.2.0 2.6.6 12.15.0.r1 1.13.4 v3.10.0 2019/05/31 4.19.53 8.3.0 2.5.8 10.19.0 1.12.6 v3.9.0 2018/11/05 - 8.3.0 2.5.8 10.19.0 1.11.5.r0
  9. Montando sua própria imagem - Dockerfile - Build da imagem

    - Acessar o container - Commit da imagem - Docker Hub (!) - Push da imagem Como verificar no repositório? Como usar em um projeto?
  10. Dockerfile # Dockerfile FROM ruby:2.7.1-alpine3.12 LABEL name=”Alpine3-Ruby2.7-Nodejs” \ version=”1.0” \

    author=”Marcelo Toledo” RUN apk add --update --no-cache \ build-base \ cmake \ nodejs EXPOSE 3000 CMD [“bundle”, “exec”, “rails”, “server”, “-b”, “0.0.0.0”]
  11. Image build Acessar o local onde está o Dockerfile e

    executar o comando: docker build -t <user/repositorio:tag destino_local> ╭─marcelo@inspiron ~/workspace/dockerfiles/alpine3-ruby2.7-node-yarn‹master› ╰─➤ docker build -t skygvinn/alpine3-ruby2.7-nodejs:v1.1 .
  12. Container access Após construir a imagem, acessar a mesma para

    que seja gerado o novo conteiner: docker run -it <user/repositorio:tag comando_shell> ╭─marcelo@inspiron ~/workspace/dockerfiles/alpine3-ruby2.7-node-yarn‹master› ╰─➤ docker run -it skygvinn/alpine3-ruby2.7-nodejs:v1.1 bash
  13. Image commit Após gerar o conteiner podemos fazer o commit,

    que será o snapshot desse conteúdo que geramos com o comando: docker commit -a “author” -m “msg” container_id <user/repositorio:tag> ╭─marcelo@inspiron ~/workspace/dockerfiles/alpine3-ruby2.7-node-yarn‹master› ╰─➤ docker commit -a ‘Marcelo Toledo - Skygvinn - < [email protected]>’ -m ‘Mensagem’ 33c34108e934 skygvinn/alpine3-ruby2.7-nodejs:v1.1 Como descobrir o ID do contêiner? ╭─marcelo@inspiron ~/workspace/dockerfiles/alpine3-ruby2.7-node-yarn‹master› ╰─➤ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6536b9014c9e skygvinn/ruby2.7:v1.1 "rails s" 7 days Up 7 days 3000/tcp deals
  14. Docker Hub Criar uma conta em https://hub.docker.com Como verificar no

    repositório? - https://hub.docker.com/repositories Como usar em um projeto? - FROM skygvinn/alpine3-ruby2.7-nodejs:v1.1
  15. Image push Após o commit, basta enviar para o repositório

    com o comando: docker push <user/repositorio:tag> ╭─marcelo@inspiron ~/workspace/dockerfiles/alpine3-ruby2.7-node-yarn‹master› ╰─➤ docker push skygvinn/alpine3-ruby2.7-nodejs:v1.1
  16. Compondo Se imagine agora criando vários contêineres para rodar diversas

    aplicações, ou uma aplicação com várias dependências...
  17. Compondo Docker Compose, uma das vantagens de usar Docker: -

    Composição Definir as dependências necessárias para a aplicação, por exemplo: - Postgres (DB) - Redis - Elastic Search - Sidekiq
  18. docker-compose.yml version: '3.8' services: db: image: postgres environment: POSTGRES_PASSWORD: postgres

    server: image: skygvinn/alpine3-ruby2.7-nodejs:v1.0 container_name: my_app ports: - "3000:3000" environment: - BUNDLE_PATH=vendor/bundle volumes: - .:/var/www/my_app:Z working_dir: /var/www/my_app command: bundle exec rails s -b 0.0.0.0 depends_on: - db
  19. Extra Docker: alguns comandos úteis: $ docker run # sobe

    um contêiner a partir de uma imagem (-d -it -e -v -p) $ docker exec # roda num contêiner em (-it) $ docker exec -it <id> bash # executa comando no shell $ docker ps # exibe contêiners locais (-a) $ docker rm # remove um contêiner $ docker run -d -p 80 nginx $ docker stop # para um contêiner em execução $ docker kill # mata um contêiner em execução abruptamente $ docker inspect # exibe informações sobre um contêiner ou imagem
  20. Docker Compose: alguns comandos úteis: $ docker-compose up # sobe

    a aplicação completa $ docker-compose up db elasticsearch redis # sobe apenas as dependências $ docker-compose ps -a # exibe contêiners executando $ docker-compose down # derruba os contêiners $ docker-compose run --rm server rails db:create db:setup # prepara o banco de dados e quando terminar sai do contêiner Extra
  21. Extra Dica: crie scripts para automatizar tarefas como: • script/setup

    # prepara tudo para execução local da aplicação • script/reset # limpa e recria tudo novamente • script/server # sobe o rails server • script/console # entra no rails console • script/bash # entra no shell do contêiner • script/testes # executa os testes com rspec