Skip to content

Guia definitivo de Docker

Estevam edited this page May 8, 2023 · 1 revision

Guia definitivo de Docker

Container-Week

Docker

Portainer

Dockerfile

docker-compose

Volume

Swarm

Deploy a stack to a Swarm

Docker

Instalação

curl -fsSL https://get.docker.com/ | bash

Permissões para o usuário local

sudo groupadd docker
sudo gpasswd -a $USER docker
sudo setfacl -m user:$USER:rw /var/run/docker.sock

https://gist.github.com/rg3915/215567b490c973cd98900cb0a883ef69

Com isso você não precisa ficar digitando sudo na frente dos comandos do docker.

Ver a versão do docker

docker version

Mas caso você esteja numa máquina sem as devidas permissões, você precisa digitar

sudo docker version

Listar todos os containers

docker container ls
docker container ls -a

Primeiro docker container

docker run hello-world

Visualizar o container en execução

docker container ls

docker ps (este comando é obsoleto)

Visualizar todos os containers

docker container ls -a

Rodando containers no modo iterativo

docker container run -it nginx

Nota: sair com CTRL + P, Q, vai para segundo plano

Se você digitar CTRL + C o container "pára" e "morre".

Imagens

docker images

Rodando um container em modo Daemon

  • -d para rodar em background, ideal para uma aplicação web (só um exemplo), onde você pode liberar o terminal.
  • -it para executar interatividade com terminal
  • /bin/bash para que possa executar o terminal
  • ubuntu é o nome da imagem a ser executada, caso não exista será feito o download do dockerhub.

docker run -it ubuntu /bin/bash # sem o modo daemon

Saindo do container

Matar o container e sair

CTRL + D

Sair do container e deixar o mesmo em execução

CTRL + P, Q

Retornando ao container

docker attach CONTAINER ID

docker container run -d -p 8080:80 nginx *

onde 8080 é o host e 80 é a porta do container.

curl 0:8080

Executando comandos dentro do container

docker container exec -it ID bash ou /bin/bash dependendo da imagem.

Removendo o container

docker container rm -f ID

Criar container mas não coloca em execução

docker create ubuntu

Parar um container

docker stop CONTAINER ID

Iniciar o container

docker start CONTAINER ID

Pausar um container

docker pause CONTAINER ID

Tirar da pausa

docker unpause CONTAINER ID

Verificar os logs do container

docker logs CONTAINER ID

Verificar os processo em execução

docker top CONTAINER ID

Verificar quanto está consumindo de memória e CPU

docker stats CONTAINER ID

Remover um container, caso o mesmo esteja em execução

docker rm -f CONTAINER ID

Parar todos os container

docker stop $(docker ps -a -q)

Leia mais em https://blog.baudson.de/blog/stop-and-remove-all-docker-containers-and-images

Remover todos os containers parados

docker rm $(docker ps -a -q)

Remover imagem

docker image rm IMAGE ID

Volume

Volume sem especificar o local

docker run -it -v /volume /bin/bash

Local onde o docker monta o volume no host docker

docker inspect CONTAINER ID -f {{.Mounts}}

Especificando o local do volume

docker run -it -v /$HOME/meu_dir:/volume

docker image ls

update no serviço

docker service update --image linuxtips/nginx-prometheus-exporter:2.0.0 giropops

Swarm

O Swarm é um orquestrador de containers.

Balanceamento de carga, alta disponibilidade, cluster, service, escalar.

Iniciando um serviço

docker swarm init

Listar os nós

docker node ls

Entrar no cluster

docker swarm join ...

Pegar o token do cluster

docker swarm join-token manager

docker swarm join-token worker

Promover o nó para manager

docker node promote HOSTNAME # manager

Promover o nó para worker

docker node demote HOSTNAME # worker

Para que o cluster funcione é necessário que tenha mais que 51% de managers.

Inspecionar o nó

docker node inspect HOSTNAME

Criar service

Criar containers e expor para fora do cluster.

Faz balanceamento de carga.

docker swarm init
docker service create --name nginx -p 8080:80 --replicas 5 nginx

Listar os serviços

docker service ls

Listar onde estão rodando os containers

docker service ps nginx

Ver todos os logs em realtime

docker service logs -f nginx

Remover o serviço

docker service rm nginx

Criando um serviço com limites de CPU e memória

0.2 são 20% de 1 Core.

docker service create \
    --name nginx \
    -p 8080:80 \
    --replicas 1 \
    --limit-cpu 0.2 \
    --limit-memory 64M nginx

