Docker
  • Introdução a Containeres e Docker
    • Introdução
    • O que é um container e suas vantanges
    • VM versus Container
    • Como funcionam os containers
    • Linux
    • Container sem Docker
      • cgroup
      • cpu.max
    • LxC
    • LxD
    • Containers versus Imagens
    • Arquitetura do Docker
    • Arquitetura do Docker mais a fundo
    • Projetos Open Source
  • Instalação do Docker
    • Linux
    • Windows
      • Docker Desktop
      • Rancher Desktop
      • WSL
    • Mac
    • Visual Studio Code
  • Primeiros Passos com Docker
    • Criação e listagem básica de um container
    • Interagindo com o container
    • Executando containers continuamente
      • nginx
      • docker container run
      • docker container run nginx
      • docker container run -d nginx
      • docker container exec
    • Como usar publish de porta
      • docker container stop
      • docker container start
      • docker container rm
      • docker container rm -f $(docker container ls -qa)
    • Containers e variáveis de ambiente
      • docker container run -e
  • Desafio
    • Desafio 01 - Banco de Dados Postgresql
    • Desafio 02 - Banco de Dados MySQL
    • Desafio 03 - Banco de Dados MongoDB
  • Executando a sua primeira aplicação em containers
    • Introdução
    • Preparando o container para a aplicação
    • Executando a aplicação
      • docker container cp
  • Primeiros Passos com Docker Images
    • Introdução
    • OverlayFS na Prática
    • Copy-on-Write
    • Formas de criar uma imagem Docker
    • Como funciona o Docker Commit
    • Docker Commit na Prática
      • docker commit
    • Entendendo melhor a sua imagem
      • docker image history
      • docker image inspect
    • Entrando mais a fundo na imagem
    • Como usar a imagem Docker no modo raiz
  • Avançando em imagens Docker com Dockerfile
    • O que é Dockerfile
    • Primeira Imagem com Dockerfile
      • docker image build
    • Como funciona a construção com Dockerfile
    • Possibilidades com Dockerfile
    • FROM
    • RUN
    • WORKDIR
    • COPY
    • ADD
    • LABEL
    • ENV
    • VOLUME
    • ARG
    • EXPOSE
    • USER
    • ENTRYPOINT
    • CMD
    • ENTRYPOINT versus CMD
    • Principais comandos com imagem
    • Imagem da aplicação com Dockerfile
    • Comparando Docker Commit com Dockerfile
  • Docker Registry
    • Introdução
    • Docker Hub
    • Sua imagem com o nome certo
    • Renomear imagens com Docker Tag
      • docker image tag
    • Enviando a sua primeira imagem para o Docker Hub
      • docker image push
      • docker image pull
  • Algumas boas práticas para construção de imagem
    • Um processo por container
    • Usar imagens confiáveis
    • Otimizar sempre a sua imagem
    • Uso inteligente das camadas
    • Dockerignore
  • Multistage Build
    • Introdução
    • Multistage build na prática
    • Target para fazer o build
      • docker image build --target
    • Imagem externa no Multistage build
    • Usar um estágio de build como base
  • Docker Volume
    • Introdução
      • docker volume
    • Bind Mount
    • Particularidades do Bind Mount
    • Bind Mount no Windows
    • Exemplo com Bind Mount
    • Docker Volume
      • docker volume create
      • docker volume inspect
      • docker volume ls
      • docker volume prune
      • docker volume rm
    • Onde ficam os arquivos do Docker volume?
    • Usando o volume no Dockerfile
    • Como fazer backup de um Docker Volume
    • Exemplo com Docker Volume
    • Storage tmpfs
    • Como criar algo funcional com o que aprendemos
  • Network
    • Introdução
    • Componentes do Docker Network
    • Rede Bridge na prática
      • docker network
      • docker network create
      • docker network inspect
      • docker network ls
      • docker network prune
      • docker network rm
    • Criando a sua rede bridge
      • docker network connect
      • docker network disconnect
    • Como funciona a rede bridge por dentro
    • Rede Host na prática
    • Rede none da prática
    • Como adicionar domínios no seu container
  • Aplicação 100% no Docker
    • Introdução
    • Criação da Imagem e Envio para o Docker Hub
    • Criação do Docker Network
    • Container do PostgreSQL
    • Container da Aplicação Web
    • Atualização da aplicação
  • Docker Compose
    • Introdução
      • docker compose
    • A evolução do docker compose
    • Criação básica de um Docker Compose
      • docker compose attach
      • docker compose build
      • docker compose config
      • docker compose cp
      • docker compose create
      • docker compose down
      • docker compose events
      • docker compose exec
      • docker compose images
      • docker compose kill
      • docker compose logs
      • docker compose ls
      • docker compose pause
      • docker compose port
      • docker compose ps
      • docker compose pull
      • docker compose push
      • docker compose restart
      • docker compose rm
      • docker compose run
      • docker compose scale
      • docker compose start
      • docker compose stats
      • docker compose stop
      • docker compose top
      • docker compose unpause
      • docker compose up
      • docker compose version
      • docker compose wait
      • docker compose watch
    • Variáveis de Ambiente
    • Volume Bind Mount
    • Docker Volume
    • Docker Network - Bridge
    • Docker Network - Host Driver e Add Host
    • Ordenando a execução dos containers
    • Compose com build de imagem
    • Como Parametrizar o Compose com Variáveis de Ambiente
    • Múltiplos Composes
    • Extends
    • Merge
    • Include
    • Profiles
    • Comandos importantes do Docker Compose
  • Troubleshooting
    • Introdução
    • Docker Info
    • Docker Events
    • Docker Logs
    • Docker Inspect
    • Docker Top
    • Docker Stats
    • Docker Exec
  • Resiliência e Gerenciamento de Recursos
    • Introdução
    • Docker Restart
      • Introdução
      • on-failure
      • unless-stopped
      • always
      • Docker Compose
    • Healthcheck
      • Introdução
      • Linha de Comando
      • Docker Compose
      • Direto na Imagem
    • Gerenciamento de Recurso
      • CPU
        • Como Gerenciar CPU
        • Prática
      • Memória
        • Como Gerenciar Memória
        • Prática
      • Docker Compose
  • Fazendo um ambiente mais seguro
    • Introdução
    • Docker Scout
      • Introdução
      • Verificação Simples de Imagem
      • Como adicionar um repositório
      • Primeira melhoria na imagem
  • BUSCA RÁPIDA
    • Referências
    • Comandos
      • docker commit
      • docker compose
      • docker container
      • docker image
      • docker network
      • docker volume
    • Dockerfile
