Docker Flashcards

1
Q

Roteiro

A

O que é docker
Como executar um container
Como verificar containers já executados

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Como verificar containers ativos?

A

docker ps

Para ver todos os containers já executados e ainda não deletados, além dos ativos:
docker ps -a

Para obter os IDs desses containers:
docker ps -a -q

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Como rodar um container hello-world? O que este comando executa?

A

docker run
docker run hello-world

Inicialmente ele verifica se consegue encontrar a imagem localmente. Caso não encontre, ele irá fazer o pull da imagem solicitada.

Em sequência o container é executado.

Se executarmos docker ps, veremos que não há nenhum container em execução. Isso ocorre poiso entrypoint da imagem hello-world executou o print exibido na tela e morreu, visto que o entry point terminou sua execução após o print.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Como executar um comando em uma imagem específica?

A

docker run -it :
docker run -it ubuntu:latest bash

  • i indica modo iterativo, mantendo o bash em execução em nosso termial.
  • t tty - permite a execução de comando ligado ao modo iterativo

Para garantir que o container seja removido após a execução, é possível adicionar a flag –rm
Ex:
docker run -it –rm ubuntu:latest bash

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Como dar start em um container?

A

docker start

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Como funciona a exposição dos containers?

A

Se o container tem as portas ativas, não significa que meu host consegue acessar essa porta, visto que a porta está ativa apenas para o contaier.

Ex:
Execute docker run nginx

Ele irá subir um container com o nginx com a porta 80 exposta. É possível verificar isso com docker ps.
Mas ao tentar acessar localhost:80, não temos sucesso. Outros container dentro do dockerhost sim conseguiriam acessar essa porta.

E como fazemos para acessar a porta?
docker run -p 8080:80 nginx
Esse comando diz que quando tentarmos acessar a porta 8080 da máquina, o dockerhost deve direcionar para a porta 80 do container do nginx.

Isso quer dizer que precisamos publicar a porta do container para conseguirmos acessa-lo fora da rede interna do dockerhost

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Como executar um docker em background?

A

docker run -d -p 8080:80 nginx

-d coloca para o terminal executar em background (detached)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Como parar um container?

A

docker stop

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Como remover um container?

A

Para comando já parado:
docker rm

Caso o container esteja em execução é possível forçar a remoção ou parar o container e na sequência remove-lo:
docker stop -f

ou

docker stop
docker rm

E para remover todos os containers?
docker rm $(docker ps -a -q) -f

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Como dar o nome a um container?

A

docker run -d –name

docker run -d –name nginx_paulo nginx

Ex: dar nome ao container, expondo a porta
docker run -d -p 8080:80 –name nginx nginx

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Como executar um comando no container?

A

docker exec

Executar o container
docker run -d -p 80:8080 –name nginx nginx

Executar comando no container:
docker exec nginx ls
*Para comando interativos:
docker exec -it nginx bash

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Como criar volumes com containers?

A

docker run -d –name nginx -p 8080:80 –mount type=bind,source=”$(pwd)”/github/learn-docker/html,target=/usr/share/nginx/html nginx

Também é possível criar com o -v, mas este comando está deprecado
docker run -d –name nginx -p 8080:80 -v /pasta/do/meu/computador:/pasta/do/docker

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Para o que ser o volume? Como criar um volume?

A

Os volumes servem para mantê-los criados independente das imagens e containers docker. Facilita bastante na utilização visto que é difícil ficar lembrando os paths para configuração dos mounts.

Para cria-los, basta executar:
docker volume create meuvolume

Para ver seus volumes:
docker volume ls

Para inspecionar o volume
docker volume inspect meuvolume

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Como mapear um volume em um container?

A

docker run –name nginx -d –mount type=volume,source=meuvolume,target=/app nginx

Ex - Criando dois containers com volumes compartilhados:

docker run –name nginx -d –mount type=volume,source=meuvolume,target=/app nginx

docker exec -it nginx bash
cd /app/
touch oi