Ver o consumo do container

docker container stats ID

Alterar as réplicas do serviço

Ex: 1

docker service scale nginx=10

Ex: 2

docker service create --name nginx -p 8080:80 linuxtips/nginx-prometheus-exporter:1.0.0

Ex: 3

docker service scale giropops=10

Atualizar a versão do serviço

docker service update --image linuxtips/nginx-prometheus-exporter:1.0.0:2.0.0 giropops

github.com/badtuxx/giropops-monitoring

Dockerfile é para criar a imagem.

docker-compose é para criar a stack (conjunto) de aplicações.

Portainer

Gerenciador de containers.

https://www.portainer.io/

docker run -d \
--name myportainer \
-p 9000:9000 \
--restart always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /opt/portainer:/data \
portainer/portainer

Dockerfile

https://docs.docker.com/engine/reference/builder/

Ex: Adaptado de containerized-python-development-part-1.

image

Importante: No tutorial não fala sobre o

app.run(debug=True, host="0.0.0.0")

importante para a aplicação funcionar no navegador, fora do container.

A partir dai você pode testar acessando a aplicação em

http://0.0.0.0:5000/

Dica: para conferir quais portas estão expostas você pode digitar

netstat -atunp  # ou
netstat -atunp | grep '5000\|8000\|8080\|9000'

Criando o requirements.txt

echo "Flask==1.1.2" > requirements.txt

Criando um projeto em Flask, bem simples.

cat << EOF > server.py
from flask import Flask

app = Flask(__name__)


@app.route("/")
def hello():
    return "Hello World!"


if __name__ == "__main__":
    app.run(debug=True, host="0.0.0.0")
EOF

Criando o Dockerfile

cat << EOF > Dockerfile
ARG PYTHON_VERSION='3.8'

# set base image (host OS)
FROM python:3.8

ENV PYTHONUNBUFFERED 1

# set the working directory in the container
WORKDIR /code

# copy the dependencies file to the working directory
COPY requirements.txt .

# install dependencies
RUN pip install -r requirements.txt

# copy the content of the local src directory to the working directory
COPY app.py .

# Expose port
EXPOSE 5000

# command to run on container start
CMD [ "python", "app.py", "--host 0.0.0.0" ]
EOF

Gerando a imagem a partir do Dockerfile (gerando o build)

docker build -t my-flask-image:1.0 .

Gerando a imagem com um tamanho menor.

Isto requer um comando especial, leia tutorial.sh.

docker image build -t my-flask-image:2.0 \
--compress --force-rm --no-cache \
--rm --squash .

Listar as imagens

docker image ls

Criando uma rede

É recomendável criar uma rede antes.

docker network create mynetwork
docker network ls

Rodando o container

docker container run -d \
--name flask-project \
--hostname flask-project \
--network mynetwork \
-p 5000:5000 \
my-flask-image:1.0

docker container logs flask-project docker container exec -it flask-project bash

docker-compose

Instalação

sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version

https://docs.docker.com/compose/install/

Exemplo de projeto com docker-compose

image-compose

nginx

Crie uma pasta nginx e copie app.conf para dentro dela.

mkdir nginx

cat << EOF > nginx/app.conf
server {
    listen       80;
    server_name  127.0.0.1;

    location / {
        proxy_pass http://app:5000;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
    }
}
EOF

Obs: Repare que requirements.txt contém o gunicorn.

echo "gunicorn==20.0.4" >> requirements.txt

Em seguida crie o docker-compose.yml

cat << EOF > docker-compose.yml
version: '3.7'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: flask-app
    hostname: app
    stdin_open: true
    restart: always
    expose:
      - '5000'
    command: gunicorn -b 0.0.0.0:5000 app:app
    networks:
      - mynetwork

  nginx:
    image: nginx
    container_name: nginx
    hostname: nginx
    ports:
      - '80:80'
    volumes:
      - ./nginx:/etc/nginx/conf.d
    depends_on:
      - app
    networks:
      - mynetwork

networks:
  mynetwork:
EOF

Rodando o compose

docker-compose up --build -d

x-rey - Plugin do Docker

Volumes montados em diferentes nós.

curl -sSL https://rexray.io/install | sh -s -- stable

Editar

vim /etc/rexray/config.yml

rexray:
  logLevel: debug
libstorage:
  # for AWS
  service: ebs
  integration:
    volume:
      fileMode: 0777
      operations:
        mount:
          preempt: true
  server:
    services:
      ebs:
        driver: ebs
        ebs:
          accessKey:
          secretKey:
          region: us-east-1

