Baixar o Docker Compose para eliminar os container criados para o Host Driver:
Copy ~/compose$ docker compose -f host-compose.yaml down
[+] Running 3/3
✔ Container compose-nginx-1 Removed 0.0s
✔ Container compose-curl-1 Removed 0.0s
✔ Network compose_default Removed 0.7s
Remover o arquivo host-compose.yaml :
Copy ~/compose$ rm host-compose.yaml
Simulação de cenário
Ao executar o comando docker compose up -d os containers são criados numa ordem aleatória, pois as especificações do arquivos compose.yaml são apenas declarativas.
Copy ~/compose$ docker compose up -d
[+] Running 2/2
✔ Container compose-kubenews-1 Starte... 0.6s
✔ Container compose-postgre-1 Started 0.6s
Porém, muitas vezes, existem dependências entre os containers. Neste exemplo, o container kubenews depende do container postgre . Ou seja, a aplicação depende do banco de dados para se conectar a ele.
Faz sentido criar o container postgre antes do kubenews , por isso é necessário especificar as dependências dos containers no arquivo compose.yaml .
Ordenando a execução
Edição do arquivo compose.yaml para inserir no container kubenews a sua dependência do postgre :
Copy ~/compose$ vim compose.yaml
Copy services:
postgre:
image: postgres:13.16
ports:
- 5432:5432
environment:
POSTGRES_PASSWORD: kubenews
POSTGRES_USER: kubenews
POSTGRES_DB: kubenews
volumes:
- postgre-docker-vol:/var/lib/postgresql/data
networks:
- kubenews-net
kubenews:
image: marcelodpbarbieri/kube-news:v2
ports:
- 8080:8080
dependes_on:
- postgre
environment:
DB_DATABASE: kubenews
DB_USERNAME: kubenews
DB_PASSWORD: kubenews
DB_HOST: postgre
networks:
- kubenews-net
volumes:
postgre-docker-vol:
networks:
kubenews-net:
name: network-externa
external: true
driver: bridge
Destaque para:
Copy services:
postgre:
...
kubenews:
...
dependes_on:
- postgre
...
Com isso a ordem de execução especificada é aplicada:
Copy ~/compose$ docker compose down
[+] Running 2/2
✔ Container compose-kubenews-1 Remove... 10.6s
✔ Container compose-postgre-1 Removed 0.6s
~/compose$ docker compose up -d
[+] Running 2/2
✔ Container compose-postgre-1 Started 0.8s
✔ Container compose-kubenews-1 Starte... 1.1s
O depends_on é uma lista. Com isso é possível especificar que um container depende de um ou mais containers.
Por exemplo, criar mais um container nginx :
Copy services:
...
nginx:
image: nginx
depends_on:
- kubenews
...
Copy ~/compose$ docker compose down
[+] Running 4/4
✔ Container compose-kubenews-1 Remove... 10.6s
✔ Container compose-postgre-1 Removed 0.5s
✔ Network compose_default Removed 0.6s
~/compose$ docker compose up -d
[+] Running 4/4
✔ Network compose_default Created 0.1s
✔ Container compose-postgre-1 Started 0.5s
✔ Container compose-kubenews-1 Starte... 0.7s
✔ Container compose-nginx-1 Started 1.2s
Poderia especificar que o container postgre depende do container nginx , e que o container nginx deixa de depende do kubenews :
Copy services:
postgre:
image: postgres:13.16
ports:
- 5432:5432
depends_on:
- nginx
...
nginx:
image: nginx
O container nginx foi criado antes do container postgre :
Copy ~/compose$ docker compose down
[+] Running 4/4
✔ Container compose-kubenews-1 Remove... 10.5s
✔ Container compose-postgre-1 Removed 0.5s
✔ Container compose-nginx-1 Removed 0.5s
✔ Network compose_default Removed 0.8s
~/compose$ docker compose up -d
[+] Running 4/4
✔ Network compose_default Created 0.2s
✔ Container compose-nginx-1 Started 0.5s
✔ Container compose-postgre-1 Started 0.8s
✔ Container compose-kubenews-1 Starte... 1.1s
marcelo@Latitude5440:~/compose$
Dependência Circular
Cuidado para não criar uma dependência circular. No exemplo acima se o container nginx continuasse dependente do container kubenews.
No arquivo compose.yaml é possível verificar as especificações de que os containers são dependentes entre si:
nginx depende do kubenews
kubenews depende do postgre
Copy services:
postgre:
image: postgres:13.16
ports:
- 5432:5432
depends_on:
- nginx
environment:
POSTGRES_PASSWORD: kubenews
POSTGRES_USER: kubenews
POSTGRES_DB: kubenews
volumes:
- postgre-docker-vol:/var/lib/postgresql/data
networks:
- kubenews-net
kubenews:
image: marcelodpbarbieri/kube-news:v2
ports:
- 8080:8080
depends_on:
- postgre
environment:
DB_DATABASE: kubenews
DB_USERNAME: kubenews
DB_PASSWORD: kubenews
DB_HOST: postgre
networks:
- kubenews-net
nginx:
image: nginx
depends_on:
- kubenews
volumes:
postgre-docker-vol:
networks:
kubenews-net:
name: network-externa
external: true
driver: bridge
Copy ~/compose$ docker compose down
dependency cycle detected: kubenews -> postgre -> nginx -> kubenews
Retirando a dependência inserida para o container postgre a dependência cíclica é resolvida:
Copy services:
postgre:
image: postgres:13.16
ports:
- 5432:5432
environment:
POSTGRES_PASSWORD: kubenews
POSTGRES_USER: kubenews
POSTGRES_DB: kubenews
volumes:
- postgre-docker-vol:/var/lib/postgresql/data
networks:
- kubenews-net
...
Copy ~/compose$ docker compose down
[+] Running 4/4
✔ Container compose-nginx-1 Removed 0.5s
✔ Container compose-kubenews-1 Remove... 10.5s
✔ Container compose-postgre-1 Removed 0.4s
✔ Network compose_default Removed 0.8s
~/compose$ docker compose up -d
[+] Running 4/4
✔ Network compose_default Created 0.2s
✔ Container compose-postgre-1 Started 0.5s
✔ Container compose-kubenews-1 Starte... 0.8s
✔ Container compose-nginx-1 Started 1.2s
Last updated 9 months ago