Containers (Docker)
Containers (Docker)
Felipe Mathias e
Raphael Lacerda
MP-SE (Analista do Ministério Público -
Tecnologia da Informação -
Infraestrutura) Desenvolvimento de
Autor:
Software - 2025 (Pós-Edital)
Felipe Mathias
20 de Setembro de 2025
Índice
1) Apresentação - Felipe Mathias
..............................................................................................................................................................................................3
2) Apresentação Flashcards
..............................................................................................................................................................................................4
3) Contêineres - Teoria
..............................................................................................................................................................................................6
4) Docker - Teoria
..............................................................................................................................................................................................
13
7) Kubernetes - Teoria
..............................................................................................................................................................................................
77
2 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
APRESENTAÇÃO DA AULA
Olá, alunos! Bem-vindos a mais uma aula do curso de Tecnologia
de Informação para concursos públicos, no Estratégia Concursos.
Minha aventura no mundo do ensino surgiu de uma vontade interna de atuar como professor –
sempre amei explicar as coisas, além de ter certa facilidade em expressar conceitos mais complexos
para pessoas que talvez não tenham tanta experiência na área.
Meu objetivo aqui é digerir assuntos, desde os mais simples aos mais complexos, para que qualquer
aluno consiga os entender, seja um programador, operador de infraestrutura, ou simplesmente um
leigo que resolveu adentrar no mundo dos concursos e se deparou com TI no seu edital.
Gostaria de pedir que sempre vejam as questões comentadas durante a aula. Elas trazem conteúdo
essencial para o aprendizado, muitas vezes abordando alguns pontos que não foram abordados no
conteúdo e são essenciais para a resolução de questões.
Caso tenha alguma dúvida, não tenha receio de entrar em contato comigo nas minhas redes sociais
(especialmente no meu Instagram, que deixarei abaixo), ou no fórum de dúvidas que os responderei
assim que possível.
Ah, posto bastante coisa interessante de TI direcionada para concursos lá, dá uma olhadinha que
algumas coisas podem te interessar. Volta e meio acerto alguma questão de prova por lá ;)
3 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
ESTRATÉGIA FLASHCARDS
Você tem dificuldade de estudar, memorizar e revisar os conteúdos que estuda em nossas
aulas? Então nós temos a ferramenta perfeita para você!
Apresentamos o Estratégia Cards: app de flashcards que vai revolucionar sua forma de
estudar e revisar conteúdos de provas de concurso público. Com nossa tecnologia inovadora e
interface amigável, você dominará os tópicos mais complexos de maneira eficiente e divertida.
Curadoria de Flashcards criados e revisados por professores especializados em cada área, com
Flashcards qualidade e voltados para concursos públicos.
Flashcards Crie seus próprios flashcards, cobrindo os principais tópicos e matérias dos
Personalizados concursos públicos.
Repetição Técnica de aprendizagem que envolve revisar informações em intervalos
Espaçada crescentes para melhorar a retenção de longo prazo e combater o esquecimento.
Estatísticas Visualize graficamente o percentual de acertos, erros ou dúvidas dos decks
Personalizadas estudados.
Modo Estude em qualquer lugar, mesmo sem conexão à internet, fazendo o download
Offline dos decks.
Estudo Está dirigindo ou fazendo esteira e quer continuar estudando? Basta utilizar a
por Áudio opção “Escutar”.
Decks Você pode escolher decks específicos como favoritos e visualizá-los em uma aba
Favoritos separada do app.
Opções Você poderá estudar todos os cards de um deck; ou apenas os que você errou; ou
de Estudo apenas os que você não estudou ainda; entre outras opções.
4 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
E para acessar?
Para acessar, basta ter uma conta no Estratégia Concursos. Em seguida, utilize suas credenciais
de login e senha para acessar o aplicativo. Por fim, acessa a carreira de Tecnologia da Informação.
==284e2d==
5 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
CONTÊINERES
Conceitos Gerais
Um contêiner é, basicamente, uma imagem que encapsula todo o código, as dependências,
bibliotecas e requisitos de uma aplicação, para que possamos rodar e replicar nossa aplicação
rapidamente e com segurança.
Com essa abordagem, temos extrema facilidade de movimentar a aplicação entre ambientes
internos (desenvolvimento, teste, produção etc.), entre servidores externos, escalabilidade,
adaptabilidade, entre outros. Para essa compatibilidade, os contêineres oferecem uma forma de
virtualização de sistema operacional, que conta com seu Kernel embutido, carregando
propriedades como os namespaces e cgroups em Linux, ou os silos em Windows.
Inicialmente, os contêineres surgiram como uma ferramenta no Linux, os Linux Containers (LNX),
reunindo o conjunto de arquivos necessários para rodar determinado processo, de forma isolada.
Com isso, conseguimos rodar esses processos de forma autônoma e completa, isolados um do
outro – quase como uma virtualização.
Acontece que o LNX é planejado para rodar apenas em sistemas operacionais Linux e, com o
tempo, a demanda por soluções mais completas exigiu uma mudança de abordagem. Nesse
contexto que surge o Docker, o principal criador de contêineres atuais. O seu processo consiste
em duas etapas – a criação da imagem, que é o arquivo-base para a criação de contêineres, e os
contêineres em si, que são as imagens sendo rodadas em tempo de execução. É como se as
6 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
imagens fossem o arquivo PDF dessa aula, alocado na sua memória, e os contêineres a aula aberta,
permitindo que você possa ler.
7 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Contêiner vs Virtualização
Não, meu caro aluno! Bom, eles são bem próximos – diria até que são irmãos, mas existem algumas
diferenças basilares entre contêineres e virtualização que os tornam bem diferentes. Quando
pensamos em virtualização, estamos pensando nas máquinas virtuais, a criação de todo um
ambiente único, que envolve literalmente um computador virtual. Sistema operacional,
bibliotecas, disco rígido virtual, entre outros. Tudo isso orquestrado por um hypervisor,
independentemente do tipo.
8 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Aqui, não temos o uso de hypervisors, já que os contêineres compartilham o sistema operacional
com o host, e, graças a isso, podemos deixar as bibliotecas necessárias alocadas dentro do sistema
operacional. Dessa forma, conseguimos imagens de sistema extremamente leves e eficientes.
Um defeito dos contêineres é que, apesar de serem altamente portáveis – isso é, transportados e
movidos entre sistemas -, por serem desenvolvidos com a virtualização do sistema operacional do
host, apresentam baixa flexibilidade. Um contêiner desenvolvido para um sistema operacional só
irá rodar nele. Então, um contêiner Linux só roda em Linux, um Windows só roda em Windows, e
assim por diante.
9 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Comentários:
Uma imagem é a composição básica de um contêiner, a “versão gênesis”. Ela é o arquivo criado
quando empacotamos todos os componentes e dependências necessárias, e é a partir dessa
==284e2d==
10 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Orquestração de Contêineres
Dificilmente rodaremos uma aplicação em apenas um contêiner – e, por isso, precisamos de
ferramentas que vão pegar as imagens, criar múltiplos contêineres e gerenciá-los. Esse processo,
realizado de forma automatizada (como é o standard do DevOps) é denominado orquestração de
contêineres, e é desempenhado com maestria por ferramentas como o Docker Swarm ou o
Kubernetes.
Para implementarmos a orquestração precisamos, primariamente, de uma solução que irá gerar
as imagens e criar os contêineres a partir dela – normalmente, é usado o Docker para essa solução.
Além disso, precisamos implantar a ferramenta de orquestração nos nós que servirão para rodar
a aplicação – designando um nó principal para fazer a coordenação e o gerenciamento,
usualmente através de uma interface gráfica, denominado “nó mestre”.
11 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
12 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
DOCKER
Conceitos Gerais
Docker é uma plataforma aberta (open source), que objetiva desenvolver, entregar e rodar
aplicações, através de contêineres. Ele permite você separar as aplicações da infraestrutura
subjacente, de forma que as entregas de aplicativos se tornem mais rápidas e eficientes.
O Docker usa uma arquitetura cliente-servidor. O cliente Docker se comunica com o daemon
Docker, que faz toda o trabalho pesado de construir, rodar e distribuir os contêineres. O cliente e
o daemon podem rodar num mesmo sistema, ou podemos ter conexões externas.
A comunicação entre cliente e daemon é feita através de chamadas HTTP numa API REST, rodando
sobre sockets UNIX ou numa interface de rede. Podemos também usar o Docker Compose, um
cliente que permite trabalhar com um conjunto amplo de contêineres ao mesmo tempo.
13 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Dessa forma, o Docker daemon (dockerd) escuta as solicitações HTTP através da API, e gerência
os objetos do Docker, como imagens, contêineres, redes, entre outros. Podemos, também, ter
comunicação entre Docker daemons.
Já o cliente Docker é a forma primária com que usuários interagem com o Docker. Quando
digitamos os comandos, como docker run, o cliente manda esses comandos para o daemon,
através da API, que os executa. Um cliente Docker pode se comunicar com diversos daemons
diferentes.
Objeto Descrição
Uma imagem Docker é um artefato de distribuição que contém todos os
elementos necessários para executar uma aplicação, incluindo o sistema
operacional, bibliotecas, código-fonte e dependências. As imagens são
Imagens
construídas a partir de um arquivo chamado Dockerfile, que descreve passo
a passo como a imagem deve ser montada. As imagens Docker são usadas
como base para criar e executar contêineres
Um contêiner é uma instância em tempo de execução de uma imagem
Contêiner
Docker. Ele encapsula uma aplicação juntamente com todas as suas
14 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Para operacionalizarmos o Docker, podemos instalar o Docker Desktop, uma aplicação para
Windows, Mac e Linux, que cria um ambiente para construir e compartilhar aplicações em
contêineres e microsserviços. O Docker Desktop incluiu o Docker daemon, o Docker Client,
Docker Compose, Kubernetes (assunto da nossa próxima aula), entre outros.
15 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
(FCC/TRT 22/2022) O Docker tornou muito mais fácil para os desenvolvedores entender e usar a
tecnologia de contêineres. Para isso, oferece diversos recursos ou ferramentas, dentre as quais
encontram-se:
Comentários:
I. A ferramenta responsável por fazer o clustering e scheduling, atividades que fazem parte da
orquestração de contêineres, é o Docker Swarm.
II. As instruções são reunidas no Dockerfile.
III. O aplicativo que congrega todos esses objetos do docker é o Docker Desktop.
16 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Dockerfile
O Dockerfile é um arquivo de texto simples, que carrega uma série de instruções para que o
Docker Engine automatize o processo de criação de imagens Docker (contêineres). Nela definimos
tudo – mantenedor, a imagem em si, entre outros.
• FROM: Define a imagem base a ser usada para construir a nova imagem. Todas as
instruções subsequentes no Dockerfile são baseadas nesta imagem base.
• ARG: Define variáveis de argumento que podem ser passadas para o Docker durante o
build. Essas variáveis podem ser usadas no Dockerfile para definir opções de configuração
ou personalizar o processo de construção.
• RUN: Executa um comando durante o processo de construção da imagem. Este comando
pode ser usado para instalar dependências, configurar o ambiente de execução, ou
executar outras tarefas de construção necessárias para a imagem.
• ADD: Este comando copia novos arquivos, diretórios ou arquivos remotos do host e os
adiciona ao sistema de arquivos do contêiner em uma determinada localização. Ele também
pode ser usado para extrair arquivos de um URL remoto e adicioná-los ao contêiner.
• COPY: Este comando copia arquivos ou diretórios do host para o sistema de arquivos do
contêiner em uma determinada localização. Ele é semelhante ao comando ADD, mas não
suporta a extração de arquivos remotos ou a adição de URLs.
• ENTRYPOINT: Define o comando ou script a ser executado quando o contêiner for iniciado.
O comando ou script especificado é sempre executado e pode ser complementado com
argumentos passados ao iniciar o contêiner.
• CMD: Define o comando padrão a ser executado quando o contêiner for iniciado. Este
comando pode ser substituído por um comando específico do usuário ao iniciar o contêiner.
• LABEL: Define metadados para a imagem Docker, como informações de versão, descrição
do aplicativo, mantenedor, etc. Esses metadados podem ser usados para documentar e
identificar a imagem.
• EXPOSE: Informa ao Docker que o contêiner escuta em determinadas portas em tempo de
execução. Isso não abre automaticamente as portas do contêiner para o host, mas é útil
para documentar as portas que um aplicativo dentro do contêiner está usando.
• ENV: Define variáveis de ambiente no contêiner. Essas variáveis de ambiente podem ser
usadas dentro do contêiner para configurar o ambiente de execução de aplicativos ou
scripts.
• ADD: Este comando copia novos arquivos, diretórios ou arquivos remotos do host e os
adiciona ao sistema de arquivos do contêiner em uma determinada localização. Ele também
pode ser usado para extrair arquivos de um URL remoto e adicioná-los ao contêiner.
• HEALTHCHECK: Define um comando para verificar a saúde do contêiner e determinar se
ele está em um estado saudável. Isso é útil para sistemas de orquestração de contêineres
que podem querer monitorar e reagir a falhas de contêineres.
17 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
DOCKERFILE
# Selecionamos uma imagem padrão como base
FROM node:18-alpine
# Escolhemos o /app como diretório central
WORKDIR /app
# Copiamos uma série de aplicativos do pacote JSON
COPY package*.json ./
# Copiamos diretórios locais para a imagem, dentro do /app
COPY ./src ./src
COPY ./public ./public
# Passamos uma série de instruções para quando criarmos a imagem
RUN npm install \ && npm install -g serve \ && npm run build \
&& rm -fr node_modules
# Expomos a porta 3000
EXPOSE 3000
# Começamos o app com o comando serve
CMD [ "serve", "-s", "build" ]
Se tivermos uma pasta de um aplicativo sendo desenvolvido, podemos usar o comando docker
init, que criará todas as dependências necessárias para rodarmos o Docker e criarmos nossa
18 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
imagem. Ele passará um questionário, perguntando a linguagem do código, entre outros, para
criar as dependências e arquivos necessários.
a) ADD.
b) RUN.
c) FROM.
d) EXPOSE.
e) WORKDIR.
Comentários:
Um dockerfile sempre iniciará pelo comando FROM, onde definimos uma imagem padrão para
base da criação. Portanto, correta a letra C. Aliás, na lista que lhe passei, os comandos já estão
em ordem. (Gabarito: Letra C)
19 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Criando Imagens
Temos nosso Dockerfile, que irá orientar a criação da nossa imagem, agora, através de uma
aplicação de linha de comando (CLI), dentro da pasta onde temos os arquivos que queremos criar
a imagem, usamos o seguinte comando:
• OPTIONS: Esses são os diferentes parâmetros que você pode passar para personalizar o
processo de construção da imagem. Alguns dos parâmetros comuns incluem:
o -t, --tag: Este parâmetro é usado para especificar um nome e uma tag para a imagem
que está sendo construída. Por exemplo, -t myimage:latest.
o -f, --file: Este parâmetro é usado para especificar o nome do Dockerfile a ser usado.
Por padrão, o Docker procura por um arquivo chamado Dockerfile no diretório
especificado, mas você pode usar este parâmetro para especificar um arquivo diferente.
Por exemplo, -f [Link].
o --build-arg: Este parâmetro é usado para definir argumentos de compilação que
podem ser usados durante o processo de construção. Por exemplo, --build-arg
VERSION=1.0.
o --no-cache: Este parâmetro instrui o Docker a não usar o cache durante o processo
de construção, o que significa que todas as camadas serão reconstruídas a partir do
zero.
o Outros parâmetros incluem --pull para forçar a atualização da imagem base durante a
construção, --squash para comprimir as camadas em uma única camada, entre outros.
• PATH | URL | . | - : Este é o caminho para o contexto de construção, que pode
ser um caminho local no sistema de arquivos (PATH), uma URL para um repositório Git
(URL), . para ler o diretório local ou - para o diretório padrão.
o Se você estiver construindo a partir de um diretório local, geralmente você apenas
especifica o caminho para o diretório onde seu Dockerfile está localizado.
o Se você estiver construindo a partir de um repositório Git, você especifica a URL do
repositório Git.
o Se você usar ., o contexto de construção será lido a partir da entrada padrão. Isso pode
ser útil para a construção a partir de um Dockerfile gerado dinamicamente ou a partir
de um pipe.
o Se a opção for o diretório padrão do Docker, usa-se o -.
Como estamos rodando a CLI dentro da própria pasta que queremos, usaremos o comando:
20 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
SHELL
docker build -t welcome-to-docker .
No comando temos:
• docker build → cria a imagem
• -t → procura a tag para criação da imagem específica, no caso welcome-to-docker
• . → define que o conteúdo está no diretório local
21 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
a) docker os.
b) docker exec.
c) docker build.
d) docker volume.
e) docker image.
Comentários:
Um pouco de imprecisão – não é o contêiner em si que está sendo executado, e sim a imagem.
Mas, com essa licença poética, o comando responsável por executar (criar) a imagem de fato é o
docker build.
• docker os – esse comando não existe. O que existe é docker ps, que lista os contêineres em
execução no sistema
• docker exec – executa um comando dentro de um contêiner em execução
• docker volume – gerencia os volumes Docker, mecanismos usados para persistir os dados
gerados pelo contêiner
• docker imagem – usado para gerenciar as imagens Docker no sistema
Um cuidado que temos que ter é a diferenciação entre imagem e contêiner – para não incorrer no
mesmo erro que a Cebraspe. Os arquivos que contêm todas as informações e valores para criar
um contêiner são as imagens. Os contêineres são deploys de uma imagem – ou seja, o contêiner
só existe enquanto estiver rodando, de forma efêmera.
22 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Criando Contêineres
Agora, com nossa imagem em mãos, podemos criar o nosso contêiner. Isso pode ser feito através
do Docker Desktop ou, como as bancas costumam cobrar, por comando em CLI. Veja a sintaxe
genérica:
• OPTIONS: Esses são os diferentes parâmetros que você pode passar para personalizar o
comportamento do contêiner. Alguns dos parâmetros comuns incluem:
o -d, --detach: Este parâmetro inicia o contêiner em segundo plano (modo
"detached"), o que significa que ele continuará em execução mesmo que você saia do
terminal. Isso é útil para serviços em execução contínua.
o -p, --publish: Este parâmetro mapeia as portas do contêiner para portas do host.
Por exemplo, -p 8080:80 mapeia a porta 80 do contêiner para a porta 8080 do host.
o --name: Este parâmetro permite dar um nome específico ao contêiner em vez de usar
um nome gerado automaticamente. Por exemplo, --name meu_contêiner.
o --volume, -v: Este parâmetro monta um volume do host dentro do contêiner,
permitindo compartilhar dados entre o host e o contêiner. Por exemplo, -v
/caminho/local:/caminho/contêiner.
o --env, -e: Este parâmetro define variáveis de ambiente dentro do contêiner. Por
exemplo, -e VARIAVEL=valor.
o --restart: Este parâmetro define a política de reinicialização do contêiner em caso de
falha. Temos 4 políticas:
▪ No (padrão) – não reinicializa automaticamente
23 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
CUIDADO! Não confunda o comando ´docker run´, para iniciar o contêiner, com a
diretiva ´run´ no Dockerfile, que passa comandos a serem executados ao formar a
imagem. São dois objetivos diferentes!
Continuando no nosso exemplo, vamos dar deploy na imagem de contêiner que criamos. Basta
digitar no CLI o código abaixo:
24 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
SHELL
docker run -d -p 8088:3000 --name welcome-to-docker welcome-to-docker
Onde:
• docker run → comando para criarmos e iniciarmos um contêiner a partir de uma imagem
• -d → indica que estamos rodando o contêiner no modo detached, ou seja, em segundo
plano
• -p → indica que estamos mapeando a porta 3000 do contêiner para a porta local 8088.
Assim, quando qualquer tráfego for direcionado à porta 8080 do host, ele será
redirecionado para a porta 3000 do contêiner
• --name welcome-to-docker → dá um nome específico ao contêiner
• welcome-to-docker → indica a imagem que está sendo usada para criar o contêiner
(FCC/TRT 18/2023) Um técnico deseja usar o Keycloak no Docker, instalado e em condições ideais.
Para iniciar o Keycloak exposto na porta local 8080, criando um usuário inicial admin, com senha
admin, a lacuna I deve ser preenchida por:
a) docker run -v
b) docker container start on port
c) docker run -p
d) docker start --port
e) docker container run -d port
Comentários:
Queremos criar um contêiner, a partir de uma imagem, que exponha a porta local 8080 para a
porta 8080 do contêiner. Para isso, precisaremos substituir a parte inicial pelo comando de deploy
25 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
de contêiner, com a opção de publish para a pota 8080 – da seguinte forma: docker run -p.
(Gabarito: Letra C)
Comentários:
Questão difícil! Vamos lá, precisamos primeiro entender o que envolve os dois primeiros
comandos.
26 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Podemos congregar esses dois códigos um para criar o contêiner e outro para rodá-lo, com o
comando docker run. Precisamos passar como parâmetro o terminal interativo, o que pode ser
feito de forma separada (-i -t) ou agregada (-it). Por fim, indicamos o nome mppbcontainer e a
imagem (alpine) que queremos. O comando fica assim:
27 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Docker Compose
Bom, o que vimos até agora foi o processo para operacionalizar um único contêiner. Porém,
imagine se quisermos operacionalizar um grande conjunto de contêineres... como faremos?
Para isso, usamos o Docker Compose. O Compose é uma ferramenta fornecida pelo Docker que
permite definir e gerenciar aplicativos multi-contêiner de forma mais fácil e simplificada. Ele utiliza
arquivos YAML para configurar os serviços do seu aplicativo, permitindo que você defina as
dependências, volumes, redes e outras configurações necessárias para cada contêiner em um
único arquivo.
Vamos usar, novamente, o exemplo trazido pelo próprio Docker. Nele, e na maioria dos arquivos
multi-contêiner, teremos um arquivo chamado [Link]. Nele, teremos todas as orientações
para criarmos o aplicativo. Esse exemplo do Docker envolve a criação de dois contêiners para um
aplicativo – o todo-app e o todo-database. Vamos destrinchar o arquivo YAML e entender o que
é cada diretiva presente no documento.
28 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
YAML
services:
todo-app:
build:
context: ./app
depends_on:
- todo-database
environment:
environment:
NODE_ENV: production
ports:
- 3000:3000
- 35729:35729
develop:
watch:
- path: ./app/[Link]
action: rebuild
- path: ./app
target: /usr/src/app
action: sync
todo-database:
image: mongo:6
ports:
- 27017:27017
• services: Isso indica que estamos definindo serviços para o Docker Compose. Cada
serviço representa um contêiner Docker.
• todo-app: Este é o nome do serviço que estamos definindo. Ele representa o aplicativo de
tarefas pendentes.
o build: Esta seção define como construir a imagem Docker para este serviço. O contexto
de construção é o diretório ./app, onde está localizado o código-fonte do aplicativo.
o depends_on: Esta seção especifica que o serviço todo-app depende do serviço todo-
database, ou seja, o banco de dados deve ser iniciado antes do aplicativo.
o environment: Aqui são definidas variáveis de ambiente para o serviço. Neste caso,
define-se a variável NODE_ENV como production.
o ports: Esta seção mapeia as portas do contêiner para as portas do host. Por exemplo,
3000:3000 mapeia a porta 3000 do contêiner para a porta 3000 do host.
o develop: Esta seção contém configurações específicas para o desenvolvimento. Ela
define um monitoramento (watch) para o código-fonte do aplicativo, onde qualquer
alteração nos arquivos [Link] ou no diretório ./app resultará em uma
29 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Podemos ter uma penca de outras diretivas num documento. Vou listar apenas as principais, se
não vamos ficar aqui a aula toda falando sobre elas. Ah, preciso ressaltar que a leitura delas é
extremamente importante, já que tal assunto já foi alvo de cobrança em provas discursivas, como
no cargo de TI para a SEF-MG – no caso, aplicado ao Kubernetes, se não me engano.
30 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
docker compose
• up: usado para criar e iniciar os serviços definidos no arquivo [Link]. Ele constrói
as imagens necessárias (se ainda não estiverem construídas) e inicia os contêineres
associados a esses serviços.
• down: usado para parar e remover todos os contêineres, redes e volumes associados aos
serviços definidos no arquivo [Link]. É basicamente o oposto do comando up,
desligando todo o ambiente.
• build: constrói as imagens dos serviços definidos no arquivo [Link], sem iniciar os
contêineres. Isso é útil quando você precisa apenas construir as imagens sem iniciar todo o
ambiente.
• start: usado para iniciar os serviços definidos no arquivo [Link], sem reconstruir
as imagens. Ele inicia os contêineres associados a esses serviços.
• stop: usado para parar os serviços definidos no arquivo [Link], mas mantém
os contêineres em execução. Isso é útil quando você precisa interromper temporariamente
a execução dos serviços, sem removê-los.
• restart: usado para reiniciar os serviços definidos no arquivo [Link],
reiniciando os contêineres associados a esses serviços.
• logs: usado para exibir os logs de saída dos serviços definidos no arquivo docker-
[Link]. Ele mostra a saída padrão de cada contêiner em tempo real.
• ps: usado para listar os contêineres associados aos serviços definidos no arquivo docker-
[Link], mostrando o estado atual de cada um.
Por fim, se quisermos criar o nosso cluster de contêineres com base no yaml, digitaremos:
docker compose up
(Inédita/Prof. Felipe Mathias) Rafael, responsável pelo DevOps da empresa SisCOM, precisa iniciar
uma aplicação que envolve um conjunto de aplicativos. Durante o desenvolvimento do arquivo
YAML, Rafael está trabalhando na diretiva “depends_on”. Assinale a alternativa que representa o
que é definido nessa diretiva.
31 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
a) Define o modo de rede para o contêiner, permitindo a comunicação com outros contêineres.
b) Especifica as variáveis de ambiente a serem configuradas para o contêiner.
c) Controla a ordem de inicialização dos serviços, garantindo que determinados serviços sejam
iniciados antes de outros.
d) Define volumes a serem montados dentro do contêiner, permitindo a persistência de dados.
e) Configura as opções de registro para o contêiner, como o driver de log e suas opções.
Comentários:
32 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Persistência de Dados
O Docker isola todo o conteúdo do contêiner, incluindo os dados. Porém, podemos ter casos em
que queremos persistir os dados do contêiner para o sistema operacional, para tornar essa
interação definitiva. Por exemplo, uma criação de usuário, ou interações específicas de um usuário
(já que podemos ter um deploy de 1 contêiner a cada usuário).
Com esse objetivo, usamos os Volumes. Um volume é uma local dentro do sistema de arquivos do
sistema operacional subjacente, que é gerenciado pelo Docker. Dessa forma, podemos persistir
os dados do contêiner mesmo após ele ter sido encerrado e/ou deletado.
A criação de volumes também pode se dar no arquivo [Link], através de diretivas. É bem
simples, basta abrirmos a diretiva volumes e apontarmos onde a pasta local, e, em seguida, a pasta
do contêiner (local:contêiner)
YAML
services:
todo-database:
image: mongo:6
volumes:
- database:/data/db
ports:
- 27017:27017
Para que possamos montar esse diretório de arquivo do sistema host dentro de futuros
contêineres, usamos o mecanismo de Bind Mount. Com isso, temos uma conexão direta entre o
host e os contêineres. O ponto negativo é que isso acaba quebrando um pouco o isolamento do
contêiner.
33 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
YAML
services:
todo-app:
...
volumes:
- ./app:/usr/src/app
- /usr/src/app/node_modules
O volumes indica ao compose para montar a pasta local ./app em /usr/src/app no contêiner para
o serviço todo-app. Este bind mount em particular sobrescreve o conteúdo estático do diretório
/usr/src/app no contêiner e cria o que é conhecido como um contêiner de desenvolvimento. A
segunda instrução, /usr/src/app/node_modules, impede que o bind mount sobrescreva o diretório
node_modules do contêiner para preservar os pacotes instalados no contêiner.
34 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Comandos CLI
O intuito nesse capítulo é reunir todos os comandos que podem ser usados no Docker. Você pode
fazer isso caso tenha o Docker instalado – basta abrir qualquer ferramenta de CLI e digitar docker
--help. Vou destacar aqueles que mais importantes, e que acabam sendo os que mais caem em
provas.
Comando Descrição
docker attach Acessa o contêiner e trabalha a partir dele
docker exec Executa uma instrução dentro do contêiner, sem precisar o attach
35 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
O comando utilizado para listar os contêineres que estão sendo executados e informações
relacionadas a estes é o:
36 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
a) docker ps
b) docker rm
c) docker node
d) docker inspect
e) docker search
Comentários:
Para verificarmos os contêineres que estão sendo executados, usamos o comando docker ps.
(Gabarito: Letra A)
(COMPERVE/TJ RN/2020) Os volumes são mecanismos utilizados para persistir os dados gerados
e usados pelos containers do Docker. Embora as montagens de ligação dependam da estrutura
de diretórios da máquina host, os volumes são completamente gerenciados pelo Docker.
Considerando que um analista queira criar um volume de nome my-volume dentro de um docker,
ele deve executar o comando
Comentários:
Para criarmos um volume dentro de determinado contêiner, usamos o comando docker volume
create <nome_do_volume> – no caso da questão, como queremos o nome my-volume, o
comando será docker volume create my-volume. (Gabarito: Letra A)
(FGV/TRT 16/2022) Docker é uma plataforma que permite criar e compartilhar aplicativos e
microsserviços em contêineres.
a) docker composes.
b) docker create.
c) docker build.
d) docker exec.
e) docker run.
Comentários:
37 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Nesse sentido, o único dos comandos que aparece na questão é o da letra E, que é nosso gabarito.
(Gabarito: Letra E)
38 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Docker Swarm
Orquestração de Contêineres
A orquestração de contêineres é uma prática de gerenciamento de contêineres, que envolve
controlar, coordenar o deployment, a escalabilidade, a disponibilidade e, principalmente,
automatizar todo esse processo.
Pense, por exemplo, que você é auditor fiscal e precisa acessar uma área privativa do serviço do
Estado, para promover alguma operação. Ao fazer login, uma das abordagens recomendadas é a
criação de um contêiner (ou de vários, se essa atividade usa um conjunto de contêineres) para lidar
com essa sessão.
Pense, se fossemos fazer um deploy para cada acesso, a criação, a extinção, o controle do ciclo
de vida do contêiner, quantos funcionários a empresa não teria que ter só para lidar com isso? E
o tempo que isso demoraria?
39 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Para “saber” o que ele precisa fazer, os orquestradores baseiam-se em políticas definidas pelo
usuário e em eventos. Dessa forma, usualmente em um arquivo YAML ou JSON, o usuário define
quando e o que o orquestrador deve fazer, em resposta a determinados eventos. Por exemplo,
podemos ter o número de usuários acessando determinado serviço configurado e, a partir do
ponto máximo, monitorado através de solicitações HTTP, uma replicação (cópia) do contêiner
atual é feita.
O Docker Swarm é uma ferramenta de orquestração de Contêineres nativa do Docker, que faz
toda a parte de gerenciamento do ciclo de vida de contêineres. A partir de uma rede sobreposta
(a docker network), o Swarm faz a descoberta de serviços e o balanceamento de carga.
O Swarm gira em torno do conceito de serviços. Os serviços são constituídos a partir de múltiplos
contêineres de uma mesma imagem, que são implementados dentro de um nó (node) – sendo
que, em cada nó, podemos ter um ou mais serviços.
40 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
• Nó gerente (manager node): responsável por gerenciar e monitorar os nós, de forma a criá-
los, replicá-los e enviar tarefas a eles
• Nó trabalhador (worker node): recebe a tarefa do gerente e a executa
Essa comunicação entre gerente-trabalhador é feita a partir do protocolo HTTP, por meio de uma
API específica do Docker – a Docker API. Cada nó terá seu próprio Docker Daemon, que receberá
essa tarefa e a alocará para o container respectivo. Para saber para qual serviço a solicitação deve
ser mandada, usamos a Descoberta de Serviços (ou “Service Descobery”), que roteia o tráfego de
trabalho para o serviço específico que deve lidar com ele.
• Global: nesse modo, o Swarm manterá os contêineres em todos os nós escravos e master
(ou nó trabalhador e gerente). Isso mantem replicas dos contêineres em todos os nós
disponíveis do cluster
• Replicado: aqui o Swarm irá implementar os contêineres no número de replicas definidas
pelo usuário.
41 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Ao usarmos o comando, se não existir um cluster ativo, iremos iniciar o cluster com o nó atual (a
sua máquina) como o nó gerente. Além disso, são gerados dois valores:
• Token de junção (join token): valor usado para permitir que outros nós se juntem ao cluster.
Esse token é específico para o papel que o nó desempenhará (ou seja, gerente ou
trabalhador) e possui um prazo de validade
• Swarm ID: um identificador único para o cluster Swarm criado
Se quisermos adicionarmos mais nós ao nosso cluster existente, usamos o comando abaixo em
cada nó desejado:
Criando Serviços
Serviços, como já falei para vocês, é uma coletânea de contêineres criados a partir de uma mesma
imagem Docker. Usualmente, cada contêiner será responsável por um serviço da aplicação
(veremos mais sobre na aula de microsserviços), fazendo jus ao nome. Cada serviço recebe um
conjunto de tarefas, que é alocada dentro dos contêineres do serviço.
Para criarmos um serviço específico, usamos o comando abaixo:
42 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Gerenciando Nós
Bom, temos nossos nós criados, definimos os serviços e estamos com o cluster em funcionamento.
Agora, precisamos de ferramentas para monitorar as atividades dos nossos nós, e fazer um
gerenciamento geral deles.
• ls → lista todos os nós no cluster Docker Swarm. Ele fornece informações como o ID do
nó, o hostname, o status (como ativo ou inativo), se o nó é um gerenciador ou um
trabalhador, e a versão do Docker em execução no nó.
• inspect <NODE_ID or NODE_NAME> → fornece informações detalhadas sobre um nó
específico no cluster. Ele pode ser usado para obter informações como endereço IP, labels,
recursos disponíveis, e configurações específicas do nó.
• update → usado para atualizar a configuração de um nó no cluster. Você pode usá-lo para
adicionar ou remover etiquetas, ajustar recursos (como CPUs ou memória), ou modificar
outras configurações do nó.
• promote <NODE_ID or NODE_NAME> → usado para promover um nó de trabalhador a
gerenciador. Isso pode ser útil se você deseja adicionar mais nós gerenciadores ao cluster
para melhorar a redundância e a disponibilidade.
• demote <NODE_ID or NODE_NAME> → usado para rebaixar um nó de gerenciador a
trabalhador. Você pode usar isso para redistribuir a carga de trabalho entre os nós
gerenciadores e trabalhadores no cluster.
• rm <NODE_ID or NODE_NAME> → remove um nó do cluster. Isso pode ser útil se você deseja
aposentar um nó antigo ou se deseja reduzir o tamanho do cluster.
43 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Um cuidado que você deve ter é que, enquanto o comando docker ps lista os contêineres ativos,
no Swarm não temos esse comando. Aqui, usamos apenas o docker node ls para listar todos os
nós.
44 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
YAML
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
deploy:
replicas: 3
placement:
constraints:
- [Link] == worker
networks:
- my_network
healthcheck:
test: ["CMD", "curl", "-f", "[Link]
interval: 30s
timeout: 10s
retries: 3
db:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: my_database
deploy:
replicas: 1
networks:
- my_network
volumes:
- db_data:/var/lib/mysql
A instrução YAML acima cria dois serviços, um web e outro banco de dados. Vamos explorar as
diretivas do YAML para entender tudo que podemos colocar aí. Lembrando que tudo o que
veremos aqui é aplicável ao Docker Compose, e vice-versa.
Definindo o Objeto
Começamos o compose com a definição do objeto. Aqui, no nosso caso, começaremos definindo
o serviço – usando a diretiva services. No nosso exemplo acima, criamos dois serviços: o web e o
db.
45 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Imagem Base
Definido o serviço, precisamos escolher a imagem base para ele. Temos três formas de fazer isso:
YAML
services:
alpine:
image: alpine:latest
Definindo uma imagem local, com a tag build, definindo o local de acordo com a Dockerfile.
Exemplo:
YAML
services:
app:
build: ./app
YAML
services:
app:
build:
context: ./dir
dockerfile: [Link]
Portas
A exposição de portas se dá de forma muito similar ao que vimos no Dockerfile. Podemos expor
as portas de duas formas:
YAML
expose:
- "3000/tcp"
- "8000/udp"
46 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
YAML
expose:
- "8080:80/udp” #lembrando, temos host:container/protocolo
Comandos
Os commands são ações executadas assim que o contêiner for iniciado, agindo como uma espécie
de substituto para os comandos que você digitaria no CLI do contêiner. Podemos, por exemplo,
rodar um npm run assim que o contêiner for montado.
YAML
app:
...
command:
- 'npm run start'
Volumes
Podemos criar os volumes diretamente no YAML, através do bind mount. Nele,
YAML
volumes:
- /opt/data:/var/lib/mysql #caminho origem:caminho contêiner
- datavolume:var/lib/mysql #aqui estamos atribuindo um nome
Dependências
Já vimos um pouco das dependências – que definem ordens na criação dos serviços. Dessa forma,
se A depende de B, criaremos o serviço B antes para não termos problemas de referência e
funcionamento.
47 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
YAML
ghost: #nome do serviço
container_name: ghost
image: ghost
depends_on: [db] #db será iniciado antes
Variáveis de Ambiente
Variáveis de ambientes são usadas para configurar os dados no contêiner. Esse parâmetro é usado
se o contêiner é dependente do sistema operacional, de forma a atribuir nomes a variáveis.
YAML
web:
environment:
- NODE_ENV=production
Também podemos anexar um arquivo .env. Esse é um arquivo que contém todas as nossas
variáveis de ambiente.
YAML
web:
env_file:
- [Link]
Rede
A rede (network) define as regras de comunicação entre contêineres, e entre os contêineres e o
sistema host. As redes, em si, são objetos, portanto têm o mesmo nível de hierarquia que os
serviços. Dessa forma, definimos uma rede dentro do YAML como um objeto, atribuindo-a um
nome, e, em cada contêiner, apenas fazemos referência ao nome da rede – já que as configurações
estarão no objeto network.
48 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
o host: remove o isolamento de rede entre o contêiner e o host, usando somente a rede
do host. Essa forma é útil quando precisamos de uma performance otimizada, ou
quando o contêiner lida com muitas portas.
o overlay: permite a conexão entre vários daemons do Docker, permitindo que tenhamos
comunicação entre diferentes nós. Dessa forma, podemos remover o roteamento a nível
de sistema operacional.
o ipvlan: cria interfaces de rede virtuais que compartilham endereços IP com o host – tanto
endereços IPv4 quanto IPv6. Dessa forma, os contêineres são acessíveis diretamente
pela rede do host, como se estivessem conectados a ela
o macvlan: também cria interfaces de rede virtual, agora atribuindo um endereço MAC a
cada contêiner, permitindo que cada um tenha seu endereço IP e MAC próprio
o none: remove todas as interfaces de um contêiner, deixando-o isolado.
• driver_opts: define configurações adicionais para o driver. Cada driver tem suas opções, e,
honestamente, as bancas não costumam ir tão a fundo.
YAML
services:
app1:
image: nginx:latest
networks:
- my_overlay_network
networks:
my_overlay_network:
driver: overlay
driver_opts:
encrypted: "true"
(FGV/TJ RN/2023) A analista Maria gerencia a aplicação WebJus. A WebJus requer a execução de
dois containers Docker que necessitam de comunicação entre si. No entanto, para fins de
balanceamento de carga, cada container da WebJus foi alocado em um servidor diferente. A fim
49 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
de configurar a comunicação entre os containers da WebJus de forma simples, Maria criou a rede
Docker NetJus, que é capaz de conectar containers rodando em servidores diferentes.
a) host;
b) ipvlan;
c) bridge;
d) overlay;
e) macvlan.
Comentários:
Temos que cada contêiner está em um servidor diferente – portanto, cada contêiner WebJus se
comunica com um daemon diferente. Para permitir comunicação entre daemons diferentes (e,
consequentemente, entre servidores e nós), precisamos usar a configuração do tipo overlay.
(Gabarito: Letra D)
Healthcheck
A diretiva healthcheck é usada para definir verificações de saúde dos contêineres. Dessa forma,
periodicamente o Docker checa se está tudo funcionando perfeitamente em cada um dos
contêiners, verificando a sua integridade. Cada tipo de contêiner aceita um healtcheck diferente.
Vamos falar apenas dos parâmetros genéricos – que podem cair na sua prova.
• test: [plataforma, comando] → define o comando a ser executado para verificar a saúde
• interval → define o intervalo da aplicação do teste
• timeout → define o tempo limite para cada verificação
• retries → define quantas vezes o Docker tentará executar o comando, antes de considerá-
lo como “não saudável”.
YAML
healthcheck:
test: ["CMD", "curl", "-f", "[Link]
interval: 30s
timeout: 10s
retries: 3
50 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Assim, definimos o teste como o comando curl -f [Link] a ser executado no CMD,
a cada 30s, com limite para 10s em cada teste. Se, após 3 tentativas, não tivermos sucesso, o
contêiner será considerado como não saudável.
Assinale a alternativa que explica, de forma correta, o motivo plausível para essa saída ter sido
obtida.
a) A versão 14.04 do Ubuntu, usada como imagem para o serviço A, não vem com o utilitário nc.
b) A opção depends_on está com sintaxe incorreta. Ela deveria conter uma lista de itens, cada
um iniciado por um hífen.
c) A opção depends_on não espera os serviços subirem e passarem no healthcheck, a menos que
seja usada com a condição service_healthy.
d) A opção depends_on está especificada no serviço errado. Ela deveria ter sido especificada
dentro do serviço B, indicando uma dependência para com o serviço A.
e) A opção depends_on é considerada legada. Em vez dela, deveria ter sido utilizada a opção
links.
Comentários:
51 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Por exemplo, um compose que envolva um banco de dados e uma aplicação, usualmente o banco
de dados será inicializado antes, mas não estará “pronto” antes da aplicação, já que deve demorar
mais para carregar todos os dados – por isso, usualmente, prevemos mecanismos de resiliência
para dados indisponíveis.
Nesse sentido, ao prevermos um health check no serviço B, teremos, no início da execução, alguns
problemas – já que A estará realizando pedidos a B sem ele estar completamente operacional.
Nesses casos, é útil usar a condição service_healthy, para iniciarmos a verificação somente apôs
ser constatado que os erviço está saudável. Nesse sentido, correto o apontamento da letra C.
(Gabarito: Letra C)
52 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
QUESTÕES COMENTADAS
COLUNA I
1. FROM
2. EXPOSE
3. ENV
COLUNA II
( ) Declara imagem para criação do container.
( ) Declara uma variável de ambiente.
( ) Declara a porta que será aberta no container.
a) 123
b) 132
c) 312
d) 231
Comentários:
Ótima questão para revisarmos alguns parâmetros, seja do Dockerfile, seja do Compose.
53 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Gabarito: Letra B
Comentários:
Um container, seja Docker, seja Linux, é uma instância virtual executável, criada a partir de um
arquivo de imagem. Ela difere de uma virtualização (letra A) por utilizar recursos do sistema
operacional subjacente para simular um sistema operacional interno às aplicações que estão sendo
virtualizadas.
Gabarito: Letra D
03. (VUNESP/UNICAMP/2023) O uso do software Docker tem sido comum no sistema operacional
Linux para a criação e execução de aplicações na forma de containers. Nesse contexto, uma
imagem de container representa
a) uma janela de interface gráfica onde a saída produzida pela execução do container é
apresentada.
b) um container em execução, que se reflete em um ou mais processos no sistema operacional
que executa o container.
c) um arquivo de log gerado durante a execução do container, registrando informações
importantes para avaliação do desempenho da aplicação.
d) um arquivo no formato JPG ou PNG para exibição da aplicação no navegador, quando esta
for publicada em repositórios de containers na web.
e) um arquivo com todo o conteúdo necessário para a execução de um container, incluindo a
própria aplicação e suas dependências.
Comentários:
Uma imagem é um arquivo que congrega tudo que é necessário para rodarmos um aplicativo,
com o estado necessário que queremos – código da aplicação, dependências, dados, entre outros.
54 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Essa imagem é a “estrutura” da aplicação e serve como fonte para a criação dos contêineres.
Nesse sentido, a alternativa com a explicação correta é a letra E.
Gabarito: Letra E
04. (AOCP/IF MA/2023) Suponha que você seja um analista de infraestrutura em uma empresa de
tecnologia e esteja trabalhando em um projeto que envolve o uso de Docker para executar
aplicativos em contêineres. Sua equipe busca garantir a segurança dos contêineres, sem
comprometer a escalabilidade e a portabilidade. Nesse cenário, qual é a maneira eficaz de
melhorar a segurança ao executar aplicativos em contêineres com Docker?
Comentários:
Vamos analisar cada afirmativa, procurando a que aponta uma abordagem segura na execução de
contêineres.
a) control groups.
b) union file systems.
c) bare metal.
d) namespace.
e) inter process communication.
55 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Comentários:
Na virtualização tradicional, quem faz a abstração é o hypervisor. Porém, nos contêineres, não
temos mais a figura do hipervisor. Quem “assume” a responsabilidade pela abstração do sistema
subjacente são os namespaces (Linux) e os silos (Windows).
Gabarito: Letra D
06. (VUNESP/TJ RS/2023) Deseja-se executar um container Docker no qual um diretório específico
dentro do container seja mapeado em um diretório específico da máquina host. Esse diretório
do host deve ser especificado pelo usuário do Docker por meio de seu caminho absoluto no
comando de execução do container. A solução para esse problema consiste em utilizar
a) uma imagem.
b) um volume.
c) um bind mount.
d) um tmpfs mount.
e) uma rede virtual.
Comentários:
Quando falamos de persistir dados, temos duas abordagens: os Volumes ou os bind mount.
Podemos perceber a diferença no compose também. Nos bind mounts, temos uma atribuição
entre host:contêiner. Já nos volumes, temos uma definição de um objeto, que compartilha o nível
de hierarquia de um serviço, por exemplo.
Gabarito: Letra C
56 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
07. (VUNESP/TJ RS/2023) O seguinte comando da ferramenta Docker serve para remover todos
os volumes locais não usados.
a) estão vazios.
b) não são referenciados por nenhum container.
c) não são usados há um determinado período de tempo, cujo valor default depende das
configurações do Docker.
d) são anônimos.
e) não contêm nenhum arquivo de imagem.
Comentários:
O prune é um comando usado para remover volumes não usados – que, para o Docker, são
aqueles que não são utilizados por nenhum contêiner. A verificação de uso/não uso é feita a partir
da análise de referências: se um volume não é referenciado por nenhum contêiner, ele é
considerado sem uso.
Gabarito: Letra B
Comentários:
Um erro sutil, mas grande: com o comando docker build, nós criamos uma imagem a partir de um
Dockerfile, e não o Dockerfile em si.
Gabarito: Errado
57 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Comentários:
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
MD ["node", "src/[Link]"]
EXPOSE 3000
A partir das informações precedentes e considerando que se esteja no mesmo diretório onde se
encontra o arquivo Dockerfile, assinale a opção que apresenta o comando a ser executado para
criar uma imagem do contêiner com o nome node-js.
a) docker cp -t node-js .
b) docker build -t node-js .
c) docker push -t node-js .
d) docker image -t node-js .
e) docker pull -t node-js .
Comentários:
O outro termo que aparece na sintaxe, o -t, indica a atribuição de uma tag.
58 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Gabarito: Letra B
a) docker attach
b) docker node ls
c) docker pull
d) docker rmi
e) docker rm /redis
Comentários:
O comando responsável por “puxar” imagens do Hub é o docker pull. Sua contrapartida, para
enviar, é o docker push. Quanto aos demais comandos:
Gabarito: Letra C
É possível visualizar o consumo de recursos pelo contêiner no Docker, por meio do comando
docker container ls.
Comentários:
Errado! Para visualizar o consumo de recursos de um contêiner usamos o comando docker status.
Gabarito: Errado
59 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Comentários:
I. Errado. É uma afirmativa mal construída – se o problema for no sistema operacional subjacente
sim, teremos um erro. Mas a afirmativa mais se aproxima do conceito de virtualização, já que
contêiners são executados de forma isolada e um problema em um deles não afetaria os demais.
II. Certo. Contêineres, por empacotarem todos os requisitos para a aplicação rodar, de fato não
precisam de nada precedente a eles.
III. Certo. Perfeito galera – o Docker cria imagens de aplicativos e seus requisitos, e, a partir das
imagens, criamos os contêineres.
Gabarito: Letra D
60 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
a) que permite utilizar diversos recursos e ferramentas, como Apache e PHP, porém tudo
rodando em um mesmo sistema operacional.
b) de código aberto criada pelo Google para operações de implantação de contêiner,
aumento e redução e automação em clusters de hosts.
c) de orquestração de contêiner de código aberto, sendo o mecanismo de clusterização nativo
para e pelo Docker, utilizando sua mesma linha de comando.
d) que roda sobre o Kubernetes instalado em sistema operacional na versão Enterprise da Red
Hat, agregando opções de monitoramento, integração e entrega contínua.
e) usada pela Amazon para fornecer outros serviços aos clientes, como DNS, balanceamento,
segurança e monitoramento, se integrando
Comentários:
15. (FGV/CGU/2022) Uma das estratégias para reduzir o tamanho de imagens Docker consiste em:
Comentários:
Vamos analisar cada afirmativa, procurando aquela que irá apontar uma prática que permite
reduzir o tamanho das imagens Docker.
a) Certo. A cada comando definido no RUN do Dockerfile, temos uma criação de uma camada
de imagem – mais camadas, maior o tamanho. Se agregarmos vários comandos juntos,
teremos uma redução do número de camadas, reduzindo o tamanho do arquivo.
b) Errado. Isso não garante um tamanho menor.
c) Errado. Vide letra A – devemos agregar, não separar.
d) Errado. A ordem dos comandos não afeta o tamanho. O que podemos fazer é desabilitar o
cache para diminuir o tamanho.
e) Errado. Não é recomendada a compactação de arquivos numa imagem.
61 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
“A plataforma Docker usa uma arquitetura do tipo _____. O cliente Docker conversa com
o daemon do Docker, que constrói, executa e distribui _____ Docker. O cliente e o daemon
do Docker podem ser executados em um mesmo sistema ou se conectar um cliente do
Docker a um daemon remoto. O cliente Docker e o daemon se comunicam usando _____
ou uma interface de redes.”
Assinale a opção cujos itens completam corretamente as lacunas do fragmento acima, na ordem
apresentada.
Comentários:
17. (FGV/SEFAZ AM/2022) Com relação à segurança dos contêineres Docker, analise as afirmativas
a seguir e assinale (V) para a verdadeira e (F) para a falsa.
62 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
a) F – V – V.
b) F – F – V.
c) V – F – V.
d) V – F – F.
e) V – V – F.
Comentários:
( ) Aproveitam-se dos mecanismos interprocess communication padrão, tais como sinais, pipes e
sockets, onde cada contêiner possui a sua própria network stack.
Verdadeiro. Os mecanismos de comunicação são os mais variados – e, de fato, cada contêiner
possui sua própria pilha de rede.
Gabarito: Letra E
18. (FCC/TJ CE/2022) No Linux, em condições ideais, o Docker é disponibilizado com três redes
por padrão. Essas redes oferecem configurações específicas para o gerenciamento do tráfego de
dados e
a) deve-se, para visualizar as redes no Docker, utilizar o comando: docker network -show
b) todos os containers que estão na rede None poderão se comunicar via protocolo TCP/IP.
Se uma pessoa souber qual é o endereço IP do container que deseja conectar, é possível
enviar tráfego para ele, pois estão todos na mesma rede IP ([Link]/24).
63 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
c) a rede Host tem como objetivo isolar o container para comunicações externas. A rede não
recebe qualquer interface para comunicação externa. A única interface de rede IP será a
localhost. Essa rede, normalmente, é utilizada para containers que manipulam apenas
arquivos de backup, sem necessidade de enviá-los via rede para outro local.
d) a rede None tem como objetivo entregar para o container todas as interfaces existentes no
docker none. Isso agiliza a entrega dos pacotes, uma vez que não há host no caminho das
mensagens. Mas o uso de um host pode ser importante para a segurança e a gerência do
tráfego.
e) Bridge é a rede padrão para qualquer container iniciado no Docker, a menos que seja,
explicitamente, associada outra rede a ele. Os containers da rede default bridge podem
acessar uns aos outros somente através de seus endereços IP, a menos que se utilize a
opção --link
Comentários:
Gabarito: Letra E
19. (FCC/TRT 19/2022) A fim de utilizar o Docker em sua organização, um Analista necessitou
conhecer os principais componentes dessa plataforma, tais como:
I. Software que roda na máquina onde o Docker está instalado. Recebe comandos do cliente
a partir de Command Line Interfaces ou API’s REST.
II. Mecanismo usado para criar imagens e containers.
III. Coleção de imagens hospedadas e rotuladas que juntas permitem a criação do sistema
de arquivos de um container. Pode ser público ou privado.
IV. Repositório usado para hospedar e baixar diversas imagens. Pode ser visto como uma
plataforma de Software as a Service (SaaS) de compartilhamento e gerenciamento de
imagens.
64 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Comentários:
Gabarito: Letra D
I- Na virtualização, cria-se uma nova camada de computação, na qual uma máquina virtual
permite a virtualização de toda a infraestrutura de TI (rede, servidores e storage) através de
um sistema operacional próprio (hipervisor).
II - Conteinerização (contêiner) é um processo de computação que utiliza uma pequena
fração do recurso de hardware para viabilizar a execução de aplicativos de forma mais
eficiente e isolada. No caso do contêiner, permite a virtualização de aplicativos de software,
utilizando o sistema operacional do host em um Kernel compartilhado.
III -As máquinas virtuais são medidas em megabyte. Elas contêm, no máximo, a aplicação e
os arquivos necessários para executá-la. Além disso, elas costumam ser utilizadas para
empacotar funções individuais que realizam tarefas específicas, os famosos microsserviços.
Como são leves e possuem um sistema operacional compartilhado, as VMs são muito fáceis
de migrar entre vários ambientes.
65 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
IV -Os contêineres são medidos em gigabyte. Eles costumam ter seu próprio sistema
operacional, o que possibilita a execução simultânea de várias funções com uso intenso de
recursos. Por terem um número maior de recursos à disposição, contêineres são capazes de
abstrair, dividir, duplicar e emular por inteiro servidores, sistemas operacionais, desktops,
bancos de dados e redes.
a) I e ll.
b) II e III.
c) lII e IV.
d) I e III.
e) II e lV.
Comentários:
Ótima questão da banca FAPEC. Antes de ir para ela, vamos lembrar da nossa comparação
contêiner x virtualização.
66 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Gabarito: Letra A
67 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
LISTA DE QUESTÕES
COLUNA I
1. FROM
2. EXPOSE
3. ENV
COLUNA II
( ) Declara imagem para criação do container.
( ) Declara uma variável de ambiente.
( ) Declara a porta que será aberta no container.
a) 123
b) 132
c) 312
d) 231
03. (VUNESP/UNICAMP/2023) O uso do software Docker tem sido comum no sistema operacional
Linux para a criação e execução de aplicações na forma de containers. Nesse contexto, uma
imagem de container representa
a) uma janela de interface gráfica onde a saída produzida pela execução do container é
apresentada.
68 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
04. (AOCP/IF MA/2023) Suponha que você seja um analista de infraestrutura em uma empresa de
tecnologia e esteja trabalhando em um projeto que envolve o uso de Docker para executar
aplicativos em contêineres. Sua equipe busca garantir a segurança dos contêineres, sem
comprometer a escalabilidade e a portabilidade. Nesse cenário, qual é a maneira eficaz de
melhorar a segurança ao executar aplicativos em contêineres com Docker?
a) control groups.
b) union file systems.
c) bare metal.
d) namespace.
e) inter process communication.
06. (VUNESP/TJ RS/2023) Deseja-se executar um container Docker no qual um diretório específico
dentro do container seja mapeado em um diretório específico da máquina host. Esse diretório
do host deve ser especificado pelo usuário do Docker por meio de seu caminho absoluto no
comando de execução do container. A solução para esse problema consiste em utilizar
a) uma imagem.
b) um volume.
c) um bind mount.
d) um tmpfs mount.
e) uma rede virtual.
69 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
07. (VUNESP/TJ RS/2023) O seguinte comando da ferramenta Docker serve para remover todos
os volumes locais não usados.
a) estão vazios.
b) não são referenciados por nenhum container.
c) não são usados há um determinado período de tempo, cujo valor default depende das
configurações do Docker.
d) são anônimos.
e) não contêm nenhum arquivo de imagem. ==284e2d==
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
MD ["node", "src/[Link]"]
EXPOSE 3000
70 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
A partir das informações precedentes e considerando que se esteja no mesmo diretório onde se
encontra o arquivo Dockerfile, assinale a opção que apresenta o comando a ser executado para
criar uma imagem do contêiner com o nome node-js.
a) docker cp -t node-js .
b) docker build -t node-js .
c) docker push -t node-js .
d) docker image -t node-js .
e) docker pull -t node-js .
a) docker attach
b) docker node ls
c) docker pull
d) docker rmi
e) docker rm /redis
É possível visualizar o consumo de recursos pelo contêiner no Docker, por meio do comando
docker container ls.
71 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
a) que permite utilizar diversos recursos e ferramentas, como Apache e PHP, porém tudo
rodando em um mesmo sistema operacional.
b) de código aberto criada pelo Google para operações de implantação de contêiner,
aumento e redução e automação em clusters de hosts.
c) de orquestração de contêiner de código aberto, sendo o mecanismo de clusterização nativo
para e pelo Docker, utilizando sua mesma linha de comando.
d) que roda sobre o Kubernetes instalado em sistema operacional na versão Enterprise da Red
Hat, agregando opções de monitoramento, integração e entrega contínua.
e) usada pela Amazon para fornecer outros serviços aos clientes, como DNS, balanceamento,
segurança e monitoramento, se integrando
15. (FGV/CGU/2022) Uma das estratégias para reduzir o tamanho de imagens Docker consiste em:
“A plataforma Docker usa uma arquitetura do tipo _____. O cliente Docker conversa com
o daemon do Docker, que constrói, executa e distribui _____ Docker. O cliente e o daemon
do Docker podem ser executados em um mesmo sistema ou se conectar um cliente do
Docker a um daemon remoto. O cliente Docker e o daemon se comunicam usando _____
ou uma interface de redes.”
72 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Assinale a opção cujos itens completam corretamente as lacunas do fragmento acima, na ordem
apresentada.
17. (FGV/SEFAZ AM/2022) Com relação à segurança dos contêineres Docker, analise as afirmativas
a seguir e assinale (V) para a verdadeira e (F) para a falsa.
a) F – V – V.
b) F – F – V.
c) V – F – V.
d) V – F – F.
e) V – V – F.
18. (FCC/TJ CE/2022) No Linux, em condições ideais, o Docker é disponibilizado com três redes
por padrão. Essas redes oferecem configurações específicas para o gerenciamento do tráfego de
dados e
a) deve-se, para visualizar as redes no Docker, utilizar o comando: docker network -show
b) todos os containers que estão na rede None poderão se comunicar via protocolo TCP/IP.
Se uma pessoa souber qual é o endereço IP do container que deseja conectar, é possível
enviar tráfego para ele, pois estão todos na mesma rede IP ([Link]/24).
c) a rede Host tem como objetivo isolar o container para comunicações externas. A rede não
recebe qualquer interface para comunicação externa. A única interface de rede IP será a
localhost. Essa rede, normalmente, é utilizada para containers que manipulam apenas
arquivos de backup, sem necessidade de enviá-los via rede para outro local.
73 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
d) a rede None tem como objetivo entregar para o container todas as interfaces existentes no
docker none. Isso agiliza a entrega dos pacotes, uma vez que não há host no caminho das
mensagens. Mas o uso de um host pode ser importante para a segurança e a gerência do
tráfego.
e) Bridge é a rede padrão para qualquer container iniciado no Docker, a menos que seja,
explicitamente, associada outra rede a ele. Os containers da rede default bridge podem
acessar uns aos outros somente através de seus endereços IP, a menos que se utilize a
opção --link
19. (FCC/TRT 19/2022) A fim de utilizar o Docker em sua organização, um Analista necessitou
conhecer os principais componentes dessa plataforma, tais como:
I. Software que roda na máquina onde o Docker está instalado. Recebe comandos do cliente
a partir de Command Line Interfaces ou API’s REST.
II. Mecanismo usado para criar imagens e containers.
III. Coleção de imagens hospedadas e rotuladas que juntas permitem a criação do sistema
de arquivos de um container. Pode ser público ou privado.
IV. Repositório usado para hospedar e baixar diversas imagens. Pode ser visto como uma
plataforma de Software as a Service (SaaS) de compartilhamento e gerenciamento de
imagens.
I- Na virtualização, cria-se uma nova camada de computação, na qual uma máquina virtual
permite a virtualização de toda a infraestrutura de TI (rede, servidores e storage) através de
um sistema operacional próprio (hipervisor).
II - Conteinerização (contêiner) é um processo de computação que utiliza uma pequena
fração do recurso de hardware para viabilizar a execução de aplicativos de forma mais
eficiente e isolada. No caso do contêiner, permite a virtualização de aplicativos de software,
utilizando o sistema operacional do host em um Kernel compartilhado.
III -As máquinas virtuais são medidas em megabyte. Elas contêm, no máximo, a aplicação e
os arquivos necessários para executá-la. Além disso, elas costumam ser utilizadas para
empacotar funções individuais que realizam tarefas específicas, os famosos microsserviços.
74 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Como são leves e possuem um sistema operacional compartilhado, as VMs são muito fáceis
de migrar entre vários ambientes.
IV -Os contêineres são medidos em gigabyte. Eles costumam ter seu próprio sistema
operacional, o que possibilita a execução simultânea de várias funções com uso intenso de
recursos. Por terem um número maior de recursos à disposição, contêineres são capazes de
abstrair, dividir, duplicar e emular por inteiro servidores, sistemas operacionais, desktops,
bancos de dados e redes.
a) I e ll.
b) II e III.
c) lII e IV.
d) I e III.
e) II e lV.
75 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
GABARITO
76 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
KUBERNETES
Introdução
Originalmente criado pela Google, Kubernetes , ou K8s, é um
sistema open-source de orquestração e escalamento de sistemas
compostos de contêineres. Atualmente, o Kubernetes é mantido
pela Cloud Native Computing Foundation (CNFC).
Antes de entrarmos em conceitos mais profundos, vamos ter uma visão geral da estrutura do
Kubernetes.
Estrutura Geral
O K8s, assim como o Docker, segue a arquitetura cliente-servidor, trabalhando com nodes, ou
nós, em conjunto – formando um cluster K8s. Aqui, trabalhamos com dois tipos de nós:
Dentro dos nós trabalhadores, onde os contêiners rodam, temos três componentes principais:
• kubelet: é o agente responsável por comunicar com o plano de controle (nó master), assim
como funcionam os daemons no Swarm. Ele que executa as instruções recebidas, e garante
que o nó esteja rodando de forma própria.
• kube-proxy: é uma rede de proxy rodando em cada nó, responsável por comunicação
dentro e fora do cluster
• Criador de contêineres: o Kubernetes, por si só, não cria os contêineres, precisando de
ferramentas externas (chamadas também de container runtime), como o Docker. Os
77 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Já o nó master (falo no singular, mas podemos ter vários nós master para maior disponibilidade),
onde todo o plano de controle roda, também tem alguns componentes importantes:
• kube-apiserver: ferramenta responsável por expor a Kubernetes API, responsável pela
comunicação com o cluster k8s. Ele age como uma espécie de front-end para o plano de
controle.
• etcd: um banco de dados distribuído, do tipo chave-valor, que armazena os dados
relacionados ao cluster.
• kube-scheduler: é o responsável por alocar os pods nos nós trabalhadores disponíveis,
levando em conta vários fatores, como recursos disponíveis, restrições, entre outros
• kube-controller-manager: o controlador do K8s é responsável pro observar um objeto e
garantir que o seu estado atual esteja de acordo com o especificado
Objetos
Objetos, no Kubernetes, são entidades persistentes no seu sistema. O K8s usa essas entidades
para representar o estado do cluster, descrevendo, dentre outros:
78 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Quase todos os objetos do Kubernetes possuem dois campos de objeto aninhados que governam
a sua configuração: os objetos spec e status. O spec irá definir as características que você quer
que o recurso tenha – seu estado desejado. Já o status irá descrever o estado atual do objeto,
atualizado constantemente pelos componentes do Kubernetes – e gerenciado pelo plano de
controle.
Abaixo, um exemplo de um deployment, que é um objeto que pode representar uma aplicação
rodando no cluster. Não se preocupe em entender tudo agora – até o final da aula você conseguirá
tranquilamente.
YAML
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
Esse arquivo YAML recebe o nome de manifesto. Por convenção, os manifestos são escritos em
YAML – mas nada impede que ele seja escrito em JSON. Aliás, o Kubernetes interpreta o
manifesto como um JSON, já que, se o arquivo estiver em YAML, será feita uma conversão
automática para JSON pelo kubectl .
Após criarmos o arquivo de manifesto, podemos criar o deployment com o comando kubectl
apply, passando o arquivo .yaml como um argumento. Por exemplo:
E pronto, temos o objeto persistido dentro do ecossistema do Kubernetes. Veja que “apply” é um
comando estranho para criar – e as bancas pegam justamente nesse detalhe. Olhe uma questão
da prova da Câmara dos Deputados.
79 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
A imagem Docker da aplicação web está hospedada em um repositório e pode ser acessada
através do nome ‘minhaapp/web:1.0’.
Com base nessas informações, assinale a opção que indica o comando e os argumentos
necessários para criar o pod no Kubernetes.
Comentários:
O comando para criarmos qualquer objeto dentro do Kubernetes a partir de um YAML é o apply
-f, onde o -f indica que devemos ler a definição do objeto antes de criá-lo, para saber do que se
trata (um serviço, pod, deployment, etc – veremos mais sobre durante a aula). Nesse sentido, o
gabarito correto é a letra C.
Um cuidado é com o comando run, que é usado no Docker para criarmos e rodarmos determinado
contêiner. (Gabarito: Letra C)
kubectl
O kubectl é a ferramenta de Interface de Linha de Comando (CLI) do Kubernetes, responsável
por comunicar os nós com o plano de comando, usando a API K8s. A sintaxe do kubectl é simples,
muito similar ao que vemos no Linux, e bem declarativa – e segue como padrão:
Onde:
80 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
• tipo – especifica o tipo de recurso que queremos. Os tipos de recurso são case-insensitive,
isso é, não diferenciam maiúsculas de minúsculas, e tmabém não diferenciam plural, singular
e formas abreviadas (por exemplo, pod, pods e po)
• nome – especifica o nome do recurso
• flags – especifica flags opcionais, para refinar o comando
Veremos vários comandos ao longo da aula, então não se preocupe em decorar os comandos
agora – apenas entender a estrutura da sintaxe. Alguns exemplos de comandos incluem:
81 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
nodes
Você já sabe o que é e quais são os nós, agora vamos para detalhes mais técnicos. Primeiramente,
como criar um nó. Os nós nada mais são que um objeto no K8s, e, para tanto, o criamos a partir
de um manifesto – nesse caso, o manifesto é especificamente feito em JSON, já que ainda não
temos o kubectl para converter o YAML em JSON.
JSON
{
"kind": "Node",
"apiVersion": "v1",
"metadata": {
"name": "[Link]",
"labels": {
"name": "meu-primeiro-node-k8s"
}}}
• Manualmente
• Por um registro automático, partindo do kubelet
82 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Caso queiramos a segunda opção (que é ativada, por padrão), devemos apontar a flag na criação
--register-node = true . Caso isso ocorra, o kubelet é iniciado com as seguintes opções:
A partir disso, podemos gerenciar nossos nós com o nosso kubectl. Vamos ver as principais
interações que podemos ter.
Comando Descrição
kubectl get node Lista todos os nós de um cluster
kubectl drain <nome> “Drena” o nó, movendo todos os pods para outros nós
83 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
De forma a diminuir os impactos da instabilidade, Rafaela optou por usar um comando que
bloqueia a criação de novos pods dentro desse nó. Assinale a alternativa que aponta o comando
usado por Rafaela.
Comentários:
Para deixarmos um nó com o status de não agendável, bloqueando a adição de novos pods a ele,
usamos o comando kubectl cordon <nome_do_nó>. Para retirarmos dessa situação, podemos usar
o comando kubectl uncordon <nome_do_nó>. Nesse sentido, para bloquearmos a adição, correta
a letra C. (Gabarito: Letra C)
Um ponto importante dos nós é o seu status. Para verificarmos se um nó está disponível,
funcionando corretamente e conforme o estado esperado, usamos uma notificação chamada de
heartbeat. Esse sinal é uma requisição HTTP que permite monitorar a performance dos cluster k8s.
Quem faz esse monitoramento é o node controller, que forma o nosso plano de controle. Dentre
suas funções, está justamente a de monitoramento da saúde dos nós. A sua responsabilidade é
de alterar o campo .status , de um estado ideal ready , para, caso haja algum problema, o
estado unknown ou false .
84 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Os pods críticos são baseados no nível de prioridade da sua classe. Quanto maior o valor do nível
de prioridade. Outra forma de fazer um desligamento gracioso é através da drenagem de um nó,
definida pelo comando CLI:
Coleta de Lixo
Coleta de Lixo é o nome dado ao conjunto de ferramentas e mecanismos que o Kubernetes usa
para limpar os recursos de um cluster. Isso permite a limpeza de recursos como:
• Pods encerrados
• Trabalhos completados
• Objetos sem referências
• Imagens e contêineres sem uso
• Entre outros
85 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Podemos ter também uma política específica para a deleção de contêineres não usados, que
ignorará as referências. Ela considerará três variáveis principais:
Parece um detalhe bobo – mas preste bastante atenção no min/max, já que as bancas costumam
brincar com isso. Veja:
a) F – V – V.
b) F – F – V.
86 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
c) V – V – V.
d) V – F – F.
e) V – V – F.
Comentários:
87 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Pods
Vamos falar agora sobre os elementos mais importantes do Kubernetes – as diferentes cargas de
trabalho, ou workloads. Essas cargas de trabalho podem ser aplicativos, serviços, tarefas ou
processos que são executados em contêineres dentro do ambiente Kubernetes. Kubernetes
oferece vários tipos de workloads para lidar com diferentes necessidades de implantação e
escalonamento de aplicativos.
Pods
Menor objeto Objeto mais fundamental
Antes mesmo de eu te explicar o restante, decore o que eu passei acima: os pods são as menores
e mais fundamentais unidades do Kubernetes. Veja o porquê de decorar isso:
(IBFC/TJ MG/2022) A menor unidade de computação implantável que se pode criar e gerenciar
no Kubernetes são denominados tecnicamente como sendo:
a) bean
b) shell
c) kernel
d) pod
e) hem
Tem outra...
88 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
a) statefulSet.
b) replicaSet.
c) service.
d) ingress.
e) pod.
Não preciso nem dizer qual é o gabarito dessas questões acima – e de muitas outras que cobram
a mesma coisa, né? Obviamente que são os pods!
E bom, temos sim – mas o K8s tem uma abordagem um pouco diferente. Ao invés de rodar o
contêiner diretamente no nó, o Kubernetes “embrulha” o conjunto de contêineres que você
precisa num cápsula, chamada de pod.
Um pod, usualmente, roda um único contêiner – mas nada impede que tenhamos vários
contêineres dentro dele. O importante é saber que todos os contêineres dentro de um mesmo
pod rodaram num mesmo nó, compartilhando a rede, armazenamento e recursos.
Outra característica do pod é que, uma vez que ele entra em atividade, ele é imutável. Uma vez
criados, seus detalhes fundamentais, como endereço de IP, identificação (nome) e especificação,
não podem ser alterados. É necessário criar um novo pod com as alterações desejadas. Detalhe –
isso não impede a alteração das imagens internas (que criam os contêineres), apenas as
especificações do pod em si.
• Confiabilidade: Ao substituir um pod antigo por um novo, você garante que o novo pod
inicie em um estado conhecido e previsível, evitando problemas causados por mudanças
não planejadas.
• Simplicidade: A imutabilidade simplifica o gerenciamento de aplicativos, pois você não
precisa se preocupar com alterações inesperadas no estado dos pods existentes.
89 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
• Reversibilidade: Se algo der errado com o novo pod, você pode simplesmente encerrá-lo e
o pod antigo continuará funcionando, minimizando o impacto de problemas durante as
atualizações.
Esse é um exemplo simples e reduzido de um manifesto YAML para criar um pod. Vamos explorar
os parâmetros que podemos definir, de forma aninhada (ou seja, atendendo à hierarquia do
YAML), para que você saiba responder todas as questões que podem cair sobre isso. Lembrando
que, o que garante a hierarquização em um YAML é a endentação – não vá me esquecer isso na
hora da prova!
90 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Leia cada linha dessa lista acima, procurando entender tudo. Essa é a estrutura base de um YAML
para um pod – dificilmente teremos um campo a mais em questões que não vimos aí. E se vierem,
são bem literais, não é difícil de entender.
Ciclo de vida do pod
O pod possui um ciclo de vida bem definido e delimitado, passando por algumas fases até concluir
o seu objetivo. Assim como os contêineres, a vida de um pod é considerada efêmera – ao contrário
de durável. As suas fases envolvem:
• pending (pendente) – o pod foi aceita no cluster, mas um ou mais contêineres ainda não
estão preparados para rodar. Essa fase inclui o tempo que o pod aguarda para ser alocado,
assim como o tempo para carregar as imagens.
• running (rodando) – o pod foi alocado a um nó, e todos os contêineres foram criados – e
pelo menos um está funcionando.
• succeeded (sucedido) – todos os contêineres do pod foram terminados com sucesso e não
serão reiniciados
• failed (falha) – todos os contêineres do pod foram terminados, e pelo menos um terminou
com falha (status diferente de 0)
• unkown (desconhecido) – por alguma razão, não foi possível obter o estado do pod
É possível, também, que alguns comandos do kubectl indiquem que o pod está numa fase de
terminação, ou terminating .
Cuidado para não confundir com os estados (status) dos contêineres. Ou seja, aqui estamos indo
nos componentes particulares do pod. Podemos ter três estados:
• Running (rodando) – indica que o contêiner está sendo executado sem problemas
• Terminated (terminado) – indica que, ou o contêiner completou seu objetivo, ou encontrou
alguma falha no processo
• Waiting (esperando) – caso residual, ou seja, o contêiner não está nem rodando, nem foi
terminado. Usualmente ele está rodando operações para completar a inicialização.
91 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Podemos definir alguns hooks (ganchos) no manifesto de um pod para executar ações específicas
em determinados estágios do ciclo de vida do pod. Esses ganchos permitem que você execute
comandos personalizados antes ou depois de certas etapas, como antes do pod ser criado ou
depois que ele for removido.
• PrePull: executado antes de um contêiner ser puxado (pull) do registro de contêiner. Ele
pode ser usado para realizar verificações ou configurações adicionais antes que o contêiner
seja puxado para o nó.
• PreStart: executado antes de um contêiner ser iniciado, mas após o volume ser montado.
Pode ser usado para configurar o ambiente do contêiner, como a configuração de arquivos
de configuração ou a realização de verificações de integridade.
• PostStart: executado imediatamente após um contêiner ser iniciado. É útil para realizar
inicializações específicas, como a execução de scripts de configuração ou a configuração
de variáveis de ambiente.
• PreStop: executado antes de um contêiner ser encerrado. Pode ser usado para realizar
ações de limpeza ou para se preparar para o encerramento, como salvar dados ou notificar
outros componentes.
• PostStop: executado após um contêiner ser encerrado. Ele é útil para realizar ações de
limpeza ou para finalizar qualquer processo pendente após o contêiner ser encerrado.
LIFECYCLE HOOKS
PRE PULL PRE START POST START PRE STOP POST STOP
Contêineres
O que são contêineres e suas propriedades você já viu – até porque o Kubernetes exige um
container runtime, como o Docker, para funcionar, já que ele não gera os contêineres. O ponto
aqui é focar em alguns tipos de contêineres específicos. A saber:
• Init Containers: São contêineres que são executados antes do contêiner principal em um
pod. Eles são usados para realizar tarefas de inicialização, como preparar o ambiente, baixar
arquivos de configuração ou inicializar bancos de dados, antes que o contêiner principal
seja iniciado. Os contêineres Init são úteis para garantir que certas condições estejam em
vigor antes que o contêiner principal comece a ser executado.
92 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
• Ephemeral Containers: São contêineres temporários que podem ser adicionados a um pod
em execução, sem precisar modificar o manifesto do pod. Eles são úteis para depuração,
coleta de logs ou execução de tarefas ad hoc dentro do mesmo contexto de rede e recursos
do pod. Os contêineres efêmeros são úteis para operações pontuais que não justificam a
criação de um novo pod.
• Sidecar Containers: São contêineres que oferecem funcionalidades auxiliares para o
contêiner principal em um pod, como logging, monitoramento, proxy, ou até mesmo
funcionalidades de segurança. Eles compartilham o mesmo ciclo de vida e recursos do
contêiner principal e são usados para estender ou complementar a funcionalidade do
contêiner principal de uma maneira modular e desacoplada.
Essa métrica de QoS é importante para a evicção dos pods, principalmente quando ela se dá
devido ao excesso de consumo dos recursos. Temos 3 classes de QoS:
• Guaranteed (garantida): Os pods nesta classe têm requisitos de recursos especificados para
CPU e memória. Eles recebem a mais alta prioridade de QoS e são garantidos para ter seus
recursos sempre disponíveis. Se os recursos não estiverem disponíveis, o Kubernetes não
programará mais pods nesse nó.
• Burstable (expansível): Os pods nesta classe têm requisitos mínimos de recursos, mas
também podem usar recursos adicionais se estiverem disponíveis. Eles têm uma prioridade
intermediária de QoS e são adequados para cargas de trabalho que podem precisar de
mais recursos em momentos de pico, mas podem operar com menos recursos em
momentos normais.
• BestEffort (Melhor Esforço): Os pods nesta classe não têm requisitos de recursos
especificados. Eles recebem a menor prioridade de QoS e podem usar qualquer recurso
disponível no nó. Esses pods são adequados para cargas de trabalho não críticas ou que
podem se adaptar facilmente a variações na disponibilidade de recursos.
QOS
GUARANTEED BURSTABLE BEST EFFORT
93 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
94 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Gerenciadores de Workload
De forma geral, o Kubernetes roda as aplicações dentro de pods, que comporta os contêineres.
Porém, gerenciar cada pod pode ser uma tarefa difícil e trabalhosa – vai que um pod falha e você
não está disponível para acompanhar?
Nesse contexto, entram em trabalho os gerenciadores de carga de trabalho. Eles visam facilitar o
trabalho de coordenar múltiplos pods e automatizar o processo.
Deployments
Pode ser que eu não queria criar pod por pod – para isso, usamos o deployment. Um Deployment
no Kubernetes é um recurso usado para gerenciar a implantação de aplicações em contêineres de
forma declarativa.
95 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
YAML
apiVersion: apps/v1
kind: Deployment
metadata:
name: meu-deployment
labels:
app: minha-aplicacao
spec:
replicas: 3
selector:
matchLabels:
app: minha-aplicacao
template:
metadata:
labels:
app: minha-aplicacao
spec:
containers:
- name: meu-container
image: minha-imagem:tag
ports:
- containerPort: 80
restartPolicy: Always
Veja que a estrutura é quase idêntica à do YAML para os pods. Porém, aqui temos algumas
diferenças notáveis. Vamos “dissecar” essa estrutura – sempre prestando atenção na endentação
e hierarquia.
Vamos ver como isso já foi cobrado? Aqui, uma questão discursiva na SEF MG!
96 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Apresente um trecho de código que pode ser inserido no exemplo acima que define o número de
réplicas para 3. Use a numeração de linhas original da coluna da esquerda como referência para
indicar claramente onde o código deve ser inserido.
Apresente um trecho de código que pode ser inserido no exemplo acima que define o limite do
consumo de CPU para 250m e o consumo de memória para 250Mi para cada réplica. Use a
numeração de linhas original da coluna da esquerda como referência para indicar claramente onde
o código deve ser inserido.
Apresente um trecho de código que pode ser inserido no exemplo acima que libere as portas
HTTP e HTTPS para o servidor web. Use a numeração de linhas original da coluna da esquerda
como referência para indicar claramente onde o código deve ser inserido.
Comentários:
Aluno, essa questão foi uma verdadeira pedrada na cara do aluno. Extremamente difícil -mas é
pra isso que eu tô aqui, pra simplificar as coisas na sua vida. Não vou elaborar uma redação
completa, mas vamos responder todos os 3 itens.
a)
97 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Queremos definir o número de réplicas, igual a 3. Primeiro passo é saber o comando e onde vamos
colocá-lo. O comando é simples, replicas: 3. Como se trata de uma definição do deployment,
colocamos ele dentro do primeiro spec, que aborda as configurações dele. Lembrando sempre da
endentação, já que ela garante a hierarquia do YAML.
YAML
1 apiVersion: apps/v1
2 kind: Deployment
3 metadata:
4 name: nginx-deploy
5 spec:
6 replicas: 3
7 selector:
8 matchLabels:
9 app: nginx
10 template:
11 metadata:
12 labels:
13 app: nginx
14 spec:
15 containers:
16 name: nginx
17 image: nginx:1.16
b)
O limite de consumo de um contêiner é definida na sua especificação – lá no final, após a linha 15.
Para isso, precisamos abrir uma tag nova: resources. Dentro dela, como a questão só quer um
limite máximo, não quer um pedido mínimo, iremos definir somente isso. O código fica assim:
YAML
...
14 spec:
15 containers:
16 name: nginx
17 image: nginx:1.16
18 resources:
19 limits:
20 memory: 250Mi
21 cpu: 250m
98 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
c)
Por fim, essa última alternativa exigia um nível muito alto pois, além de definirmos a estrutura do
YAML, precisávamos lembrar que a porta para o HTTP é a 80, e para o HTTPS é a 443. Essas portas
devem ser abertas dentro do contêiner, e podem ser abertas após o código que acabamos de
inserir. Nosso código, ao fim, ficará assim:
YAML
1 apiVersion: apps/v1
2 kind: Deployment
3 metadata:
4 name: nginx-deploy
5 spec:
6 replicas: 3 #letra a
7 selector:
8 matchLabels:
9 app: nginx
10 template:
11 metadata:
12 labels:
13 app: nginx
14 spec:
15 containers:
16 name: nginx
17 image: nginx:1.16
18 resources: #letra b
19 limits:
20 memory: 250Mi
21 cpu: 250m
22 ports: #letra c
23 - containerPort: 80
24 - containerPort: 443
Um detalhe importante – sempre que formos numerar listas, como fizemos agora nas portas, que
irão gerar chaves (do par chave:valor) repetidas, devemos inicializar cada item com um hífen.
99 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Sets
Os sets são objetos controladores do Kubernetes que ajudam a gerenciar os pods, cada um com
um objetivo específico. Vamos ver cada um deles.
ReplicaSet
O ReplicaSet tem como objetivo manter um número específico de réplicas dos pods esteja
rodando a qualquer momento. Isso objetiva garantir a disponibilidade dos serviços no K8s.
As definições de um ReplicaSet, assim como a maioria dos objetos que vimos até agora, é feita
através de um manifesto. Dentro dele, temos seletores que definem quais pods devem ser
mantidos e quantas réplicas de cada.
StatefulSet
Os StatefulSet são as APIs de carga de trabalho para gerenciar aplicações que requerem uma
atribuição de estado – chamadas de stateful. Dessa forma, eles gerenciam um grupo de pods que
compartilham alguma especificação e exijam um armazenamento persistente (para armazenar os
estados).
DaemonSet
O DaemonSet garante que todos, ou um determinado subconjunto, os nós rodem uma cópia de
determinado pod. Conforme novos nós são adicionados ao cluster, o DaemonSet garante que
esse nó terá ao menos uma unidade de determinado pod.
Um cuidado que temos que ter é que, ao deletarmos um DaemonSet, deletamos todos os pods
criados por ele. Por isso, em alguns comandos de deleção usamos a diretiva --ignore-
daemonsets , para ignorar os pods criados pelo Daemon.
100 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
SET DESCRIÇÃO
Garante que determinado número mínimo de pods estará disponível, a
ReplicaSet
todo momento
Para que o KCluster apresente uma cópia do LogPod em cada nó elegível, de forma automática,
Ana deve implantar o LogPod utilizando o recurso do Kubernetes:
a) ReplicationController;
b) ReplicaSet;
c) StatefulSet;
d) DaemonSet;
e) EndpointSlice.
Comentários:
101 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Como acabamos de ver, o set responsável por garantir que tenhamos pelo menos uma cópia de
determinado pod em cada nó elegível é o DaemonSet. (Gabarito: Letra D)
Um YAML configura os jobs também, para variar rs... abaixo, deixo um exemplo de um job que irá
computar o número pi para 2000 casas após da vírgula, e printar.
YAML
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl:5.34.0
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4 #quantas vezes irá executar após a falha
Podemos definir algumas políticas de limpeza para nossas tarefas, ou jobs, finalizadas. As tarefas
são processos de curta duração, que são completadas após apontar o êxito na sua execução.
Usualmente, são trabalhos que não precisam ser aplicados continuamente, e sim de forma
periódica ou única.
É uma prática recomendada que os trabalhos sejam mantidos por um pouco mais de tempo após
serem finalizados, dentro da API, de forma que possamos dizer se o trabalho foi completado ou
falhou.
Para isso, especificamos um TTL – Time To Live – à tarefa a partir da especificação do campo
.[Link] . Com isso, podemos definir um tempo que a tarefa irá ter de
sobrevida, contado a partir do tempo que o trabalho aponta como status o complete ou
failed.
102 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Quando é necessário agendar um trabalho, usamos os Cronjobs. Para isso, adicionamos uma tag
schedule: “* * * * *” no YAML. Os valores devem ser preenchidos, respectivamente:
DIA DO DIA DA
MINUTO HORA MÊS
MÊS SEMANA
0-59 0-23 1-31 1-12 0-6
Por exemplo:
0 0 13 * 5
Executaremos o trabalho toda meia-noite de sexta-feira, além de todo dia 13. O asterisco indica
todos. É uma estrutura muito similar aos cronjobs do Linux. Existem também alguns macros que
executam a os Cronjobs de forma mais “legível”.
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "* * * * *"
jobTemplate:
spec:
template:
103 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
spec:
containers:
– name: hello
image: busybox:1.28
imagePullPolicy: IfNotPresent
command:
– /bin/sh
– -c
– date; echo Hello
restartPolicy: OnFailure
a) a cada minuto.
b) uma vez por dia, às 01:28 horas.
c) uma vez por mês.
d) apenas quando ocorre uma falha no cluster.
e) apenas uma vez, dentro da data retornada pelo comando date do sistema operacional.
Comentários:
Como o asterisco indica a presença de todos, iremos executar todos os minutos, todas as horas,
todos os dias da semana, todos os meses e todos os dia do mês – ou seja, iremos executar a tarefa
a cada minuto. (Gabarito: Letra A)
Rede
Cada pod dentro de um cluster tem seu IP único, válido única e exclusivamente dentro do
ambiente desse próprio cluster. Isso significa que não precisamos criar links entre os pods e quase
nunca precisaremos mapear as portas dos contêineres ao host.
Dessa forma, temos uma organização limpa e clara, de forma a tratar os pods quase como
máquinas virtuais ou a própria máquina física, da perspectiva de alocação de portas, nomeação,
descoberta de serviços, balanceamento de carga, entre outros.
Existem duas imposições fundamentais que o K8s faz para todas as implementações de redes:
• Pods podem comunicar-se com todos os outros pods, em qualquer outro nó, sem
ferramentas de NAT
104 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
• Agentes do nó (como daemon, kubelete) podem comunicar-se com todos os nós daquele
determinado nó
Temos alguma APIs que fornecem funcionalidades e soluções na rede, vamos estudá-las.
Serviço
No Kubernetes, serviço (service) é um método de expor uma aplicação de rede que está rodando
em um ou mais pods no cluster. O objetivo é que você não precise modificar a aplicação para usar
um serviço de descoberto desconhecido.
A aplicação é alocada em um pod, independentemente de ter sido desenvolvida para a nuvem,
para uso local, ou em um ecossistema mais antigo, e o Service irá fazer com que o conjunto de
pods que rode sua aplicação esteja disponível para os clientes externos interagirem.
Para definir um serviço, assim como todo objeto no Kubernetes, temos um YAML.
YAML
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
[Link]/name: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
105 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Dessa forma, quando recebermos uma solicitação externa, uma chamada HTTP por exemplo, na
porta 80, ela será redirecionada para o MyApp, o conjunto de pods que representa o aplicativo
selecionado no selector.
Podemos, também, fazer uma “referência cruzada”, definindo um nome para determinada porta,
e, ao criarmos o serviço, atribuímos esse nome, ao invés do número.
TIPOS DE SERVICE
Cluster IP Node Port Load Balancer External Name
Em alguns casos, não é necessário nem balanceamento de carga, nem endereço de IP. Nesses
casos, usamos os headless services, atribuindo o valor none ao endereço de IP do cluster.
106 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Ingress
O Ingress (ingresso, numa tradução direta) é um objeto API que gerencia acessos externos a um
serviço num cluster. Eles fornecem balanceamento de carga, tunelamento seguro (SSL/TLS),
hosting virtual, entre outros.
De forma geral, o ingress é uma porta de entrada, que recebe as requisições HTTP externas ao
cluster e, através de regras de roteamento, direciona essa requisição para serviços, que, por si,
direcionam aos pods. Na imagem abaixo ficará mais fácil de entender.
Para implementar o ingress, é mandatório que tenhamos um ingress controller. Apenas criar os
recursos (YAML) do ingress não são suficientes. Usualmente, usamos os ingress fornecidos pela
Nginx, como o ingress-nginx.
• Ingress suportado por um unico service: Nesse tipo de configuração, o Ingress direciona
todo o tráfego para um único Service no cluster. É útil quando você deseja expor um único
serviço para o mundo externo.
107 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
• Simple Fanout: Nesse tipo de configuração, o Ingress direciona o tráfego para diferentes
Services com base no caminho da URL. Por exemplo, você pode ter um Service para /app1
e outro Service para /app2, e o Ingress roteará o tráfego com base no caminho da URL.
• Hospedagem virtual baseada em nome: Nesse tipo de configuração, o Ingress direciona o
tráfego com base no nome do host na solicitação. Por exemplo, você pode ter um Service
para [Link] e outro Service para [Link], e o Ingress roteará o
tráfego com base no nome do host na solicitação.
• TLS: O TLS (Transport Layer Security) é usado para criptografar o tráfego entre o cliente e
o [Link] Kubernetes, o Ingress pode ser configurado para suportar TLS, o que permite
que você exponha serviços de forma segura pela Internet.
• Load Balancing: O Ingress pode ser usado para distribuir o tráfego entre diferentes pods
de um mesmo Service. Isso é feito de forma transparente pelo Ingress, que pode usar
algoritmos de balanceamento de carga, como round-robin, para distribuir o tráfego de
forma equilibrada entre os pods.
• Round Robin (RR): O algoritmo distribui o tráfego de forma equitativa entre os pods, de
forma sequencial. Cada nova solicitação é enviada para o próximo pod na lista de pods
disponíveis. É simples e eficaz, mas pode não ser ideal para cargas de trabalho
desbalanceadas.
• Least Connections (LC): Ele direciona o tráfego para o pod com o menor número de
conexões ativas no momento. Isso ajuda a distribuir a carga de forma mais equilibrada entre
os pods, especialmente em situações onde alguns pods podem ter mais conexões abertas
que outros.
• IP Hash: O IP Hash usa o endereço IP do cliente para determinar para qual pod enviar o
tráfego. Isso garante que solicitações do mesmo cliente sejam sempre direcionadas para o
mesmo pod, o que pode ser útil para manter o estado da sessão em aplicações que exigem
isso.
• Weighted Round Robin (WRR): É semelhante ao Round Robin, mas permite atribuir pesos
diferentes a cada pod. Pods com pesos mais altos recebem uma proporção maior de
tráfego, o que pode ser útil para lidar com cargas de trabalho desiguais.
• Random (RAND): O Random seleciona aleatoriamente um pod para receber o tráfego.
Embora simples, pode não ser ideal para cargas de trabalho onde a distribuição uniforme
de tráfego é importante.
108 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
b) ponderado fixo.
c) round robin ponderado.
d) round robin.
e) resposta ponderada.
Comentários:
Galera, existem diversos tipos de balanceamento. Nesse caso, estamos dimensionando a alocação
de acordo com o tempo de resposta, atribuindo um peso adicional para balanceamento
adequado. Nesse sentido, o método é chamado de resposta ponderada. (Gabarito: Letra E)
Endpoints
Em Kubernetes, os endpoints são objetos que representam um conjunto de IPs de pods que
realizam uma determinada tarefa. Eles são usados principalmente em conjunto com Services para
direcionar o tráfego de rede para os pods corretos.
Quando você cria um Service no Kubernetes, ele cria automaticamente um conjunto de endpoints
que correspondem aos pods selecionados pelo Service. Cada endpoint contém o IP e a porta de
um pod, permitindo que o Service direcione o tráfego para esses pods.
Nesse contexto, temos o EndpointSlice, uma API que referencia um conjunto de endpoints da
rede. O plano de controle automaticamente cria essa API para qualquer serviço que tenha algum
seletor especificado. Por padrão, cada Slice controla até 100 endpoints, podendo ser configurado
para chegar a um máximo de 1.000 endpoints.
Como comentei pouco antes a vocês, a efemeridade dos pods é um problema quando temos
dependências, já que constantemente temos mudanças de endereços, ao extinguir e criar um novo
pod. O EndpointSlice entra com o objetivo de fazer esse mapeamento dinâmico.
Alocação de Pods
Kubernetes Scheduler
No contexto do Kubernetes, scheduling ou agendar, significa assegurar que os pods estão
alocados no nó correto, para que o kubelet consiga rodar neles. Um gerenciador de
agendamento – chamado de kube-scheduler – observa novos pods criados que não possuem um
nó designado, se tornando responsável por encontrar o nó mais adequado a esse pod. Quanto
109 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
aos nós, aqueles que se adequam ao pod são chamados de feaseble, algo como “viável”, ou
“possível”.
• Filtragem – os passos de filtragem focam em encontrar os nós que são compatíveis com o
pod, aplicando uma série de filtros. Por exemplo, o filtro PodFitsResources checa se o
nó tem os recursos necessários para armazenar o pod.
• Pontuação – com os nós compatíveis separados, é feita uma classificação para encontrar o
mais compatível dentre eles. Uma pontuação é atribuída a cada um deles, e o com a maior
pontuação é escolhido.
Alocação de pods
Podemos restringir um pod a um nó específico, ou definir preferências para ele rodar em um
conjunto de nós. A abordagem mais recomendada é pelo uso de seletores de etiquetas (label
selectors). Porém, podem ter vezes que necessitamos de um refinamento ainda maior – por
exemplo, escolher nós que possuam SSD assignado, que permitam acesso externo, entre outros.
Nesses casos, temos quatro abordagens:
• nodeSelector
• Afinidade
• nodeName
• Restrições de topologia dos pods
ALOCAÇÃO DE PODS
110 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
NodeSelector
O nodeSelector é a forma mais simples de seleção de restrições. Adicionamos a tag no
documento YAML de especificação do pod e especificamos as etiquetas de nós que queremos
que recebam esses nós. Nesse caso, o scheduler irá analisar somente esses nós delimitados para
definir a alocação dos pods.
Afinidade
A afinidade expande as possíveis restrições do seletor de nós, fornecendo uma linguagem mais
expressiva e com mais controle sobre a lógica de seleção.
Por exemplo, podemos identificar determinada regra como secundária, usando a tag soft, ou
como primária, com a tag preferred. Dessa forma, podemos o scheduller encontrará um nó mesmo
que não tenha encontrado um 100% compatível.
A afinidade, ou node affinity, serve para delimitarmos nós que queremos a alocação, de acordo
com alguns parâmetros. Temos dois tipos de afinidade:
111 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
YAML
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: [Link]/zone
operator: In
values:
- antarctica-east1
- antarctica-west1
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: another-node-label-key
operator: In
values:
- another-node-label-value
Podemos também definir um peso, entre 1 e 100, para cada instância do preferred. Quando o
scheduler encontrar afinidades, ele irá iterar por cada uma dessas preferências, atribuindo os
pesos e as classificando.
112 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Um dos pré-requisitos do projeto é isolar os pods dos alunos em um pool de nodes exclusivo em
alta disponibilidade.
a) Ingress.
b) Node affinity.
c) Limit Ranges.
d) Pod Overhead.
e) Node-pressure Eviction.
Comentários:
Temos uma situação de alocação de nodes. A questão fica fácil já que o único mecanismo de
alocação nas alternativas é o node affinity. Porém, vamos entender o que acontece.
Sempre que um aluno faz o log-in, temos a criação de um pod específico para lidar com essa
sessão do aluno. Precisamos designar esse nó para algum nó que forneça características de
segurança e autenticação, como o uso de um ingress, por exemplo. Isso pode ser feito de diversas
formas – sendo a mais adequada a afinidade. Aqui, caso não encontremos uma compatibilidade
100% com o que queremos, conseguimos definir casos residuais que permitirão o pod a ser
alocado em algum nó. (Gabarito: Letra B)
nodeName
O nodeName é uma forma mais direta de seleção de nõs no seletor. Aqui, basicamente definimos
o nome do nó e o pod é alocado a ele. Se o nó não existir, o pod não irá rodar e, em alguns casos,
pode ser deletado automaticamente.
Essas restrições permitem que você defina regras sobre como os pods de uma aplicação devem
ser distribuídos em relação a fatores como zonas de disponibilidade, hosts ou regiões do cluster.
113 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Por exemplo, você pode especificar que os pods devem ser distribuídos de forma que não mais
de um determinado número deles seja colocado em um único nó ou em uma única zona de
disponibilidade.
Isso ajuda a evitar a concentração de pods em um único ponto de falha e melhora a disponibilidade
da aplicação, distribuindo os pods de forma mais equilibrada e resiliente em relação à topologia
do cluster.
Pod Overhead
Em tecnologia da informação, o termo overhead se refere aos custos adicionais ou recursos
consumidos além do mínimo necessário para realizar uma determinada tarefa. Esse termo é
frequentemente usado para descrever a quantidade de recursos, como tempo, memória, largura
de banda ou processamento, que são utilizados para suportar uma operação ou processo, mas
que não estão diretamente relacionados à sua função principal.
Por exemplo, em virtualização, o overhead se refere aos recursos extras necessários para gerenciar
e executar as máquinas virtuais, como a camada de virtualização e a gestão dos recursos
compartilhados. Em redes de computadores, overhead pode se referir à quantidade de dados
adicionais necessários para encapsular e transmitir os dados úteis, como os cabeçalhos de pacotes
em protocolos de rede.
Nesse sentido, temos o pod overhead. Quando rodamos um pod em um nó, esse pod consome
uma determinada quantidade de recursos. Esses recursos são adicionados aos recursos
necessários para rodar os contêineres dentro do pod. Então, digamos que o contêiner consuma
250mb de memória, e o pod mais 50mb – o overhead são esses 50mb a mais para rodar a
infraestrutura do pod.
Podemos controlar esses parâmetros a partir de uma classe chamada RuntimeClass e, dentro
dela, definindo o campo overhead . As workloads que forem criadas especificando a
determinada classe irão levar esse overhead em conta para calcular as dinâmicas de carga.
Veja um exemplo:
114 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
YAML
apiVersion: [Link]/v1
kind: RuntimeClass
metadata:
name: kata-fc
handler: kata-fc
overhead:
podFixed:
memory: "120Mi"
cpu: "250m"
Quando formos criar um pod, por exemplo, referenciaremos dentro das spec , o campo referente
à classe, como runtimeClassName: kata-fc . ==284e2d==
Prioridade e Perempção
Cada pod pode ter sua prioridade. A prioridade indica a importância de determinado pod em
relação a outros. Se determinado pod não é agendado, o scheduler tenta fazer a perempção (ou
evicção) dos pods com menor prioridade, para fazer o agendamento daqueles com maior
prioridade possível.
Para fazer uso desse mecanismo, usamos o uso das classes de prioridade, e, posteriormente,
adicionamos elas na tag priorityClassName dentro do template do pod.
YAML
apiVersion: [Link]/v1
kind: PriorityClass
metadata:
name: high-priority
value: 1000000
globalDefault: false
115 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
o kubelet termina proativamente alguns dos pods. Podemos definir sinais e limites para a
evicção ocorrer.
• --eviction-hard : Esta flag define a política de remoção de pods com base em limites
rígidos. Quando ocorre pressão no nó, os pods que excedem os limites definidos por essa
flag podem ser removidos.
• --eviction-soft : Esta flag define a política de remoção de pods com base em limites
suaves. Durante um período de graça especificado, os pods podem exceder os limites sem
serem removidos imediatamente, permitindo que o nó se recupere antes de tomar medidas
mais drásticas.
• --maximum-dead-containers: Esta flag define o número máximo de containers mortos que
são tolerados antes que um pod seja removido. Se um pod atingir ou exceder esse limite,
ele será marcado para remoção.
YAML
apiVersion: [Link]/v1beta1
kind: KubeletConfiguration
evictionHard:
[Link]: "500Mi"
[Link]: "1Gi"
[Link]: "100Gi"
evictionMinimumReclaim:
[Link]: "0Mi"
[Link]: "500Mi"
[Link]: "2Gi"
116 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
117 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
RESUMO
O QUE É O KUBERNETES?
O Kubernetes é uma plataforma de código aberto para automatização,
escalonamento e gerenciamento de aplicativos em contêineres, fazendo a
orquestração dos contêineres.
O QUE É UM POD?
Um "pod" é a menor unidade no Kubernetes que pode ser criada, programada e
gerenciada. Um pod geralmente contém um ou mais contêineres que são
executados juntos, compartilhando o mesmo contexto, recursos e rede.
118 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
119 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
QUESTÕES COMENTADAS
Comentários:
Gabarito: Letra C
02. (FCC/MPE PB/2023) Considere que a equipe de TI do Ministério Público utiliza o Kubernetes
como ferramenta de controle de clusters e neste ambiente também encontra-se o Kubectl, uma
ferramenta de linha de comando para gerenciar objetos e clusters Kubernetes, instalados e
120 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Comentários:
Gabarito: Letra E
121 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Comentários:
Os serviços, no Kubernetes, são formas de expor aplicações para os serviços de rede, manuseando
as mudanças de endereço IP e a criação/extinção dos contêineres. Nesse sentido, correto o
apontamento da letra C.
Gabarito: Letra C
Comentários:
1. Certo! O plano de controle gerencia toda a parte de controle do Kubernetes, a partir dos
nós master.
2. Certo! O etcd é, de fato, o repositório de dados do Kubernetes no padrão chave-valor.
3. Errado! O servidor de APIs do Kubernetes é o kube-apiserver.
Gabarito: Letra B
122 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Comentários:
a) Errado. O Kubernetes, de fato, recomendo o uso de RBAC. Porém, o acesso não é liberado
a todos os usuários, nem a todos os serviços.
b) Errado. Não é recomendado o uso de autoassinatura.
c) Errado. O etcd armazena os arquivos YAML para as configurações de cluster, por ser um
banco de dados chave-valor. Porém, ele é um sistema distribuído, e a recomendação é que
se use sistemas centralizados para armazenamento de ferramentas de segurança.
d) Certo. Todas essas práticas são recomendadas pelo Kubernetes.
e) Errado. O ideal é usar redes criptografadas, sempre que possível.
Gabarito: Letra D
a) namespace.
b) metadata.
c) status.
d) desired.
e) spec.
123 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Comentários:
Gabarito: Letra E
Assinale a opção que apresenta a plataforma de entrega na nuvem para atender a essa demanda.
a) Big Query.
b) Azure Cosmos DB.
c) Azure Kubernetes.
d) Amazon Simple Storage Service.
e) Amazon Quantum Solutions Lab.
Comentários:
Apesar de ser uma questão sobre AWS, o conceito não é novo para vocês. Quando estamos
trabalhando com imagens, estamos operacionalizando contêineres. No ecossistema da AWS,
quem faz isso é o Azure Kubernetes – que nada mais é do que uma implantação do Kubernetes
na nuvem.
Gabarito: Letra C
Nowadays, firewalls are way more sophisticated than they used to be. They are now capable of
inspecting the application-level protocols and are often not only deployed at the forefront of the
infrastructure but also between each component, to monitor and limit unauthorized accesses.
For the same reason, some container orchestrator tools (such as ....I.... , but also the public cloud
providers) offer the possibility to implement the so-called network policies, which are essentially
....II.... acting as a network firewall, hence not allowing (or dropping) unwanted network
connections. Firewalls can be hardware appliances (with major vendors including Cisco and Check
Point, among others), or even software distributions (such as PFSense and Zeroshell).
(Adaptado de: BONOCORE, Giuseppe. Hands-On Software Architecture with Java. Packt Publishing, 2022)
124 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Comentários:
Gabarito: Letra A
Assinale
Comentários:
125 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
I. Certo. Definimos, dentro da diretiva resources, recursos mínimos solicitados (request) e limites
máximos (limit).
II. Certo. Vide item I.
III. Errado. Pelo contrário, quanto maior o contêiner, maior as vulnerabilidades potenciais.
Devemos tentar sempre manter o contêiner com o menor tamanho possível.
Gabarito: Letra B
10. (FCC/TRT 22/2022) No Kubernetes, os contêineres gerenciados pelo kubelet podem usar a
estrutura de hook do ciclo de vida do contêiner para executar código acionado por eventos
durante o gerenciamento de seu ciclo de vida. Há dois tipos de hooks:
I. Este hook é executado imediatamente após um contêiner ser criado. Mas não há garantia de
que o hook será executado antes do ENTRYPOINT do contêiner. Nenhum parâmetro é passado
para o handler.
II. Esse hook é chamado imediatamente antes de um contêiner ser terminated devido a uma
solicitação de API ou um gerenciamento de evento como liveness/startup probe failure,
preemption, resource contention e outros. Uma chamada a este hook falha se o contêiner já está
em um estado terminated ou completed e o hook deve ser concluído antes que o sinal TERM seja
enviado para parar o contêiner. Nenhum parâmetro é passado para o handler.
a) PostStart e PreStop.
b) HookStart e HookStop.
c) PodStart e PodStop.
d) KubeStart e KubeStop.
e) KubeletStart e KubeletStop.
Comentários:
Os hooks do ciclo de vida são executados de acordo com o ponto do ciclo. Com isso em mente,
temos:
Gabarito: Letra A
126 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Comentários:
Ótima questão, que aborda tudo que vimos até agora no módulo.
I. Certo. DevOps é uma técnica que mistura desenvolvimento e operações, buscando entregas e
integrações contínuas de aplicações.
II. Errado. Kubernetes é uma ferramenta, responsável pela orquestração de contêinres.
III. Errado. Docker é uma ferramenta para criação de contêineres, não orquestração.
Gabarito: Letra A
a) I e II, apenas.
127 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
b) I e III, apenas.
c) II e III, apenas.
d) III, apenas.
e) I, II e III.
Comentários:
Gabarito: Letra B
Comentários:
Gabarito: Letra E
A camada de gerenciamento possui o componente etcd, cuja função é observar pods que foram
criados sem nenhum node atribuído e selecionar um node para execução.
128 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Comentários:
Gabarito: Errado
15. (IADES/BRB/2021) Kubernetes é uma plataforma de código aberto, portável e extensiva para
o gerenciamento de cargas de trabalho e serviços distribuídos em contêineres, que facilita tanto
a configuração declarativa quanto a automação. Ele possui um ecossistema grande e de rápido
crescimento. Serviços, suporte e ferramentas para Kubernetes estão amplamente disponíveis.
Disponível em: <[Link] Acesso em: 25 jun. 2021, com adaptações.
Com base no texto apresentado e considerando o contexto do Kubernetes, assinale a alternativa
==284e2d==
que corresponde à ferramenta disponibilizada para realizar operações nos clusters Kubernetes,
por meio de interface de linha de comando, pela qual é possível realizar a implantação de
aplicações, inspecionar e gerenciar recursos do cluster e visualizar logs.
a) Kubeadm
b) Minikube
c) Kubectl
d) Kind
e) Kubelet
Comentários:
Galera, apesar do textão, a questão quer uma coisa bem simples: a ferramenta de interface de
linha de comando (CLI) do Kubernetes. A essa altura já deve ser fácil pra você responder isso né?
A CLI do Kubernetes se chama kubectl .
Gabarito: Letra C
Comentários:
129 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Todas as definições estão certas. O Kubelet é um agente presente em cada nó do nosso Cluster
K8s, e é reponsável por garantir a integridade dos pods, comunicando-se diretamente com o plano
de controle.
Gabarito: Certo
a) I e II.
b) I e III.
c) II e III.
d) I, II e III.
Comentários:
Gabarito: Letra A
130 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Os Grupos A e B terão seu próprio contexto de armazenamento e rede a serem orquestrados por
um cluster de Kubernetes.
Para que a conexão de rede entre os containers dos Grupos A e B seja bem-sucedida pelo
orquestrador, independentemente dos endereços IP a eles atribuídos, deverá ser configurado um
novo:
a) pod;
b) replicaSet;
c) service;
d) ingress;
e) statefulSet.
Comentários:
Galera, para termos uma conexão de rede correta, precisamos abstrair de mudanças que ocorrem
dentro da rede específica do nó e dos pods. Para isso, implementamos os services, que carregam
as solicitações ao destino fazendo um mapeamento dinâmico dos endereços.
Gabarito: Letra C
I. Um Pod garante uma mesma localização para os seus contêineres, graças a isso eles têm
diversas formas de interagir com bom desempenho, por exemplo, através de troca de
arquivos, uso de interface de redes ou de mecanismos de comunicação entre processos.
II. Um Pod tem um endereço IP, um nome e uma faixa de portas compartilhadas por todos
os contêineres pertencentes a ele. Isso significa que os contêineres de um mesmo Pod
devem ser configurados cuidadosamente a fim de evitar conflitos de portas.
III. Um Pod é um elemento persistente no tempo, ele resiste às operações de
redimensionamento, falhas de verificação de sanidade de contêineres e migrações entre
nós.
131 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
a) I, somente.
b) II, somente.
c) III, somente.
d) I e II, somente.
e) I e III, somente.
Comentários:
I. Certo. Com a alocação de todos os contêineres para determinado serviço dentro de um mesmo
pod, garantimos que eles compartilhem uma mesma localização.
II. Certo. Cada pod tem um endereço de IP e outras configurações de rede – que são aplicáveis
ao contexto do seu nó.
III. Errado. Os pods são entidades efêmeras, não persistentes.
Gabarito: Letra D
Comentários:
Devido à efemeridade dos pods, o kubelet faz um monitoramento constante da saúde de cada
um deles, removendo, substituindo ou adicionando novos ao node sempre que necessário. Isso,
de fato, traz um escalonamento e uma robustez para a aplicação, fazendo uma recuperação ultra
rápida.
Gabarito: Certo
132 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
LISTA DE QUESTÕES
02. (FCC/MPE PB/2023) Considere que a equipe de TI do Ministério Público utiliza o Kubernetes
como ferramenta de controle de clusters e neste ambiente também encontra-se o Kubectl, uma
ferramenta de linha de comando para gerenciar objetos e clusters Kubernetes, instalados e
funcionando em condições ideais. Um Analista foi solicitado a apresentar os comandos para as
seguintes questões relativas ao Kubectl:
133 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
134 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
a) namespace.
b) metadata.
c) status.
d) desired.
e) spec.
Assinale a opção que apresenta a plataforma de entrega na nuvem para atender a essa demanda.
a) Big Query.
b) Azure Cosmos DB.
c) Azure Kubernetes.
d) Amazon Simple Storage Service.
e) Amazon Quantum Solutions Lab.
Nowadays, firewalls are way more sophisticated than they used to be. They are now capable of
inspecting the application-level protocols and are often not only deployed at the forefront of the
infrastructure but also between each component, to monitor and limit unauthorized accesses.
For the same reason, some container orchestrator tools (such as ....I.... , but also the public cloud
providers) offer the possibility to implement the so-called network policies, which are essentially
....II.... acting as a network firewall, hence not allowing (or dropping) unwanted network
connections. Firewalls can be hardware appliances (with major vendors including Cisco and Check
Point, among others), or even software distributions (such as PFSense and Zeroshell).
(Adaptado de: BONOCORE, Giuseppe. Hands-On Software Architecture with Java. Packt Publishing, 2022)
135 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Assinale
10. (FCC/TRT 22/2022) No Kubernetes, os contêineres gerenciados pelo kubelet podem usar a
estrutura de hook do ciclo de vida do contêiner para executar código acionado por eventos
durante o gerenciamento de seu ciclo de vida. Há dois tipos de hooks:
I. Este hook é executado imediatamente após um contêiner ser criado. Mas não há garantia de
que o hook será executado antes do ENTRYPOINT do contêiner. Nenhum parâmetro é passado
para o handler.
II. Esse hook é chamado imediatamente antes de um contêiner ser terminated devido a uma
solicitação de API ou um gerenciamento de evento como liveness/startup probe failure,
preemption, resource contention e outros. Uma chamada a este hook falha se o contêiner já está
em um estado terminated ou completed e o hook deve ser concluído antes que o sinal TERM seja
enviado para parar o contêiner. Nenhum parâmetro é passado para o handler.
a) PostStart e PreStop.
b) HookStart e HookStop.
c) PodStart e PodStop.
d) KubeStart e KubeStop.
e) KubeletStart e KubeletStop.
136 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
II - Kubernetes é uma técnica que utiliza contêineres para virtualização de serviços e recursos
computacionais a nível de sistema operacional.
III - Docker é uma plataforma de orquestração e automatização de contêineres, conforme
site oficial (https:// [Link]/).
a) I e II, apenas.
b) I e III, apenas.
c) II e III, apenas.
d) III, apenas.
e) I, II e III.
137 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
A camada de gerenciamento possui o componente etcd, cuja função é observar pods que foram
criados sem nenhum node atribuído e selecionar um node para execução.
15. (IADES/BRB/2021) Kubernetes é uma plataforma de código aberto, portável e extensiva para
o gerenciamento de cargas de trabalho e serviços distribuídos em contêineres, que facilita tanto
a configuração declarativa quanto a automação. Ele possui um ecossistema grande e de rápido
crescimento. Serviços, suporte e ferramentas para Kubernetes estão amplamente disponíveis.
Disponível em: <[Link] Acesso em: 25 jun. 2021, com adaptações.
Com base no texto apresentado e considerando o contexto do Kubernetes, assinale a alternativa
que corresponde à ferramenta disponibilizada para realizar operações nos clusters Kubernetes,
por meio de interface de linha de comando, pela qual é possível realizar a implantação de
aplicações, inspecionar e gerenciar recursos do cluster e visualizar logs.
a) Kubeadm
b) Minikube
c) Kubectl
d) Kind
e) Kubelet
a) I e II.
b) I e III.
c) II e III.
138 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
d) I, II e III.
Os Grupos A e B terão seu próprio contexto de armazenamento e rede a serem orquestrados por
um cluster de Kubernetes.
Para que a conexão de rede entre os containers dos Grupos A e B seja bem-sucedida pelo
orquestrador, independentemente dos endereços IP a eles atribuídos, deverá ser configurado um
novo:
a) pod;
b) replicaSet;
c) service;
d) ingress;
e) statefulSet.
I. Um Pod garante uma mesma localização para os seus contêineres, graças a isso eles têm
diversas formas de interagir com bom desempenho, por exemplo, através de troca de
arquivos, uso de interface de redes ou de mecanismos de comunicação entre processos.
II. Um Pod tem um endereço IP, um nome e uma faixa de portas compartilhadas por todos
os contêineres pertencentes a ele. Isso significa que os contêineres de um mesmo Pod
devem ser configurados cuidadosamente a fim de evitar conflitos de portas.
III. Um Pod é um elemento persistente no tempo, ele resiste às operações de
redimensionamento, falhas de verificação de sanidade de contêineres e migrações entre
nós.
a) I, somente.
b) II, somente.
c) III, somente.
139 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
d) I e II, somente.
e) I e III, somente.
140 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
GABARITO
141 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
RANCHER
Conceitos Gerais
O Rancher foi desenvolvido para permitir que equipes de TI e DevOps gerenciem múltiplos
clusters Kubernetes de forma unificada. Seu principal objetivo é fornecer um painel centralizado
para administrar clusters, independentemente de onde estejam hospedados, garantindo que
organizações possam operar contêineres de maneira eficiente e segura.
Além disso, ele busca democratizar o uso do Kubernetes, reduzindo barreiras de adoção e
fornecendo ferramentas que tornam a experiência de gerenciamento mais amigável. Enquanto o
Kubernetes sozinho já fornece um sistema poderoso de orquestração de contêineres, ele não
possui nativamente um painel de gerenciamento centralizado ou políticas de segurança
integradas. O Rancher resolve essas lacunas ao oferecer um conjunto robusto de funcionalidades.
142 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
143 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Arquitetura
O Rancher possui uma arquitetura modular projetada para gerenciar múltiplos clusters
Kubernetes, independentemente de onde estejam hospedados. Ele fornece uma camada de
abstração sobre o Kubernetes, simplificando operações como provisionamento, autenticação,
segurança, monitoramento e integração com CI/CD. Sua arquitetura é composta por diferentes
componentes que interagem para garantir a eficiência e segurança no gerenciamento de clusters.
Rancher, que podem ser provisionados pelo Rancher ou conectados a outros provedores.
• Camada de Nós e Workloads – Máquinas físicas ou virtuais onde os contêineres são
executados dentro dos clusters Kubernetes.
144 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Rancher Server
O Rancher Server é o núcleo da plataforma e atua como ponto central de gerenciamento para
todos os clusters Kubernetes. Ele fornece uma interface gráfica unificada, API e CLI para
orquestrar, configurar e monitorar clusters de Kubernetes.
O Rancher Server pode ser implantado como um contêiner único para ambientes pequenos ou
em modo altamente disponível (HA - High Availability) para ambientes de produção. Em um
ambiente HA, o Rancher é instalado em um cluster Kubernetes dedicado, garantindo
escalabilidade e resiliência.
O Rancher Server precisa de um banco de dados para armazenar suas configurações e metadados.
A versão padrão utiliza etcd quando instalada diretamente em um cluster Kubernetes ou
MySQL/PostgreSQL quando instalada em standalone.
Rancher Agents
Para que o Rancher Server possa gerenciar um cluster Kubernetes, ele precisa se comunicar com
os Rancher Agents, que são processos executados dentro de cada cluster gerenciado. O agente
145 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
do Rancher é responsável por enviar informações do cluster para o Rancher Server e receber
comandos administrativos.
Cada cluster Kubernetes gerenciado pelo Rancher executa pelo menos um agente, garantindo
comunicação contínua e segura entre o Rancher Server e os clusters.
Helm
O Rancher inclui um Catálogo de Aplicações, baseado no Helm, que permite a implantação de
aplicações diretamente na interface do Rancher. Esse catálogo contém Helm Charts, pacotes que
facilitam a instalação e gerenciamento de aplicações Kubernetes complexas.
• Facilidade de Deploy – Usuários podem instalar aplicações como Prometheus, Grafana, Istio
e Jenkins com apenas alguns cliques.
• Gestão Centralizada de Aplicações – Aplicações podem ser implantadas e monitoradas
diretamente pelo Rancher.
• Atualizações e Rollbacks – Suporte a versionamento de aplicações, facilitando atualizações
e reversões.
Rede e Segurança
O Rancher fornece políticas de segurança e controle de rede avançadas, garantindo que os
clusters sejam protegidos contra acessos não autorizados e ataques.
146 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
• Service Mesh – Integração com Istio para gerenciamento de comunicação entre serviços.
147 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
Rancher CLI
Você já sabe – temos uma ferramenta CLI, teremos nossa tabela-resumo. As bancas amam cobrar
esse assunto, já que é de fácil cobrança, então vamos trazê-la para você de forma bem direta e
resumida.
Comando Descrição
Realiza operações em aplicações de catálogo, como instalação e
apps, app
gerenciamento de charts Helm.
Gerencia catálogos de aplicações, permitindo listar, adicionar ou
catalog
remover catálogos.
Executa operações relacionadas aos clusters, como listar, criar ou
clusters, cluster
deletar clusters.
context Alterna entre diferentes projetos ou contextos dentro do Rancher.
globaldns Gerencia provedores e entradas de DNS global.
Exibe detalhes de recursos específicos, como serviços, contêineres
inspect
ou hosts.
Executa comandos do Kubernetes diretamente através do Rancher
kubectl
CLI.
login, -l Realiza login em um servidor Rancher especificado.
Gerencia máquinas, incluindo operações de criação, listagem e
machines, machine
remoção.
multiclusterapps, Opera em aplicações que abrangem múltiplos clusters.
multiclusterapp
namespaces, Gerencia namespaces dentro de um projeto, permitindo criação e
namespace exclusão.
Realiza operações em nós de clusters, como listagem e
nodes, node
gerenciamento de status.
Gerencia projetos dentro de clusters, incluindo criação e
projects, project
configuração.
ps Mostra workloads em um projeto específico.
Gerencia configurações do servidor Rancher, como listar e alternar
server
entre servidores.
148 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150
(FCC/TRT 18/2023) Para listar todos os templates de catálogo, utilizando o Rancher Command
Line Interface (CLI), digita-se o comando
Comentários:
O comando para lidar com catálogos no Rancher é o rancher catalog. Para listar, usamos a opção
ls – resultando no comando rancher catalog ls. (Gabarito: Letra E)
149 - 2025 (P
MP-SE (Analista do Ministério Público - Tecnologia da Informação - Infraestrutura) Desenvolvimento de Software
[Link] 150