systemctl restart rexray

systemctl status rexray

cd giropops-monitoring/
vim docker-compose.yml
version: '3'

services:

  prometheus:
    image: linuxtips/prometheus_alpine
    volumes:
      - prometheus_c:/etc/prometheus/
      - prometheus_d:/var/lib/prometheus
    deploy:
      update_config:
        parallelism: 1
        delay: 10s
        order: stop-first
      rollback_config:
        parallelism: 1
        delay: 10s
        monitor: 60s
        order: start-first
      resources:
        limits:
          cpus: '0.50'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 128M
    networks:
      - backend
    ports:
      - 9090:9090
  node-exporter:
    image: linuxtips/node-exporter_alpine
    hostname: '{{.Node.ID}}'
    volumes:
      - /proc:/usr/proc
      - /sys:/usr/sys
      - /:/rootfs
    deploy:
      mode: global
      update_config:
        parallelism: 1
        delay: 10s
        order: stop-first
    networks:
      - backend
    ports:
      - 9100:9100

  alertmanager:
    image: linuxtips/alertmanager_alpine
    deploy:
      update_config:
        parallelism: 1
        delay: 10s
        order: stop-first
    volumes:
      - alertmanager_c:/etc/alertmanager/
    networks:
      - backend
    ports:
      - 9093:9093

  cadvisor:
    image: google/cadvisor
    hostname: '{{.Node.ID}}'
    deploy:
      update_config:
        parallelism: 1
        delay: 10s
        order: stop-first
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
      - backend
    ports:
      - 8080:8080

  grafana:
    image: grafana/grafana
    deploy:
      update_config:
        parallelism: 1
        delay:10s
        order: stop-first
    volumes:
      - grafana_d:/grafana/data/grafana.db
    env_file:
      - grafana.config
    networks:
      - backend
      - frontend
    ports:
      - 3000:3000

networks:
  frontend:
  backend:

volumes:
  alertmanager_c:
    external: true
  grafana_d:
    external: true
  prometheus_c:
    external: true
  prometheus_d:
    external: true

Criar volume

docker volume create --driver rexray alertmanager_c
docker volume create --driver rexray grafana_d
docker volume create --driver rexray prometheus_c
docker volume create --driver rexray prometheus_d

docker volume ls

vim conf/alertmanager/config.yml

route:
  receiver: 'slack'

receivers:
- name: 'slack'
  slack_configs:
  - send_resolved: true
    username: 'you_name'
    channel: '#canal'
    api_url: 'https://hooks.slack.com/services/......'

vim conf/prometheus/prometheus.yml

rexray volume mount alertmanager_c
rexray volume mount grafana_d
rexray volume mount prometheus_c
rexray volume mount prometheus_d

Listar os volumes montados

$ df -h

cp conf/prometheus/* /var/lib/rexray/volumes/prometheus_c/data/
cp conf/alertmanager/* /var/lib/rexray/volumes/alertmanager_c/data/

Deploy a stack to a Swarm

https://docs.docker.com/engine/swarm/stack-deploy/

docker stack deploy -c docker-compose.yml giropops
docker stack ls
docker stack ps giropops
docker service ls

https://github.com/badtuxx/giropops-monitoring

Instalar rexray

https://rexray.readthedocs.io/en/stable/

configurar rexray

vim /etc/rexray/config.yml

*** AWS instance profile (variáveis de ambiente)

docker volume create --driver rexray grafana_d

$ df -h

docker stack deploy -c docker-compose.yml giropops

docker stack ps giropops

docker service ls

Wiki Sidebar

Este arquivo descreve o conteúdo da barra lateral da Wiki do projeto. A barra lateral da Wiki ajuda a navegar pelo conteúdo da Wiki e a acessar informações importantes rapidamente.

Barra Lateral da Wiki

Índice

Recursos

Suporte e Comunidade

Sobre

A barra lateral da Wiki é composta por várias seções que incluem links para as principais páginas da Wiki. A seção "Índice" lista todas as páginas principais, como introdução, arquitetura, roadmap, guias de instalação e uso, entre outras. A seção "Recursos" inclui links para recursos úteis, como glossário, tutoriais e ferramentas. A seção "Suporte e Comunidade" fornece links para fóruns de discussão, chats do projeto e issue trackers. Por fim, a seção "Sobre" inclui informações sobre a equipe, agradecimentos e outros detalhes relacionados ao projeto.

Clone this wiki locally