19 de agosto de 2020 • 6 min de leitura
Docker
Primeiros passos com Docker
por Guilherme Alves
Docker
O que é?
Tecnologia utilizada para baratear o custo de hospedar várias aplicações em uma mesma máquina.
Diferença entre entre Dokcer e VM.
Virtualização é a tecnologia que virtualiza os drivers do pc o que se torna várias máquinas rodando em uma unica máquina.
Melhor aproveitamento dos recursos do servidor.
Problemas da virtualização, cada aplicação com um sistema operacional por VM e isso é custoso tanto na configuração quanto no consumo de hardwares.
Containers são lugares onde a aplicação ira ser executada e eles rodarão sobre o sistema operacional do servidor. É mais leve pois só tem o SO do servidor e eles compartilham os recursos do SO.
Um container funcionará junto do nosso sistema operacional base, e conterá a nossa aplicação, ou seja, a aplicação será executada dentro dele. Criamos um container para cada aplicação, e esses containers vão dividir as funcionalidades do sistema operacional.
Com os containers, conseguimos limitar o consumo de CPU das aplicações, melhorando o controle sobre o uso de cada recurso do nosso sistema (CPU, rede, etc). Também temos uma facilidade maior em trabalhar com versões específicas de linguagens/bibliotecas, além de ter uma agilidade maior na hora de criar e subir containers, já que eles são mais leves que as máquinas virtuais.
Instalação
Layered File System
Imagens com várias camadas. Camadas podem ser compartilhadas e são somente read only. Podem ser aproveitadas por vários containers
Volumes
O volume fica no Docker Host. Ou seja, fica salvo no computador onde a Docker Engine está rodando.
Persistir dados com containers, pois os containers são voláteis.
Exemplo:
docker run -v "C:\Users\develop:/var/www" ubuntuO parâmetro -v (volume) primeira parte é o caminho na sua máquina e o segundo é o caminho no container
Mesmo após o container ser removido os dados desse path não serão destruídos juntos.
Exemplo executando um código salvo em uma pasta em um container:
docker run -p 8080:3000 -v "C:\Users\develop\repo\volume-exemplo:/var/www" -w "/var/www" node npm start-w working directory aponta onde, qual pasta ou path, o container deve iniciar
Criando imagens personalizadas usando Dockerfile
FROM comando pra aproveitar imagem base
MAINTAINER pessoa responsavel
ENV variaveis de ambiente
COPY copia pra dentro da imagem
WORKDIR assim que o container carregar no caminho especificado
RUN comando que roda enquanto está construindo a imagem
ENTRYPOINT comando que será executado assim que terminar de construir o container
EXPOSE porta que será aberta
Exemplo:
FROM node:latest
MAINTANER Guilherme Alves
ENV PORT=3000
COPY . /var/www
WORKDIR /var/www
RUN npm install
ENTRYPOINT npm start
EXPOSE $PORTdocker build -f <nome do arquivo> -t <tag> . <contexto>
docker run -d -p 8080:3000 <tag>Subir para dockerhub
docker login
docker push
Network
Comunicando vários containers.
Na rede default eles se comunicam apenas por IP
Comando para criar sua própria rede:
docker network create --driver bridge <nome-da-rede>Existem outros drivers mas o mais comum é o bridge
Atrelar o contêiner na rede criada:
docker run --name <nome-do-container> --netowrk <nome-da-rede> <imagem>Com isso conseguimos nos comunicar entre os contêiner pelo nome.
Docker Compose
Ferramenta para facilitar, automatizar e prever falhas para comunicação entre containers.
Todo o processo é escrito em um arquivo chamado docker-compose.yml
Instalação
Docker Compose Install Documentation
Exemplo de uma aplicação com um banco de dados MySQL, uma aplicação NodeJS e um Load Balance com NGINX
version: '3' //versão do docker compose
services: //nome dos serviços que vão ser rodados
nginx: // aqui é feita a condfiguração do NGINX que é um container que possui um Dokcerfile
build:
dockerfile: ./docker/nginx.dockerfile //dizemos onde está o arquivos Dockerfile que deve ser buildado
context: . //a partir de onde ele tem que buscar
image: <nome-da-imagem> //nome da imagem
container_name: nginx //nome pro container
ports: //mapear as portas que serão expostas
- "80:80" //porta de fora:porta de dentro
networks:
- production-network //nome da network criada abaixo
depends_on:
- "node" //o nginx só sobe depois que o node subir
mongodb:
image: mongo //imagem padrão
networks:
- production-network
node:
build:
dockerfile: //path de onde está o Dockerfile
context: . //a partir de onde procurar o Dockerfile
image: //nome da imagem
container_name: //nome dado ao container
ports:
- "3000"
networks:
- production-network
depends_on:
- "mongo" //indica que o node só vai subir depois que o mongo subir
networks: //criando a rede pra comunicação dos containers
production-network: //nome que você quiser
driver: bridgeExecutando:
docker-compose build //buildar imagens
docker-compose up -d //subir containers a partir do compose
docker-compose ps //lista todos
docker-compose down //terminar todos os containers
docker-compose restart //restarta os containersInstalando Docker Compose
sudo curl -L https://github.com/docker/compose/releases/download/1.15.0/docker-compose-`uname -s-uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-composeComandos Básicos
- Comandos relacionados às informações
- docker version - exibe a versão do docker que está instalada.
- docker inspect ID_CONTAINER - retorna diversas informações sobre o container.
- docker ps - exibe todos os containers em execução no momento.
- docker ps -a - exibe todos os containers, independentemente de estarem em execução ou não.
- Comandos relacionados à execução
- docker run NOMEDAIMAGEM - cria um container com a respectiva imagem passada como parâmetro.
- docker run -it NOMEDAIMAGEM - conecta o terminal que estamos utilizando com o do container.
- docker run -d -P —name NOME dockersamples/static-site - ao executar, dá um nome ao container.
- docker run -d -p 12345:80 dockersamples/static-site - define uma porta específica para ser atribuída à porta 80 do container, neste caso 12345.
- docker run -v “CAMINHOVOLUME” NOMEDA_IMAGEM - cria um volume no respectivo caminho do container.
- docker run -it —name NOMECONTAINER —network NOMEDAREDE NOMEIMAGEM - cria um container especificando seu nome e qual rede deverá ser usada.
- Comandos relacionados à inicialização/interrupção
- docker start ID_CONTAINER - inicia o container com id em questão.
- docker start -a -i ID_CONTAINER - inicia o container com id em questão e integra os terminais, além de permitir interação entre ambos.
- docker stop ID_CONTAINER - interrompe o container com id em questão.
- Comandos relacionados à remoção
- docker rm ID_CONTAINER - remove o container com id em questão.
- docker container prune - remove todos os containers que estão parados.
- docker rmi NOMEDAIMAGEM - remove a imagem passada como parâmetro.
- Comandos relacionados à construção de Dockerfile
- docker build -f Dockerfile - cria uma imagem a partir de um Dockerfile.
- docker build -f Dockerfile -t NOMEUSUARIO/NOMEIMAGEM - constrói e nomeia uma imagem não-oficial.
- docker build -f Dockerfile -t NOMEUSUARIO/NOMEIMAGEM CAMINHO_DOCKERFILE - constrói e nomeia uma imagem não-oficial informando o caminho para o Dockerfile.
- Comandos relacionados ao Docker Hub
- docker login - inicia o processo de login no Docker Hub.
- docker push NOMEUSUARIO/NOMEIMAGEM - envia a imagem criada para o Docker Hub.
- docker pull NOMEUSUARIO/NOMEIMAGEM - baixa a imagem desejada do Docker Hub.
- Comandos relacionados à rede
- hostname -i - mostra o ip atribuído ao container pelo docker (funciona apenas dentro do container).
- docker network create —driver bridge NOMEDAREDE - cria uma rede especificando o driver desejado.
- Comandos relacionados ao docker-compose
- docker-compose build - Realiza o build dos serviços relacionados ao arquivo docker-compose.yml, assim como verifica a sua sintaxe.
- docker-compose up - Sobe todos os containers relacionados ao docker-compose, desde que o build já tenha sido executado.
- docker-compose down - Para todos os serviços em execução que estejam relacionados ao arquivo docker-compose.yml.