docker run –name nginx2 -d –mount type=volume,source=meuvolume,target=/app nginx
docker exec -it nginx2 bash
ls /app/

Podemos montar um terceiro container com o -v
docker run –name nginx3 -d -v meuvolume:/app nginx
docker exec -it nginx3 bash
ls /app/

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Como limpar todos os volumes (caso máquina lenta)?

A

docker volume prune

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

[Imagem] - Qual prática é utilizada para versionar imagens?

A

É muito comum subir uma imagem com a tag que você acabou de mexer e outra com a versão latest.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

[Imagem] - Como apenas baixar uma imagem?

A

docker pull
docker pull ubuntu

Para baixar uma tag específica
docker pull :
docker pull ubuntu:rc-apine

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

[Imagem] - Como verificar as imagens que estão no meu computador?

A

docker images

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

[imagem] - Como remover uma imagem?

A

docker rmi
docker rmi :

Ex:
docker rmi php
docker rmi php:rc-alpine

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

[Imagem] - Como criar minha própria imagem?

A

É possível criar uma imagem através do Dockerfile. Nele é declarado a receita da imagem que será criado.

Ex - Preciso da imagem do nginx já com o vim instalado. Para isso, utilize o seguinte Dockerfile:
‘’’
FROM nginx:latest

RUN apt-get update
RUN apt-get install vim -y
‘’’

O comando para construir a imagem é:
docker build -t /:
Ex:
docker build -t paulomulotto/nginx-com-vim:latest .

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

[Imagem] - Qual comando para criar uma imagem a partir do Dockerfile?

A

O comando para construir a imagem é:
docker build -t /:
Ex:
docker build -t paulomulotto/nginx-com-vim:latest .

22
Q

[Imagem] - Como criar uma pasta dentro do container e mudar para ela durante a execução da criação da imagem?

A

É possível utilizar o comando WORKDIR.

# Criar a pasta dentro do container e já mudar para este diretório
WORKDIR /the/workdir/path
23
Q

[Imagem] - Como quebrar comandos de shell utilizando um único RUN para executa-los no Dockerfile?

A

É possível utilizar && para concatenar comandos e usar \ para quebrar linhas.

Ex:
RUN apt-get update && \
apt-get install -y

24
Q

[Imagem] - Como copiar arquivos do meu computador para dentro do container?

A

Utilizando o comando COPY.

Ex:

25
Q

[Imagem] - Qual usuário é utilizado nas imagens por padrão?

A

Por padrão é utilizado o usuário root.

É possível utilizar outro usuário com o comando USER, desde que o usuário exista na imagem.

Ex:
USER

26
Q

[Imagem] - Como executar comandos no Dockerfile?

A

É possível utilizar CMD.

Ex:
‘’’
FROM ubuntu:latest

CMD [“echo”, “Hello World”]
‘’’

Este comando pode ser substituído na hora da execução explicitando o comando no docker run.
docker build -t paulomulotto/hello .
docker run –rm paulomulotto/hello echo “oi”

27
Q

[Imagem] - Como garantir que o comando executado seja fixo?

A

É possível utilizar ENTRYPOINT. Diferente do CMD que é variável e pode ser alterado na execução do container.

Ex:
'''
FROM ubuntu:latest
ENTRYPOINT ["echo", "Hello"]
CMD ["World"]
'''
Sem explicitar o comando:
docker run --rm paulomulotto/hello
>>> Hello echo World

Explicitando o comando:
docker run –rm paulomulotto/hello “Paulo”
»> Hello Paulo

28
Q

[Imagem] - Por que se eu executar docker run nginx bash, o nginx não funciona?

A

Por que o comando CMD[“nginx”, “-g”, “daemon off;”] foi substituído pelo comando bash.

29
Q

*OBS - O que tem de interessante na imagem do nginx?

A

Ele tem um script docker-entrypoint.sh que no final tem o comando exec “$@” que irá executar o próximo comando.

