7.1 Montagem de Volumes
Montar volumes e redes no Docker Compose permite criar aplicações multicontêiner flexíveis e eficientes. Os volumes são usados para armazenar dados que precisam ser mantidos fora dos contêineres, enquanto as redes permitem a comunicação entre eles. Nesta aula, a gente vai explorar em detalhes como usar volumes e redes no Docker Compose.
Os volumes no Docker permitem que você armazene dados fora dos contêineres, garantindo sua disponibilidade mesmo depois que os contêineres forem parados ou deletados. Isso é particularmente útil para armazenar dados de bancos de dados, arquivos de log e outros dados que precisam ser persistentes.
Tipos de Volumes:
- Volumes Nomeados (Named Volumes): são gerenciados pelo Docker e armazenados em um diretório especial no host.
- Volumes Vinculados (Bind Mounts): são montados no contêiner a partir de um diretório específico no host.
Definição de Volumes no Docker Compose
Exemplo de Volumes Nomeados
Neste exemplo, foi criado um volume nomeado chamado postgres-data
, que é montado no diretório /var/lib/postgresql/data
dentro do contêiner db
.
version: '3.8'
services:
db:
image: postgres:latest
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
postgres-data:
Exemplo de Volumes Vinculados
Neste exemplo, os diretórios e arquivos locais nginx.conf
e html
são montados no contêiner web
como volumes vinculados.
version: '3.8'
services:
web:
image: nginx:latest
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
7.2 Montagem de redes
Redes no Docker Compose permitem que os containers interajam uns com os outros. Cada container pode ser conectado a uma ou mais redes, o que garante isolamento e controle de tráfego.
Tipos de redes:
- Redes bridge (Bridge): por padrão, os containers se conectam a uma rede bridge, que permite interação entre eles no mesmo host.
- Redes overlay (Overlay): usadas para interação entre containers executados em hosts diferentes dentro de um cluster Docker Swarm.
- Plugins de rede (Network Plugins): permitem usar drivers de terceiros para configurações mais complexas.
Exemplo de criação e uso de redes personalizadas
Neste exemplo, são criadas duas redes personalizadas: front-end e back-end. O serviço app está conectado a ambas as redes, o serviço web somente a front-end, e o serviço db somente a back-end.
version: '3.8'
services:
web:
image: nginx:latest
networks:
- front-end
app:
image: myapp:latest
networks:
- front-end
- back-end
db:
image: postgres:latest
networks:
- back-end
networks:
front-end:
back-end:
Dicas práticas:
- Uso de volumes nomeados: volumes nomeados são gerenciados pelo Docker e oferecem facilidade no uso e na gestão de dados. Esses volumes podem ser conectados a vários serviços ao mesmo tempo. Por exemplo, o serviço de backend grava logs, enquanto o serviço de monitoramento analisa esses logs e notifica quando erros de nível
error
são detectados. - Separação de redes: usar várias redes permite isolar diferentes partes da aplicação e controlar a interação delas.
- Armazenamento de arquivos de configuração: use volumes bind para montar arquivos de configuração, o que facilita a alteração de configurações sem reconstruir as imagens.
- Segurança das redes: restrinja o acesso às redes, permitindo que apenas os containers necessários interajam, o que aumenta a segurança da aplicação.
7.3 Exemplos de uso de volumes e redes
Exemplos de uso de volumes e redes no Docker Compose:
Exemplo 1: Aplicação com servidor web e banco de dados
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
networks:
- webnet
db:
image: postgres:latest
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
volumes:
- db-data:/var/lib/postgresql/data
networks:
- webnet
volumes:
db-data:
networks:
webnet:
Nesse exemplo:
- O servidor web nginx e o banco de dados PostgreSQL estão conectados a uma única rede webnet, permitindo que interajam. Caso exista apenas uma rede, ela não precisa ser especificada — será criada uma rede padrão.
- Os dados do banco de dados são armazenados em um volume nomeado db-data, garantindo que sejam preservados durante reinicializações dos containers.
Exemplo 2: Aplicação com múltiplos níveis
version: '3.8'
services:
frontend:
image: myfrontend:latest
networks:
- front-tier
- back-tier
backend:
image: mybackend:latest
networks:
- back-tier
volumes:
- backend-data:/var/lib/backend
database:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- db-data:/var/lib/mysql
networks:
- back-tier
volumes:
backend-data:
db-data:
networks:
front-tier:
back-tier:
Nesse exemplo:
- Foram criadas duas redes: front-tier e back-tier.
- O serviço frontend está conectado a ambas as redes, permitindo que ele interaja tanto com o backend quanto com clientes externos.
- Os serviços backend e database estão conectados apenas à rede back-tier, garantindo isolamento e interação entre eles.
- Os dados dos serviços backend e database são armazenados em volumes nomeados separados backend-data e db-data.
GO TO FULL VERSION