Docker Flashcards
Roteiro
O que é docker
Como executar um container
Como verificar containers já executados
Como verificar containers ativos?
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
Como rodar um container hello-world? O que este comando executa?
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.
Como executar um comando em uma imagem específica?
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
Como dar start em um container?
docker start
Como funciona a exposição dos containers?
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
Como executar um docker em background?
docker run -d -p 8080:80 nginx
-d coloca para o terminal executar em background (detached)
Como parar um container?
docker stop
Como remover um container?
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
Como dar o nome a um container?
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
Como executar um comando no container?
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
Como criar volumes com containers?
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
Para o que ser o volume? Como criar um volume?
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
Como mapear um volume em um container?
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/
Como limpar todos os volumes (caso máquina lenta)?
docker volume prune
[Imagem] - Qual prática é utilizada para versionar imagens?
É muito comum subir uma imagem com a tag que você acabou de mexer e outra com a versão latest.
[Imagem] - Como apenas baixar uma imagem?
docker pull
docker pull ubuntu
Para baixar uma tag específica
docker pull :
docker pull ubuntu:rc-apine
[Imagem] - Como verificar as imagens que estão no meu computador?
docker images
[imagem] - Como remover uma imagem?
docker rmi
docker rmi :
Ex:
docker rmi php
docker rmi php:rc-alpine
[Imagem] - Como criar minha própria imagem?
É 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 .
[Imagem] - Qual comando para criar uma imagem a partir do Dockerfile?
O comando para construir a imagem é:
docker build -t /:
Ex:
docker build -t paulomulotto/nginx-com-vim:latest .
[Imagem] - Como criar uma pasta dentro do container e mudar para ela durante a execução da criação da imagem?
É possível utilizar o comando WORKDIR.
# Criar a pasta dentro do container e já mudar para este diretório WORKDIR /the/workdir/path
[Imagem] - Como quebrar comandos de shell utilizando um único RUN para executa-los no Dockerfile?
É possível utilizar && para concatenar comandos e usar \ para quebrar linhas.
Ex:
RUN apt-get update && \
apt-get install -y
[Imagem] - Como copiar arquivos do meu computador para dentro do container?
Utilizando o comando COPY.
Ex:
[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
[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”
[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
[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.
*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
[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
[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.
[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
[Network] - Como remover todas as redes do docker?
docker network prune
[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
[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.
[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.
[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).
[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.
[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
Como ver os logs do container?
docker logs
[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
[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
Como buildar uma imagem com a receita com nome diferente de Dockerfile?
docker buid -t / . -f
[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
[Docker Compose] - Para o que serve?
aaa
[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"
[Docker Compose] - Como executar a receita do docker compose?
docker-compose up
[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
[Docker Compose] - Como forçar a reconstrução das imagens?
docker-compose up -d –build
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