Esse próximo comando é passado pelo CMD, que é um comando variável.

Link do git:
https://github.com/nginxinc/docker-nginx/blob/3a7105159a6c743188cb1c61e4186a9a59c025db/mainline/debian/Dockerfile

30
Q

[Imagem] - Como publicar uma imagem no dockerhub?

A

É necessário ter uma conta no dockerhub.

Executar
1 - docker login
2 - Preencher com suas credencias
3 - docker push paulomulotto/nginx-mulotto

31
Q

[Network] - Para o que serve a rede interna do Docker?

A

A rede interna do docker serve para os containers se conectarem entre si, sem expor as portas para outros serviços que não façam parte do dockerhost.

32
Q

[Network] - Quais são os tipos de redes do docker?

A

BRIDGE e HOST são os mais comuns. Mas existem também de overlay, maclan e none.

BRIDGE - Utilizado para comunicação entre os containers

HOST - Mescla a network do docker com a do host do docker. Importante para expor as portas do container para o host (ex - expor uma porta do webserver)

OVERLAY - Comunicação dos containers entre diferentes hosts (docker swarm trabalha bem com isso)

MACLAN - Setar um macaddres em um container

NONE - Container irá rodar de forma completamente isolada

33
Q

[Network] - Como remover todas as redes do docker?

A

docker network prune

34
Q

[Network] - Exemplo

A

docker run -d -it –name ubuntu1 bash
docker run -d -it –name ubuntu2 bash

***-it para rodar de forma iterativa, mas com o -d.

docker network inspect bridge
> Dentro de containers, é possível ver os dois containers criados.

docker attach ubuntu1
ping
> É possível pingar o outro container

ping ubuntu2
> Não consegue fazer a resolução por nome

Criar uma nova rede
docker network create –driver bridge minharede

docker run -d -it –name ubuntu1 –network minharede bash
docker run -d -it –name ubuntu2 –network minharede bash

docker exec -it ubuntu1 bash
ping ubuntu2
> Agora o ping funciona pois estão na mesmoa rede

docker run -d -it –name ubuntu3 bash
ping ubuntu1
> ping não funciona pois o ubuntu3 não está na rede

docker network inspect minharede
> É possível ver que o container ubuntu3 não está entre os containers da rede (somente ubuntu1 e ubuntu2)

docker network inspect bridge
> É possível ver que o container ubuntu3 está na rede, mas o ubuntu1 e ubuntu2 não

35
Q

[Network] - Como conectar um container em uma rede?

A

docker network connect minharede ubuntu3

docker network inspect minharede

É possível ver que o container ubuntu3 foi anexado a rede.

36
Q

[Network] - Problema com a network host

A

Não o docker não está executando no linux (aqui tbm pode ser o WSL2), quando é gerado a network do tipo host, ele cria essa rede com a VM em que está emulando o linux onde o docker está executando, e não com a máquina em si.

37
Q

[Network] - Docker Network Host

A

docker run –rm -d –name nginx –network host nginx

Dessa forma, a network do container está linkada com a da máquina, sendo possível acessar o container diretamente pela porta exposta (porta 80 no caso).

38
Q

[Network] - Como um container pode acessar uma porta do docker host?

A

É possível utilizar o link http://host.docker.internal:

Ele irá bater no localhost da máquina de dentro do container.

39
Q

[Prática] - Criando uma imagem

A

1 - Definir a imagem a ser utilizada (dockerhub)
2 - Executar todos os passos dentro da imagem (vai anotando os passos executados com sucesso)
2.1- Ex: apt-get update, mkdir /var/www, instalar o framework….
3 - Traduzir para a receita do Dockerfile

40
Q

Como ver os logs do container?

A

docker logs

41
Q

[Prática] - Usar o container para rodar uma aplicação sem a dependência na máquina local através do docker.

A

É possível criar um volume anexando o diretório local com o container e sempre que um for atualizado, o outro também será.

