Instalação de dependências e pacotes do docker:
# apt update && apt install apt-transport-https ca-certificates curl gnupg2 gnupg-agent software-properties-common -y
Opcional (nftables openssh-server nmap)
# curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg
# echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/trusted.gpg.d/docker.gpg] https://download.docker.com/linux/debian \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
# apt update && apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
# usermod -aG docker $USER <- Docker as a non-root user - $USER altere para outro usuário (OPCIONAL)
# docker info
....
WARNING: No swap limit support <- Caso apareça essa mensagem ajuste conforme abaixo, caso não reboot server
Edite o arquivo /etc/default/grub e adicione ou edite a linha GRUB_CMDLINE_LINUX para adicionar os dois valores na chave:
# vi /etc/default/grub
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
# update-grub
Reinicie o servidor para efetivar as configurações.
# reboot
Para verificar a versão instalada volte para o prompt como usuário.
$ groups
cdrom floppy audio dip video plugdev netdev docker
$ docker -v
Docker version 20.10.5, build 55c4c88
$ docker info
Client:
Debug Mode: false
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
...........
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
NFS
# mkdir /home/RESOURCES
# mount -t nfs4 -o _netdev,proto=tcp,port=2049,soft <IP_SERV_NFS>:/mnt/RESOURCES /home/RESOURCES
# vi /etc/fstab
<IP_SERV_NFS>:/mnt/STORAGE /home/RESOURCES nfs4 _netdev,proto=tcp,port=2049,soft 0 0
CIFS estrutura de diretório
# mkdir /RESOURCE/CONTAINER
# mkdir /RESOURCE/CONTAINER/log
# mkdir /RESOURCE/CONTAINER/<APP01>
# mkdir /RESOURCE/CONTAINER/<APP02>
* Segue lista de comandos para auxiliar no uso:
$ docker help
$ docker <COMANDO> --help
$ docker images <- lista as imagens
$ docker run <- roda um containers
$ docker run -i -t <IMAGE NAME> [command] <- acesso ao terminal. O parametro pode ser reduzido -it
$ docker run -it ubuntu
$ docker commit [container_ID] <IMAGE NAME> <- encerrar e commit
$ docker run -d <IMAGE NAME> [command] <- executando em backgroud
$ docker run --rm -it <IMAGE NAME> [command] <- eliminar após o uso
$ docker login <- login docker hub
$ docker pull <image_name> <- realizado download de imagens
$ docker search name <- buscar imagens
$ docker push <nomedousuario>/ngix <- enviando imagens
$ docker ps -a <- lista todos os containers em execução
$ docker exec -i -t <IMAGE NAME> [command] <- acesso ao terminal. O parametro pode ser reduzido -it
$ docker rm <NOME CONTAINER/ID> <- remove o container
$ docker rmi <NOME IMAGEM/ID> <- remove o container
$ docker rm $(docker ps -qa) <- lista e remove todos os container
$ docker rm `docker ps -qa` <- lista e remove todos os container
$ docker stop <NOME CONTAINER/ID> <- para o container
$ docker start <NOME CONTAINER/ID> <- para o container
$ docker kill <NOME CONTAINER/ID> <- mata o container
$ docker commit -m "Descrição" <NOME CONTAOINER/ID> <IMAGEM>/<APLICACAO>
$ docker build -t <NOME IMAGEM> /tmp/Dockerfile
$ docker inspect <NOME CONTAINER> <- Inspeciona as configuracoes do container
* docker system prune will delete ALL dangling data (i.e. In order: containers stopped, volumes without containers and images with no containers). Even unused data, with -a option.
$ docker container prune
$ docker image prune
$ docker network prune
$ docker volume prune
* For unused images, use docker image prune -a (for removing dangling and ununsed images). Warning: 'unused' means "images not referenced by any container": be careful before using -a
$ docker run --name <NOME DO CONTAINER> -e <VARIAVEL DE AMBIENTE> -d <NOME IMAGEM>
$ docker run --name database -e MYSQL_ROOT_PASSWORD=teste123 -d mysql
$ docker ps
$ docker run --name <NOME DO CONTAINER> --link <NOME DO CONTAINER>:<ALIAS> -e WORDPRESS_DB_PASSWORD=teste123 -p <PORTA DO HOST>:<PORTA DO CONTAINER> -d <NOME IMAGEM>
$ docker run --name blog --link database:mysql -e WORDPRESS_DB_PASSWORD=teste123 -p 80:80 -d wordpress
$ docker ps
$ docker exec -it <NOME CONTAINER/ID> bash <- inicia o bash
$ docker exec -it <NOME CONTAINER/ID> ps aux <- lista os processos dentro do container
$ docker run --rm -it <Nome imagem> bash <- executa um container nao persistente, este nao é listado no ps. considerado container descartavel
$ docker run -d -p 80:80 ubuntu/apache /usr/sbin/apache2ctl -D FOREGROUND
$ docker commit -m "Descrição" <NOME CONTAOINER/ID> ubuntu/apache <- imagem customizada com uma aplicação
$ docker run -it -p 8080:80 ubuntu/apache bash
$ docker run -it -p 80:80 ubuntu/apache bash
$ docker stop $(docker ps -qa) && docker rm $(docker ps -qa) && docker rmi $(docker images -qa) && docker volume rm $(docker volume ls -q) <- Comando para parar e remover todos containers, imagens e volumes criados.
* Habilitar acesso remoto de aplicações.
* Crie o diretorio
# mkdir /etc/systemd/system/docker.service.d
* Criar o arquivo de configuração
# vi /etc/systemd/system/docker.service.d/options.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H unix:// -H tcp://0.0.0.0:2375 <- O endereço 0.0.0.0 representa qualquer interface local, pode ser usado o IP do servidor (10.0.0.5)
* Reload systemd daemon.
# systemctl daemon-reload
* Restart Docker.
# systemctl restart docker
Caso o servidor Docker esteja apresentando um consumo excessivo de armazenamento é possível que algum container estaja consumindo, portando, acesse e verifique qual diretório esta consumindo muito recurso de disco:
# docker system df
# docker system prune -af && docker image prune -af && docker system prune -af --volumes
# du -sch /var/lib/docker/overlay2
# cd /var/lib/docker/containers
# du -ch -d 1
# systemctl restart docker.service
O UUID que apresentar o consumo de armazenamento alto é o que precisa ser refeito
185G ./3471f0894568675dc95ee652790ee89b5a0d20ab8c6d7fa36d24cf35036c8622
Identifique o container com o mesmo UUID e remova-o completamente e contrua-o novamente, depois disso o espaço sera liberado novamente
O comando abaixo define o timezone para o container
-e TZ=America/Sao_Paulo
Os comandos abaixo sincronizam o datetime e localtime com o host
-v /etc/timezone:/etc/timezone:ro
-v /etc/localtime:/etc/localtime:ro
* Estrutura de diretório e arquivos em STORAGE
..../STRG/DB <- $ chmod 775 .../STRG/DB -R
.../STRG/DOCKER <- $ chmod 775 .../STRG/DOCKER -R
.../STRG/DOCKER/dockercompose
.../STRG/DOCKER/dockercompose/docker-compose.yml <- Arquivo compose
.../STRG/DOCKER/dockercompose/.env <- Arquivo que contem variaveis para o arquivo compose
.../STRG/DOCKER/dockercompose/haproxy <- Diretório que contem o arquivo Dockerfile para o serviço
.../STRG/DOCKER/dockercompose/haproxy/Dockerfile <- Arquivo Dockerfile
.../STRG/DOCKER/dockercompose/haproxy/haproxy.cfg <- Arquivo que contem configurações que fazem parte do serviço instanciado pelo Dockerfile
####################################################################
(Em Desenvolvimento)
Docker e Firewall
Rever onde esta o arquivo de configuração do nftables.
# nft list ruleset
table ip filter {
chain INPUT {
type filter hook input priority 0; policy accept;
}
chain FORWARD {
type filter hook forward priority 0; policy drop;
counter packets 1254 bytes 1924569 jump DOCKER-USER
counter packets 1254 bytes 1924569 jump DOCKER-ISOLATION-STAGE-1
oifname "docker0" ct state related,established counter packets 779 bytes 881575 accept
oifname "docker0" counter packets 3 bytes 180 jump DOCKER
iifname "docker0" oifname != "docker0" counter packets 472 bytes 1042814 accept
iifname "docker0" oifname "docker0" counter packets 0 bytes 0 accept
}
chain OUTPUT {
type filter hook output priority 0; policy accept;
}
chain DOCKER {
iifname != "docker0" oifname "docker0" meta l4proto tcp ip daddr 172.17.0.2 tcp dport 9000 counter packets 3 bytes 180 accept
}
chain DOCKER-ISOLATION-STAGE-1 {
iifname "docker0" oifname != "docker0" counter packets 472 bytes 1042814 jump DOCKER-ISOLATION-STAGE-2
counter packets 1254 bytes 1924569 return
}
chain DOCKER-ISOLATION-STAGE-2 {
oifname "docker0" counter packets 0 bytes 0 drop
counter packets 472 bytes 1042814 return
}
chain DOCKER-USER {
counter packets 1254 bytes 1924569 return
}
}
table ip nat {
chain PREROUTING {
type nat hook prerouting priority -100; policy accept;
fib daddr type local counter packets 4 bytes 240 jump DOCKER
}
chain INPUT {
type nat hook input priority 100; policy accept;
}
chain POSTROUTING {
type nat hook postrouting priority 100; policy accept;
oifname != "docker0" ip saddr 172.17.0.0/16 counter packets 13 bytes 1110 masquerade
meta l4proto tcp ip saddr 172.17.0.2 ip daddr 172.17.0.2 tcp dport 9000 counter packets 0 bytes 0 masquerade
}
chain OUTPUT {
type nat hook output priority -100; policy accept;
ip daddr != 127.0.0.0/8 fib daddr type local counter packets 0 bytes 0 jump DOCKER
}
chain DOCKER {
iifname "docker0" counter packets 0 bytes 0 return
iifname != "docker0" meta l4proto tcp tcp dport 9000 counter packets 3 bytes 180 dnat to 172.17.0.2:9000
}
}
* ajustar o firewall local # cat /etc/nftables.conf
#!/usr/sbin/nft -f
define NETINTAG = 10.0.0.0/24
#define NETEXT = 168.181.48.247/32
define DNS = 8.8.8.8, 1.1.1.1, 208.67.222.222
define ANY = 0.0.0.0/0
define IFINT= "eth0"
define IFEXT= "eth1"
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
# REGRAS GERAIS
ct state invalid counter drop
icmp type timestamp-request counter drop
ct state {related,established} counter accept
iifname "lo" counter accept
iifname "docker0" counter accept
# REGRAS ADICIONAIS
iifname $IFINT ip protocol icmp ip saddr $NETINTAG counter accept # PING INT
iifname $IFEXT ip protocol icmp ip saddr $ANY counter accept # PING EXT
iifname $IFINT ip saddr $NETINTAG tcp dport {ssh,http,https} ct state {new,established} counter accept # SERVICOS INTAG
iifname $IFINT ip saddr $NETINTAG tcp dport 9000 ct state {new,established} counter accept # SERVICOS INTAG
counter drop
}
chain forward {
type filter hook forward priority 0; policy drop;
# REGRAS GERAIS
ct state invalid counter drop
icmp type timestamp-request counter drop
ct state {related,established} counter accept
# REGRAS ADICIONAIS
counter drop
}
chain output {
type filter hook output priority 0; policy drop;
# REGRAS GERAIS
ct state invalid counter drop
icmp type timestamp-request counter drop
ct state {related,established} counter accept
oifname "lo" counter accept
oifname "docker0" counter accept
# REGRAS ADICIONAIS
oifname $IFINT ip protocol icmp ip saddr $NETINTAG counter accept # PING INT
#oifname $IFINT ip daddr $NETINTAG tcp dport {389,587,3306,3307,10050,12345,12346} ct state {new,established} counter accept # SERVICOS WEB
oifname $IFINT ip daddr $NETINTAG tcp dport 9000 ct state {new,established} counter accept # SERVICOS WEB
oifname $IFINT ip daddr $ANY tcp dport {http,https} counter accept # WEB
oifname $IFINT ip daddr $ANY udp dport {domain,ntp} counter accept # DNS E NTP
counter drop
}
chain prerouting {
type filter hook prerouting priority 0; policy accept;
}
chain postrouting {
type filter hook postrouting priority 0; policy accept;
}
}
$ docker stop $(docker ps -qa) && docker rm $(docker ps -qa) && docker rmi $(docker images -qa) && docker volume rm $(docker volume ls -q) <- Comando para parar e remover containers, imagens e volumes
# docker help
# docker <COMANDO> --help
# docker images <- lista as imagens
# docker run <- roda um containers
# docker run -i -t <IMAGE NAME> [command] <- acesso ao terminal. O parametro pode ser reduzido -it
# docker run -it ubuntu
$ sudo apt-get update && apt-get install -y [pacote]
$ docker commit [container_ID] <IMAGE NAME> <- encerrar e commit
# docker run -d <IMAGE NAME> [command] <- executando em backgroud
# docker run --rm -it <IMAGE NAME> [command] <- eliminar após o uso
# docker login <- login docker hub
# docker pull <image_name> <- realizado download de imagens
# docker search name <- buscar imagens
# docker push <nomedousuario>/ngix <- enviando imagens
# docker ps -a <- lista todos os containers em execução
# docker exec -i -t <IMAGE NAME> [command] <- acesso ao terminal. O parametro pode ser reduzido -it
# docker rm <NOME CONTAINER/ID> <- remove o container
# docker rmi <NOME IMAGEM/ID> <- remove o container
# docker rm $(docker ps -qa) <- lista e remove todos os container
# docker rm `docker ps -qa` <- lista e remove todos os container
# docker stop <NOME CONTAINER/ID> <- para o container
# docker start <NOME CONTAINER/ID> <- para o container
# docker kill <NOME CONTAINER/ID> <- mata o container
# docker commit -m "Descrição" <NOME CONTAOINER/ID> <IMAGEM>/<APLICACAO>
# docker build -t <NOME IMAGEM> /tmp/Dockerfile
# docker inspect <NOME CONTAINER> <- Inspeciona as configuracoes do container
* docker system prune will delete ALL dangling data (i.e. In order: containers stopped, volumes without containers and images with no containers). Even unused data, with -a option.
# docker container prune
# docker image prune
# docker network prune
# docker volume prune
* For unused images, use docker image prune -a (for removing dangling and ununsed images). Warning: 'unused' means "images not referenced by any container": be careful before using -a
# docker run --name <NOME DO CONTAINER> -e <VARIAVEL DE AMBIENTE> -d <NOME IMAGEM>
# docker run --name database -e MYSQL_ROOT_PASSWORD=teste123 -d mysql
# docker ps
# docker run --name <NOME DO CONTAINER> --link <NOME DO CONTAINER>:<ALIAS> -e WORDPRESS_DB_PASSWORD=teste123 -p <PORTA DO HOST>:<PORTA DO CONTAINER> -d <NOME IMAGEM>
# docker run --name blog --link database:mysql -e WORDPRESS_DB_PASSWORD=teste123 -p 80:80 -d wordpress
# docker ps
# docker exec -it <NOME CONTAINER/ID> bash <- inicia o bash
# docker exec -it <NOME CONTAINER/ID> ps aux <- lista os processos dentro do container
# docker run --rm -it <Nome imagem> bash <- executa um container nao persistente, este nao é listado no ps. considerado container descartavel
# docker run -d -p 80:80 ubuntu/apache /usr/sbin/apache2ctl -D FOREGROUND
# docker commit -m "Descrição" <NOME CONTAOINER/ID> ubuntu/apache <- imagem customizada com uma aplicação
# docker run -it -p 8080:80 ubuntu/apache bash
# docker run -it -p 80:80 ubuntu/apache bash
## DOCKER FILE
* Save Dockerfile
FROM <IMAGEM>
RUN apt-get update && apt-get install -y apache2
EXPOSE 80
CMD ["/usr/sbin/apache2ctl","-D","FOREGROUND"]
# docker build -t ubuntu/apache .Dockerfile
# docker images
## DOCKER APP
# mkdir app
# touch index.html
# echo "<h1>HELLO WORLD!!!</h1>" > index.html
# touch database.config
- DOCKER FILE
FROM <IMAGEM>
RUN apt-get update && apt-get install -y apache2
ADD app/ /var/www/html
COPY app/ /var/www/html/app
EXPOSE 80
CMD ["/usr/sbin/apache2ctl","-D","FOREGROUND"]
# docker build -t ubuntu/apache .Dockerfile
# docker images
# docker ps
# docker kill <NOME CONTAINER>
# docker run -d -p 80:80 ubuntu/apache
# docker ps
# docker exec -it <NOME CONTAINER> ls /var/www/html
## ARQUIVO DE MANIFESTO - COMPOSE
- Save criar.blog.sh
#!/bin/bash
docker run --name mysql -e MYSQL_ROOT_PASSWORD=teste123 -d mysql
docker run --name blog -p 80:80 -d --link mysql:mysql wordpress
- Alternativa para os comandos acima
Save docker-compose.yml
db:
image: mysql
environment:
- MYSQL_ROOT_PASSWORD=teste123
ports:
- 3306:3306
blog:
image: wordpress
environment:
- WORDPRESS_DB_PASSWORD=teste123
links:
- db:mysql
ports:
- 80:80
# docker-compose up
# docker-compose up -d <- Com esta opcao suprime os logs
# docker-compose ps
# docker-compose kill
# docker-compose rm
# docker run --name mysql -e MYSQL_ROOT_PASSWORD=teste123 -p 3306:3306 -d mysql
# docker inspect mysql <- pegar o ip
# docker run --rm -it ubuntu bash
ping <IP mysql>
### LINK
# docker run --rm --link mysql:db -it ubuntu bash
### IMAGEM CONFIGURADA
# docker run -it -v $(pwd):/tmp ubuntu bash <- cria um volume entre o host e o container
# docker run --rm -it -v $(pwd):/tmp ubuntu bash
Save docker-compose.yml
db:
image: mysql
volumes:
- ~/database/:/var/lib/mysql <- grava na em um diretorio fora e quando recriado busca deste local
environment:
- MYSQL_ROOT_PASSWORD=teste123
ports:
- 3306:3306
blog:
image: wordpress
environment:
- WORDPRESS_DB_PASSWORD=teste123
links:
- db:mysql
ports:
- 80:80
# docker-compose up -d