Powered by GitBook
On this page
  • Extensão de arquivos
  • Sobrescrever a imagem
  1. Docker Compose

Extends

Reutilização de Configurações de Serviços

Extensão de arquivos

Segregação do arquivo compose.yaml conforme abaixo.

Criação do arquivo kubenews.compose.yaml para as especificações do container kubenews existentes no arquivo compose.yaml:

~/devops-kube-news$ touch kubenews.compose.yaml
~/devops-kube-news$ vim kubenews.compose.yaml
services:
   kubenews:
    image: marcelodpbarbieri/kube-news:${KUBENEWS_TAG:-latest}
    build:
      context: ./src
      dockerfile: Dockerfile
    ports:
      - 8080:8080
    depends_on:
      - postgre
    environment:
      DB_DATABASE: ${POSTGRES_DB}
      DB_USERNAME: ${POSTGRES_USER}
      DB_PASSWORD: ${POSTGRES_PASSWORD}
      DB_HOST: postgre
    networks:
      - kubenews-net

No arquivo base faz-se necessário informar o arquivo de extensão o serviço:

services:
  postgre:
    image: postgres:${POSTGRES_TAG}
    ports:
      - 5432:5432
    environment:
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_DB: ${POSTGRES_DB}
    volumes:
      - postgre-docker-vol:/var/lib/postgresql/data
    networks:
      - kubenews-net

  web:
    extends:
      file: ./kubenews.compose.yaml
      service: kubenews

volumes:
  postgre-docker-vol:

networks:
  kubenews-net:
    driver: bridge

Neste caso o serviço foi chamado de web, não precisando necessariamente ser este nome. O importante é a especificação da extensão:

web:
    extends:
      file: ./kubenews.compose.yaml
      service: kubenews

Verificar as configurações para visualizar que as especificações do serviço kubenews foram incluídas no serviço web:

~/devops-kube-news$ docker compose config
name: devops-kube-news
services:
  postgre:
    environment:
      POSTGRES_DB: kubenews
      POSTGRES_PASSWORD: kubenews
      POSTGRES_USER: kubenews
    image: postgres:12.17
    networks:
      kubenews-net: null
    ports:
      - mode: ingress
        target: 5432
        published: "5432"
        protocol: tcp
    volumes:
      - type: volume
        source: postgre-docker-vol
        target: /var/lib/postgresql/data
        volume: {}
  web:
    build:
      context: /home/marcelo/devops-kube-news/src
      dockerfile: Dockerfile
    depends_on:
      postgre:
        condition: service_started
        required: true
    environment:
      DB_DATABASE: kubenews
      DB_HOST: postgre
      DB_PASSWORD: kubenews
      DB_USERNAME: kubenews
    image: marcelodpbarbieri/kube-news:latest
    networks:
      kubenews-net: null
    ports:
      - mode: ingress
        target: 8080
        published: "8080"
        protocol: tcp
networks:
  kubenews-net:
    name: devops-kube-news_kubenews-net
    driver: bridge
volumes:
  postgre-docker-vol:
    name: devops-kube-news_postgre-docker-vol

Sobrescrever a imagem

A imagem utilizada pelo kubenews pode ser sobrescrita na extensão.

Por exemplo, o arquivo .env define a tag v1 para a imagem:

~/devops-kube-news$ cat .env
POSTGRES_TAG=13.16
POSTGRES_PASSWORD=kubenews
POSTGRES_USER=kubenews
POSTGRES_DB=kubenews
KUBENEWS_TAG=v1

Porém o arquivo compose.yaml pode estender a utilização da v2, por exemplo:

Foi alterada a tag do Postgres para 13.16 pois foi a versão da sua criação que está sendo gerenciado pelo Docker Volume.

Com isso é evitado o erro:

PostgreSQL Database directory appears to contain a database; 
Skipping initialization

2024-09-07 14:39:31.395 UTC [1] FATAL:  database files are incompatible 
with server
2024-09-07 14:39:31.395 UTC [1] DETAIL:  The data directory was initialized 
by PostgreSQL version 13, which is not compatible with this version 12.17 
(Debian 12.17-1.pgdg120+1).
services:
  postgre:
    image: postgres:${POSTGRES_TAG}
    ports:
      - 5432:5432
    environment:
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_DB: ${POSTGRES_DB}
    volumes:
      - postgre-docker-vol:/var/lib/postgresql/data
    networks:
      - kubenews-net

  web:
    extends:
      file: ./kubenews.compose.yaml
      service: kubenews
    image: marcelodpbarbieri/kube-news:v2

volumes:
  postgre-docker-vol:

networks:
  kubenews-net:
    driver: bridge

Destaque para:

  web:
    extends:
      file: ./kubenews.compose.yaml
      service: kubenews
    image: marcelodpbarbieri/kube-news:v2

Verificar as configurações:

~/devops-kube-news$ docker compose config
name: devops-kube-news
services:
  postgre:
    environment:
      POSTGRES_DB: kubenews
      POSTGRES_PASSWORD: kubenews
      POSTGRES_USER: kubenews
    image: postgres:12.17
    networks:
      kubenews-net: null
    ports:
      - mode: ingress
        target: 5432
        published: "5432"
        protocol: tcp
    volumes:
      - type: volume
        source: postgre-docker-vol
        target: /var/lib/postgresql/data
        volume: {}
  web:
    build:
      context: /home/marcelo/devops-kube-news/src
      dockerfile: Dockerfile
    depends_on:
      postgre:
        condition: service_started
        required: true
    environment:
      DB_DATABASE: kubenews
      DB_HOST: postgre
      DB_PASSWORD: kubenews
      DB_USERNAME: kubenews
    image: marcelodpbarbieri/kube-news:v2
    networks:
      kubenews-net: null
    ports:
      - mode: ingress
        target: 8080
        published: "8080"
        protocol: tcp
networks:
  kubenews-net:
    name: devops-kube-news_kubenews-net
    driver: bridge
volumes:
  postgre-docker-vol:
    name: devops-kube-news_postgre-docker-vol

Destaque para:

    image: marcelodpbarbieri/kube-news:v2

Subir o Docker Compose com a instrução --build:

~/devops-kube-news$ docker compose up -d --build
[+] Building 2.0s (12/12) FINISHED                                 docker:default
 => [web internal] load build definition from Dockerfile                     0.0s
 => => transferring dockerfile: 163B                                         0.0s
 => [web internal] load metadata for docker.io/library/node:20.10.0-alpine3  1.8s
 => [web auth] library/node:pull token for registry-1.docker.io              0.0s
 => [web internal] load .dockerignore                                        0.0s
 => => transferring context: 2B                                              0.0s
 => [web 1/5] FROM docker.io/library/node:20.10.0-alpine3.18@sha256:32427bc  0.0s
 => [web internal] load build context                                        0.0s
 => => transferring context: 830B                                            0.0s
 => CACHED [web 2/5] WORKDIR /app                                            0.0s
 => CACHED [web 3/5] COPY package*.json .                                    0.0s
 => CACHED [web 4/5] RUN npm install                                         0.0s
 => CACHED [web 5/5] COPY . .                                                0.0s
 => [web] exporting to image                                                 0.0s
 => => exporting layers                                                      0.0s
 => => writing image sha256:7bc35a3c7cc6ed669aec618531dbeefa43ee985b859bf16  0.0s
 => => naming to docker.io/marcelodpbarbieri/kube-news:v2                    0.0s
 => [web] resolving provenance for metadata file                             0.0s
WARN[0002] Found orphan containers ([devops-kube-news-kubenews-1]) for this project. 
If you removed or renamed this service in your compose file, 
you can run this command with the --remove-orphans flag to clean it up. 
[+] Running 2/2
 ✔ Container devops-kube-news-postgre-1  Started                             0.5s
 ✔ Container devops-kube-news-web-1      Started                             1.0s

Foi realizada a exportação da imagem kube-new com a tag v2:

 => [web] exporting to image                                                 0.0s
 => => exporting layers                                                      0.0s
 => => writing image sha256:7bc35a3c7cc6ed669aec618531dbeefa43ee985b859bf16  0.0s
 => => naming to docker.io/marcelodpbarbieri/kube-news:v2                    0.0s

A alteração do serviço kubenews para web gerou um container órfão:

WARN[0002] Found orphan containers ([devops-kube-news-kubenews-1]) for this project. 
If you removed or renamed this service in your compose file, 
you can run this command with the --remove-orphans flag to clean it up. 
~/devops-kube-news$ docker container ls -a
CONTAINER ID   IMAGE                            COMMAND                  CREATED             STATUS                         PORTS     NAMES
c06e8e4b5bc3   marcelodpbarbieri/kube-news:v2   "docker-entrypoint.s…"   2 minutes ago       Exited (1) 2 minutes ago                 devops-kube-news-web-1

Para resolver isso deve-se inserir a instrução --remove-orphans ao subir o Docker Compose:

~/devops-kube-news$ docker compose up -d --build --remove-orp
hans
[+] Building 1.3s (11/11) FINISHED                                 docker:default
 => [web internal] load build definition from Dockerfile                     0.0s
 => => transferring dockerfile: 163B                                         0.0s
 => [web internal] load metadata for docker.io/library/node:20.10.0-alpine3  1.1s
 => [web internal] load .dockerignore                                        0.0s
 => => transferring context: 2B                                              0.0s
 => [web 1/5] FROM docker.io/library/node:20.10.0-alpine3.18@sha256:32427bc  0.0s
 => [web internal] load build context                                        0.0s
 => => transferring context: 830B                                            0.0s
 => CACHED [web 2/5] WORKDIR /app                                            0.0s
 => CACHED [web 3/5] COPY package*.json .                                    0.0s
 => CACHED [web 4/5] RUN npm install                                         0.0s
 => CACHED [web 5/5] COPY . .                                                0.0s
 => [web] exporting to image                                                 0.0s
 => => exporting layers                                                      0.0s
 => => writing image sha256:7bc35a3c7cc6ed669aec618531dbeefa43ee985b859bf16  0.0s
 => => naming to docker.io/marcelodpbarbieri/kube-news:v2                    0.0s
 => [web] resolving provenance for metadata file                             0.0s
[+] Running 3/3
 ✔ Container devops-kube-news-kubenews-1  Removed                            0.0s
 ✔ Container devops-kube-news-postgre-1   Started                            0.3s
 ✔ Container devops-kube-news-web-1       Started                            0.9s
 
~/devops-kube-news$ docker container ls -a
CONTAINER ID   IMAGE                            COMMAND                  CREATED             STATUS                              PORTS     NAMES
PreviousMúltiplos ComposesNextMerge

Last updated 8 months ago