Ex:
docker run –rm -it -v $(pwd)/:/usr/src/app -p 3000:3000 node:15 bash

42
Q

[Prática] - Dica de quando usar o COPY?

A

O copy é importante quando vai buildar a imagem. Para desenvolver, não é necessário, visto que pode utilizar uma referência para um volume local.

Pensando nisso, é normal ter dois arquivos de Dockerfile: Dockerfile e Dockerfile.prod

Para buildar o de prod, execute:
docker buid -t paulomulotto/ . -f

43
Q

Como buildar uma imagem com a receita com nome diferente de Dockerfile?

A

docker buid -t / . -f

44
Q

[Otimizando Imagens] - Como funciona o Multistage Building?

A

O Multistage building é uma forma de quebrar a construção de imagens.
Na primeira etapa é construído a imagem e na segunda é realizado a otimização desta.

Você utiliza uma imagem inicial, para gerar um artefato. Ai você pega o artefato e envia para uma imagem mais leve. Ex:

FROM php:7.4-cli AS builder

WORKDIR /var/www

RUN apt-get update && \
apt-get install libzip-dev -y && \
docker-php-ext-install zip

RUN php -r “copy(‘https://getcomposer.org/installer’, ‘composer-setup.php’);” && \
php composer-setup.php && \
php -r “unlink(‘composer-setup.php’);”

RUN php composer.phar create-project laravel/laravel laravel

# Como o ENTRYPOINT é fixo, não conseguimos parametrizar. Além disso, o default dele é rodar no 127.0.0.1:8000. que não fica exposto, diferente do 0.0.0.0
# Logo, para conseguirmos parametrizar o host e a porta, podemos utilizar o CMD
ENTRYPOINT ["php", "laravel/artisan", "serve"]
CMD ["--host=0.0.0.0"]

Comando docker para substituir o CMD: docker run -d –rm –name lavavel -p 8001:8001 paulomulotto/laravel –host=0.0.0.0 –port=8001

FROM php:7.4-fpm-alpine
WORKDIR /var/www
RUN rm -rf /var/www/html
# Copia o que foi gerado do build anterior
COPY --from=builder /var/www/laravel .
# trocando o dono do grupo
RUN chown -R www-data:www-data /var/www
EXPOSE 9000
CMD ["php-fpm"]
# Executando o build
# docker build -t paulomulotto/laravel:prod . -f Dockerfile.prod
45
Q

[Docker Compose] - Para o que serve?

A

aaa

46
Q

[Docker Compose] - Como declaro?

A

É possível declarar o docker-compose através de um arquivo declarativo yaml.

Ex:
version: ‘3’

services:
  laravel:
    image: paulomulotto/laravel:prod
    container_name: laravel
    networks:
      - laranet
  nginx:
    image: paulomulotto/nginx-mulotto
    container_name: nginx
    networks:
      - laranet
    ports:
      - "8080:80"
47
Q

[Docker Compose] - Como executar a receita do docker compose?

A

docker-compose up

48
Q

[Docker Compose] - Como buildar imagens no docker-compose?

A

É possível utilizar o comando build + context.

Ex:
version: ‘3’

services:
  laravel:
    build:
      context: ./laravel
      dockerfile: Dockerfile.prod
    image: paulomulotto/laravel:prod
    container_name: laravel
    networks:
      - laranet

docker-compose up -d –build

49
Q

[Docker Compose] - Como forçar a reconstrução das imagens?

A

docker-compose up -d –build

50
Q

Como fazer um container esperar pelo outro?

A

O comando depends_on do docker-compose.yaml não serve para fazer os containers esperarem para serem criados.

Para criar essa dependência é possível utilizar o dockerize: https://github.com/jwilder/dockerize

Ele é responsável por ficar escutando a porta que será aberta de outro container para seguir com a criação do container.

Adicionar na imagem a instalação (github) do dockerirze e o comando para ficar escutando:
dockerize -wait tcp://db:3306 -timeout 50s