Tradução da transcrição do podcast preparada antes do início do curso
Docker Compose é uma ferramenta incrível para criar um ambiente funcional
ambiente para a pilha usada em seu aplicativo. Ele permite que você defina
cada componente da sua aplicação, seguindo uma sintaxe clara e simples em
arquivos
Com o advento de
conjunto
Mas isso significa que você pode usar o mesmo arquivo docker-compose em
processo de desenvolvimento e no ambiente de produção? Ou use o mesmo arquivo para
encenação? Bem, em geral sim, mas para esta funcionalidade precisamos do seguinte:
- Interpolação de variáveis: usando variáveis de ambiente para alguns
valores que mudam em cada ambiente. - Substituição de configuração: capacidade de definir um segundo (ou qualquer
outro arquivo docker-compose subseqüente que mudará algo em relação
primeiro, e o docker compose cuidará da mesclagem dos dois arquivos.
Diferenças entre arquivos de desenvolvimento e produção
Durante o desenvolvimento, você provavelmente desejará verificar as alterações de código em
tempo real. Para fazer isso, normalmente o volume com o código fonte é montado em
contêiner que contém o tempo de execução do seu aplicativo. Mas para um ambiente de produção
Este método não é adequado.
Na produção, você tem um cluster com muitos nós e o volume é local
em relação ao nó no qual seu contêiner (ou serviço) está sendo executado, para que você não
você pode montar o código-fonte sem operações complexas que incluem
sincronização de código, sinais, etc.
Em vez disso, geralmente queremos criar uma imagem com uma versão específica do seu código.
É costume marcá-lo com a tag apropriada (você pode usar semântica
versionamento ou outro sistema a seu critério).
Substituição de configuração
Dadas as diferenças e que suas dependências podem diferir em cenários
desenvolvimento e produção, é claro que precisaremos de diferentes arquivos de configuração.
Docker compose suporta mesclar diferentes arquivos de composição para
obter a configuração final. Como isso funciona pode ser visto no exemplo:
$ cat docker-compose.yml
version: "3.2"
services:
whale:
image: docker/whalesay
command: ["cowsay", "hello!"]
$ docker-compose up
Creating network "composeconfigs_default" with the default driver
Starting composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1 | ________
whale_1 | < hello! >
whale_1 | --------
whale_1 |
whale_1 |
whale_1 |
whale_1 | ## .
whale_1 | ## ## ## ==
whale_1 | ## ## ## ## ===
whale_1 | /""""""""""""""""___/ ===
whale_1 | ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~
whale_1 | ______ o __/
whale_1 | __/
whale_1 | __________/
composeconfigs_whale_1 exited with code 0
Como dito, docker compose suporta a combinação de múltiplas composições -
arquivos, isso permite substituir vários parâmetros no segundo arquivo. Por exemplo:
$ cat docker-compose.second.yml
version: "3.2"
services:
whale:
command: ["cowsay", "bye!"]
$ docker-compose -f docker-compose.yml -f docker-compose.second.yml up
Creating composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1 | ______
whale_1 | < bye! >
whale_1 | ------
whale_1 |
whale_1 |
whale_1 |
whale_1 | ## .
whale_1 | ## ## ## ==
whale_1 | ## ## ## ## ===
whale_1 | /""""""""""""""""___/ ===
whale_1 | ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~
whale_1 | ______ o __/
whale_1 | __/
whale_1 | __________/
composeconfigs_whale_1 exited with code 0
Esta sintaxe não é muito conveniente durante o desenvolvimento, quando o comando
precisará ser feito muitas vezes.
Felizmente, o docker compose procura automaticamente um arquivo especial chamado
docker-compose.override.yml para substituir valores docker-compose.yml. Se
renomeie o segundo arquivo, você obterá o mesmo resultado, apenas usando o comando original:
$ mv docker-compose.second.yml docker-compose.override.yml
$ docker-compose up
Starting composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1 | ______
whale_1 | < bye! >
whale_1 | ------
whale_1 |
whale_1 |
whale_1 |
whale_1 | ## .
whale_1 | ## ## ## ==
whale_1 | ## ## ## ## ===
whale_1 | /""""""""""""""""___/ ===
whale_1 | ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~
whale_1 | ______ o __/
whale_1 | __/
whale_1 | __________/
composeconfigs_whale_1 exited with code 0
Ok, isso é mais fácil de lembrar.
Interpolação de Variáveis
Suporte a arquivos de configuração
variáveis
services:
my-service:
build:
context: .
image: private.registry.mine/my-stack/my-service:${MY_SERVICE_VERSION:-latest}
...
E se você fizer compilação docker-compose (ou push) sem variável de ambiente
$MY_SERVICE_VERSION, o valor será usado mais recentemas se você definir
o valor da variável de ambiente antes da construção, ela será usada ao construir ou enviar
para o registro private.registry.mine.
Meus principios
As abordagens que funcionam para mim podem funcionar para você também. Eu sigo estes
regras simples:
- Todas as minhas pilhas para produção, desenvolvimento (ou outros ambientes) são definidas através
arquivos docker-compose - Arquivos de configuração necessários para cobrir todos os meus ambientes, tanto quanto possível
evite duplicação. - Preciso de um comando simples para funcionar em cada ambiente.
- A configuração principal está definida no arquivo docker-compose.yml.
- Variáveis de ambiente são usadas para definir tags de imagem ou outras
variáveis que podem variar de ambiente para ambiente (preparação, integração,
Produção). - Os valores das variáveis de produção são usados como valores para
por padrão, isso minimiza os riscos se a pilha for lançada em produção sem
definir variável de ambiente. - Para iniciar um serviço em um ambiente de produção, use o comando implantação da pilha do docker - compose-file docker-compose.yml -with-registry-auth meu-nome da pilha.
- O ambiente de trabalho é iniciado usando o comando docker-compose up -d.
Vejamos um exemplo simples.
# docker-compose.yml
...
services:
my-service:
build:
context: .
image: private.registry.mine/my-stack/my-service:${MY_SERVICE_VERSION:-latest}
environment:
API_ENDPOINT: ${API_ENDPOINT:-https://production.my-api.com}
...
И
# docker-compose.override.yml
...
services:
my-service:
ports: # This is needed for development!
- 80:80
environment:
API_ENDPOINT: https://devel.my-api.com
volumes:
- ./:/project/src
...
Eu posso usar docker-compose (docker-compose up)para executar a pilha
modo de desenvolvimento com código-fonte montado em /projeto/src.
Posso usar esses mesmos arquivos na produção! E eu definitivamente poderia usar
mesmo arquivo docker-compose.yml para encenação. Para expandir isso para
produção, só preciso construir e enviar a imagem com uma tag pré-definida
na fase CI:
export MY_SERVICE_VERSION=1.2.3
docker-compose -f docker-compose.yml build
docker-compose -f docker-compose.yml push
Na produção, isso pode ser executado usando os seguintes comandos:
export MY_SERVICE_VERSION=1.2.3
docker stack deploy my-stack --compose-file docker-compose.yml --with-registry-auth
E se você quiser fazer o mesmo no palco, basta definir
variáveis de ambiente necessárias para trabalhar no ambiente de teste:
export MY_SERVICE_VERSION=1.2.3
export API_ENDPOINT=http://staging.my-api.com
docker stack deploy my-stack --compose-file docker-compose.yml --with-registry-auth
Como resultado, usamos dois arquivos docker-compose diferentes, que sem
Configurações duplicadas podem ser usadas para qualquer ambiente que você tiver!
Saiba mais sobre o curso
Fonte: habr.com