Local: UFT (Reitoria)
Instrutor: Aislan Max (aislan[a]uft.edu.br)
Prática 1)
- Instanciar mysql
docker container run -d --name db -e MYSQL_ROOT_PASSWORD=dbdbdb -e MYSQL_DATABASE=wordpress --restart=allways mysql:5.7
- Instanciar wordpress e ligar no
docker container run -d -P --link db:db --name web1 wordpress
- Instanciar drupal e ligar no mysql
docker container run -d -P --link db:db --name web2 drupal
- Instanciar o phpmyadmin
docker container run -d -p 8010:80 -e MYSQL_ROOT_PASSWORD=dbdbdb --name phpmyadmin --link db:db phpmyadmin/phpmyadmin
- FROM
- LABEL
- ENV
- CMD
- WORKDIR
- COPY
- ADD
- VOLUME
- RUN
- EXPOSE
- USER
- ENTRYPOINT
docker build -t <name>:1 .
O Docker permite que o usuário crie redes, permitindo que os containers se enxerguem sem a necessidade de passar o parâmetro link na linha de comando
docker network create -d bridge <nome da rede>
Exemplo de uso
docker container run -d --name db --net <nome da rede> mysql
docker container run -d -P --name web --net <nome da rede> wordpress
Se precisar ter um limite de reinicializações em caso de falha:
docker run -d --name restart-3 --restart=on-failure:3 php:7-apache
Ou
docker run -d --name restart-always --restart=restart:always php:7-apache
Para visualizar os logs de um container
docker container logs -f <container>
Existem alguns drives de log que podem ser utilizados no docker:
- none
- json-file
- syslog
- journald
- gelf
- fluentd
- awslogs
- awslogs
- splunk
- etwlogs
- gcplogs
Criar link simbolico do arquivo de log para outra saida
ln -sf /dev/stdout /var/log/apache2/access.log
ln -sf /dev/stderr /var/log/apache2/error.log
Problemas comuns que ocorrem com os logs
- espaço em disco
- travamento de instância
- consumo de memória
Para resolver, podemos utilizar o logrotate:
- logrotate --> /etc/logrotate.d/docker
/var/lib/docker/containers/*/*.log {
daily
rotate 3 ## --> qtd de dias de retenção do log
compress
delaycompress
missingok
copytruncate
}
docs.docker.com/config/containers/logging/configure
#!/bin/bash
set -e
set - start.sh "$@"
exec "$@"
#!/bin/bash
set -e
exec /usr/sbin/httpd -DFOREGROUND "$@"
PS: Uma imagem pronta para produção deve ter:
- expose
- workdir
- entrypoint
- volumes
- logs
docker rmi $(docker images -qa) --force
docker container stop $(docker container ls -q)
docker container rm $(docker container ls -qa)
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
- um app por container
- instale apenas o que você precisa
- revise quem tem acesso aos hosts do Docker
- Use a versão mais recente
- Evite rodar container como root
O Alpine é uma distribuição criada exclusivamente para o Docker
- add: adiciona pacotes
- del: remove pacotes
- fix: tenta reparar ou reinstalar um pacote
- update: atualiza a lista de pacotes
- info: imprime a lista de pacotes instalados ou disponíveis
- search: pesquisa pacotes
- upgrade: upgrade dos pacotes instalados
- cache: operações de manutenção no cache local de repositório
- version: comparar versões de pacotes instalados e disponíveis
Para checar os arquivos dentro de uma imagem:
docker container run --rm -it <container> <comando>
Para criar a tag da imagem:
docker image tag <imagem> <usuario>/<imagem>
Para enviar para o dockerhub:
docker login
docker image push <usuario>/<imagem>
Se precisar manter uma cópia de algum repositório, para evitar possíveis atualizações pelos mantenedores. Nota: essa imagem é alguma que você já tenha feito o download
docker image tag <imagem>:<versao> <usuario>:<imagem>
docker image push <usuario>/<imagem>
O registry2 é o sistema de repositório privado disponibilizado pelo Docker
Instalar o registry:
docker container run -d -p 5000:5000 --name registry registry:2
Baixar a imagem do docker hub
docker pull alpine
Alterando a tag para enviar para o registry
docker image tag alpine localhost:5000/alpine
Enviando
docker push localhost:5000/alpine
mv <certificado>.crt <certificado>.cer
cat <certificado>.cer interdiate.pem > <certificado>.crt
O Docker machine é um app para gerenciar imagens em servidores remotos
Instalação: https://docs.docker.com/machine/install-machine/
Dependências para testar em desenvolvimento (Linux):
- Virtualbox
docker-machine create -d virtualbox default
Permite a criação de clusters docker
- Utiliza rede do tipo overlay
- Nodes: manager / worker
- service:
- stack:
- node:
- secret: gerencia dados sensíveis
docker-machine create -d virtualbox manager
docker-machine create -d virtualbox node1
docker-machine create -d virtualbox node2
cria env para acessar manager
docker-machine env manager
eval $(docker-machine env manager) ## Acessa o env do docker
iniciar o swarm
docker swarm init --advertise-addr=<ip do servidor>
Será gerado um token para adicionar as maquinas clientes deste manager.
vamos iniciar os outros nodes
docker-machine env node01
eval $(docker-machine env node01)
docker swarm join --token <token> <ip>
docker-machine env node02
eval $(docker-machine env node02)
docker swarm join --token <token> <ip>
se for usar linha de comando
docker service
Se for usar docker-compose.yml
docker stack deploy --compose-file=<file>
- exemplo de paralelismo
docker service update --limit-cpu 0.3 --update-parallelism 1 ### Limite de cpu=0.3 | Paralelismo=1
docker service update --limit-cpu 0.3 --update-parallelism 2 ### Limite de cpu=0.3 | Paralelismo=2