Docker Flashcards

(50 cards)

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
[Imagem] - Qual usuário é utilizado nas imagens por padrão?
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
[Imagem] - Como executar comandos no Dockerfile?
É 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
[Imagem] - Como garantir que o comando executado seja fixo?
É 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
[Imagem] - Por que se eu executar docker run nginx bash, o nginx não funciona?
Por que o comando CMD["nginx", "-g", "daemon off;"] foi substituído pelo comando bash.
29
*OBS - O que tem de interessante na imagem do nginx?
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
[Imagem] - Como publicar uma imagem no dockerhub?
É necessário ter uma conta no dockerhub. Executar 1 - docker login 2 - Preencher com suas credencias 3 - docker push paulomulotto/nginx-mulotto
31
[Network] - Para o que serve a rede interna do Docker?
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
[Network] - Quais são os tipos de redes do docker?
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
[Network] - Como remover todas as redes do docker?
docker network prune
34
[Network] - Exemplo
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
[Network] - Como conectar um container em uma rede?
docker network connect minharede ubuntu3 docker network inspect minharede É possível ver que o container ubuntu3 foi anexado a rede.
36
[Network] - Problema com a network host
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
[Network] - Docker Network Host
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
[Network] - Como um container pode acessar uma porta do docker host?
É possível utilizar o link http://host.docker.internal: Ele irá bater no localhost da máquina de dentro do container.
39
[Prática] - Criando uma imagem
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
Como ver os logs do container?
docker logs
41
[Prática] - Usar o container para rodar uma aplicação sem a dependência na máquina local através do docker.
É 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
[Prática] - Dica de quando usar o COPY?
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
Como buildar uma imagem com a receita com nome diferente de Dockerfile?
docker buid -t / . -f
44
[Otimizando Imagens] - Como funciona o Multistage Building?
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
[Docker Compose] - Para o que serve?
aaa
46
[Docker Compose] - Como declaro?
É 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
[Docker Compose] - Como executar a receita do docker compose?
docker-compose up
48
[Docker Compose] - Como buildar imagens no docker-compose?
É 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
[Docker Compose] - Como forçar a reconstrução das imagens?
docker-compose up -d --build
50
Como fazer um container esperar pelo outro?
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