sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(. /etc/os-release; echo "$UBUNTU_CODENAME") stable"
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
sudo usermod -aG docker $USER
sudo reboot now
sudo apt install vim
docker -v
docker pull hello-world
docker images
-a, --all Mostra todas as imagens (por padrão esconde as imagens intermediarias)
--digests Mostra o hash
-q, --quiet Mostra apenas os IDs das imagens
-f, --filter filter Filtra a saída do comando--format string Formata a saída do comando
--no-trunc Não trunca a saída do comando
cd
pwd
mkdir nginx
cd nginx
vim Dockerfile
Crie o arquivo Dockerfile com o conteúdo do arquivo Dockerfile
docker build -t local-teste:1.0.0 .
Editar a imagem concatenando os comandos RUN
Conferir Diferença entre tamanhos de imagem (novas camadas)
docker build -t local-teste:1.0.1 .
docker images
criar uma imagem ubuntu com o nginx
docker build -t local-nginx-ubuntu .
criar outra imagem usando de base um alpine
docker build -t local-nginx-alpine .
docker images
Se não tem crie um usuário no http://dockerhub.com
Ative seu usuário no seu email
docker tag [usuario dockerhub]/nginx-alpine
docker rmi local-nginx-ubuntu
docker rmi local-nginx-alpine
docker rmi local-teste:1.0.0
docker rmi local-teste:1.0.1
docker login
docker push [usuario dockerhub]/nginx-alpine
Possibilita criar uma imagem usando um container
docker commit [nome] [nome imagem]:[tag]
docker image prune -a
Para mostrar os próximos exemplos iremos executar o comando abaixo como insumo (vamos explicar esse comando posteriormente)
Uum container so se mantem em execução enquanto o processo que o iniciou esteja vivo
docker run -itd alpine
docker run hello-world
docker ps
docker ps -a
Observe:
Temos um container em execução da imagem alpine
Temos um container parado (exit) da imagem hello-world
https://docs.docker.com/engine/reference/run/
docker run [opções] [imagem] [comando] [argumentos...]
-it #permite iteração com o container e attacha a tty (saída, output) do comando
-d dettached #cria o container destacado
Para sair de um container sem matar o processo(bash no caso acima) use Ctrl p q (não consegui rodar no wsl terminal)
docker run -it ubuntu
#ficou? imagem do ubuntu não tem cmd
docker run -it ubuntu bash
docker run -d ubuntu bash
#ficou?
docker run -itd ubuntu bash
# a ordem não importa
docker run -d nginx
docker run -itd --name meu-ubuntu ubuntu
docker run --name meu-ubuntu ubuntu
#rodou?
docker run -it -h meuserver ubuntu
hostname #comando linux
exit #comando linux
Porta que será exposta pelo host)
-p [HOSTPORT]:[CONTAINERPORT]
docker run -d --name nginx-80 -p 80:80 nginx
docker run -it -p 80:80 nginx
#rodo?
docker run -d --name nginx-8080 -p 8080:80 nginx
--restart [opcao]
always inicia junto com o docker
on-failure:10, inicia sempre, mas se falhar (10) vezes não tenta mais
unless-stoped inicia se o estado anterior não for parado
docker run -itd --name automatico --restart always ubuntu
docker ps
sudo service docker restart
docker ps
docker run -it --rm --name temporario ubuntu
exit #comando linux
docker run -it --rm -u daemon ubuntu
exit #comando linux
docker run -it --rm -w /tmp ubuntu
exit #comando linux
docker run -it --rm -e ANIMAL=lobo -e CACADOR=joao -e ARMA=espingarda ubuntu
env #comando linux
exit #comando linux
docker stats automatico
ctrl c
-m [tamanho] ou --memory , (b,k,m,g)
docker run -m 200k ubuntu
#rodou?
docker run -itd --name men-limitado --rm -m 10m ubuntu
docker stats men-limitado
#ctrl C
--memory-swap,(b,k,m,g)
docker run --rm --memory-swap 5m ubuntu
#rodou?
docker run --rm -m 10m --memory-swap 5m ubuntu
#rodou?
docker run --rm -m 10m --memory-swap 15m ubuntu
--cups - Especifica quanto dos recursos de CPU disponíveis um contêiner pode usar
--cpu-period - Especifica o período do agendador CFS da CPU, que é usado junto com --cpu-quota.
O padrão é 100.000 microssegundos (100 milissegundos).
A maioria dos usuários não altera isso do padrão. Para a maioria dos casos de uso, --cpus é uma alternativa mais conveniente. --cpu-quota - Especifica uma cota de CPU CFS no contêiner.
Para a maioria dos casos de uso, --cpus é uma alternativa mais conveniente.
--cpuset-cpus - Especifica as CPUs ou núcleos que o contêiner pode usar.
lista separada por virgula ou - (hifen) para intervalo
Onde a primeira CPU é 0. ex:0-3(primeira, segunda, terceira CPU)
1,3(segunda e quarta CPU)
--cpu-shares - Aumentar ou reduzir o peso do contêiner e fornecer acesso a uma proporção maior ou menor dos ciclos de CPU
por padrão e 1024
docker run --rm --cpus="0.5" ubuntu
docker run --rm --cpus="0.5" --cpu-period="100000" --cpu-quota=50000 ubuntu
#rodou?
docker run --rm --cpu-period="100000" --cpu-quota=50000 --cpuset-cpus=1,3 --cpu-shares=1000 ubuntu
Existem formas de Especificar o uso de GPU, mas como depende do hardware iremos apenas revisar
--gpus all - Habilita todas as GPU's para uso do contêiner
--gpus device= - Especifica qual GPU será habilitada para aquele container
--gpus 'all,capabilities=utility Especifica qual recurso esta disponível na GPU para o container
Para isso o container deverá estar em execução, esse comando será executado em uma nova sessão
docker run -itd --name exemplo -p 9090:80 nginx
docker exec exemplo ls /etc
docker exec -it exemplo bash
exit #comando linux
docker ps
#morreu?
Isso permite visualizar sua saída em andamento ou controlá-la interativamente,
como se os comandos estivessem sendo executados diretamente em seu terminal.
docker attach exemplo
ctrl c
docker ps
Se o container não foi criado com --rm ao finalizar o comando ele fica em estado parado
docker start exemplo
docker ps
Se o container foi criado com --rm ele será eliminado
no contrário ele apenas ira ficar em estado parado e seus
arquivos internos será mantido
docker exec exemplo touch /root/meuarquivo
docker stop exemplo
docker start exemplo
docker exec exemplo ls /root
docker run -itd --name doril --rm ubuntu
docker exec doril touch /root/meuarquivo
docker stop doril
docker pause exemplo
docker ps
docker unpause exemplo
docker ps
Reinicia um container mas não perde seu estado..
docker restart exemplo
docker inspect exemplo
docker logs exemplo
Todas as vezes que criamos um container ele e atribuido a uma rede e recebe um ip, mas como esse ip e dinâmico nem sempre ao reiniciar o docker ele pegará o mesmo ip, então para isso usamos o nome do container para conectar um container ao outro
docker run -itd --rm --name meu-postgres -e POSTGRES_PASSWORD=password -p 5432:5432 postgres
docker run -it --rm --link meu-postgres jbergknoff/postgresql-client postgresql://meu-postgres:postgres@password:5432/postgres
SELECT * FROM pg_catalog.pg_tables WHERE schemaname != 'pg_catalog';
\q
#Remove um container
]
Se o container esta em execução pode ser forçar com o parametro -f
Ex: docker rm -f [nome container]
docker ps
docker rm men-limitado
#rodou?
docker rm -f $(docker ps -aq)
docker volume
create [nome] - cria um novo volume inspect [nome] - mostra detalhes do volume ls - lista os volumes existentes
prune - apaga os volumes que não estão sendo usados rm [nome] - remove um volume -v [nome volume]:[path container] - aplica o volume no path do containerex: -v [volume]:\opt\app -v [caminho no host]:[caminho no container] [opcoes] um volume pode ser usado simultaneamente por vários containers as opções não funcionan no windows, no linux e similar ao comando mount com as opções separadas por virgula exemplo "tmpfs" (Dispositivo de armazenamento HD, disquete, cd, dvd...):
docker volume create --driver local --opt type=tmpfs --opt device=tmpfs --opt o=size=100m,uid=1000 [nome] exemplo "nfs" (Network File System sistema de arquivo distribuido(rede)) docker volume create --driver local --opt type=nfs --opt o=addr=[ip],rw --opt device=:[caminho] [nome] outros tipos de drivers btrfs, zfs, hfs, fat32, ntfs o comando -v pode ser usando juntamente com a criação do container (docker run) em combinação com os diversos parâmetros
O que o docker chama de rede, na verdade é uma abstração criada para facilitar o gerenciamento da comunicação de dados entre containers e os nós externos ao ambiente docker.
O docker é disponibilizado com três redes por padrão. bridge, host e none Essas redes oferecem configurações específicas para gerenciamento do tráfego de dados.
Cada container iniciado no docker é associado a uma rede específica. Essa é a rede padrão para qualquer container, a menos que associemos, explicitamente, outra rede a ele. A rede confere ao container uma interface que faz bridge com a interface docker0 do docker host. Essa interface recebe, automaticamente, o próximo endereço disponível na rede IP 172.17.0.0/16.
Todos os containers que estão nessa rede poderão se comunicar via protocolo TCP/IP. Se você souber qual endereço IP do container deseja conectar, é possível enviar tráfego para ele. Afinal, estão todos na mesma rede IP (172.17.0.0/16).
Essa rede 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, sem necessidade de enviá-los via rede para outro local. (Ex.: container de backup utiliza os volumes de container de banco de dados para realizar o dump e, será usado no processo de retenção dos dados).
Essa rede tem como objetivo entregar para o container todas as interfaces existentes no docker host. De certa forma, pode agilizar a entrega dos pacotes, uma vez que não há bridge no caminho das mensagens. Mas normalmente esse overhead é mínimo e o uso de uma brigde pode ser importante para segurança e gerencia do seu tráfego.
docker network ls
docker network create --subnet=172.18.0.0/16 apps
docker network ls
docker network inspect apps
crie o conteudo abaixo no fim do arquivo hosts especifico do seu SO
127.0.0.1 portal.local
127.0.0.1 intranet.local
127.0.0.1 comercial.local
127.0.0.1 estoque.local
127.0.0.1 portainer.local
Abra o powershell como administrador e execute o comando na pasta
cd C:\Windows\system32\drivers\etc
notepad hosts
sudo vim /etc/hosts
Teste a entrada executando o comando:
ping portal.local
ping intranet.local
ping comercial.local
ping estoque.local
Crie o arquivo default.conf com o conteúdo do arquivo default.conf
cd ~/docker/nginx
mkdir www
mkdir conf.d
cd conf.d
vim default.conf
Crie o arquivo intranet.conf com o conteúdo do arquivo intranet.conf
vim intranet.conf
Crie o arquivo portal.conf com o conteúdo do arquivo portal.conf
vim portal.conf
Crie o arquivo index.html com o conteúdo do arquivo index.html
cd ~/docker/nginx/www
mkdir portal
cd portal
vim index.html
Crie o arquivo index.html com o conteúdo do arquivo index.html
cd ~/docker/nginx/www
mkdir intranet
cd intranet
vim index.html
docker run -d --name nginx -h nginx --net apps -p 80:80 -v ~/docker/nginx/conf.d:/etc/nginx/conf.d -v ~/docker/nginx/www:/var/www nginx
- acesse http://localhost
- acesse http://portal.local
- acesse http://intranet.local
Crie o arquivo index.html com o conteudo do arquivo index.html
cd ~/docker
mkdir app-comercial
cd app-comercial
vim index.html
Crie o arquivo Dockerfile com o conteudo do arquivo Dockerfile
vim Dockerfile
docker build -t [seu login dockerhub]/app-comercial:1.0.0 .
#exemplo midianet/app-comercial:1.0.0 .
Crie o arquivo index.html com o conteudo do arquivo index.html
cd ~/docker
mkdir app-estoque
cd app-estoque
vim index.html
Crie o arquivo Dockerfile com o conteudo do arquivo Dockerfile
vim Dockerfile
docker build -t [seu login dockerhub]/app-estoque:1.0.0 .
#exemplo midianet/app-estoque:1.0.0 .
docker images
docker run -d --name app-comercial -h app-comercial --net apps midianet/app-comercial:1.0.0
docker run -d --name app-estoque -h app-estoque --net apps midianet/app-estoque:1.0.0
Crie o arquivo comercial.conf com o conteúdo do arquivo comercial.conf
depois crie o arquivo estoque.conf com o conteúdo do arquivo estoque.conf
cd ~/docker/nginx/conf.d
vim comercial.conf
vim estoque.conf
docker exec nginx nginx -s reload
- acesse http://comercial.local
- acesse http://estoque.local
Crie o arquivo portainer.conf com o conteúdo do arquivo portainer.conf
cd ~/docker/nginx/
vim portainer.conf
docker cp portainer.conf nginx:/etc/nginx/conf.d #copiando pra dentro
docker cp nginx:/var/log/dpkg.log . #copiando pra fora
cat dpkg.log
docker run -d --name portainer -h portainer -v /var/run/docker.sock:/var/run/docker.sock --net apps portainer/portainer-ce:2.9.3
docker exec nginx nginx -s reload
Acesse http://portainer.local/
apt-get install docker-compose
Veja a versão do docker-compose instalado:
docker-compose -v
Veja o help:
docker-compose -h
O docker-compose é escrito no formato yml. Para facilitar um entendimento, veja como seria o mesmo arquivo em formato json:
VER JSON
VER YML
Crie o arquivo docker-compose.yml com o conteúdo do arquivo docker-compose.yml
Como escolher sua versão do docker-compose: https://docs.docker.com/compose/compose-file/compose-versioning/
PID settings (–pid) Por padrão, todos os containers possuem o PID namespace habilitado. O Namespace PID remove o ponto de vista dos processos do sistema e permite IDs de processos para ser utilizado. Em alguns casos, você pode querer rodar alguma ferramenta de depuração em seu container para que ele consiga visualizar os processos do seu host, então basta iniciar o container com a opção de –pid ativada: ex docker run -it --rm --pid=host imagem É possível também utilizar o –pid para depurar as informações de outro container. Para isso, vamos iniciar a execução de um container com mongoDB e depois um container para realizar a depuração. ex: docker run --name mongo -d mongodb docker run --it --pid=container:mongo imagem
--dns por padrao usa o dns do host, mas vc pode pasar o dns específico --add-host adiciona hosts dentro do container
--security-opt limita quais comandos exigirão privilegios dentro do container como su sudo ex: security-opt no-new-privileges
--isolation linux(default) windows (process e hyper-v)
--device anexa um disco fisico do host no container