O docker-compose existe para impedir que você escreva uma tonelada de comandos que você precisaria com o docker-cli.
O docker-compose também facilita a inicialização de vários contêineres ao mesmo tempo e os conecta automaticamente a alguma forma de rede.
O objetivo do docker-compose é funcionar como docker cli, mas emitir vários comandos muito mais rapidamente.
Para usar o docker-compose, é necessário codificar os comandos que você estava executando antes em um docker-compose.yml
arquivo.
Você não apenas copiará colá-los no arquivo yaml, há uma sintaxe especial.
Depois de criado, você deve alimentá-lo com o docker-composi cli e caberá ao cli analisar o arquivo e criar todos os diferentes contêineres com a configuração correta especificada.
Portanto, você terá contêineres separados, digamos, por exemplo, um é redis-server
e o segundo é node-app
e você deseja que seja criado usando oDockerfile
diretório atual.
Além disso, depois de criar esse contêiner, você mapeia alguma porta do contêiner para a máquina local para acessar tudo o que está sendo executado dentro dele.
Portanto, para o seu docker-compose.yml
arquivo, você deseja iniciar a primeira linha da seguinte maneira:
version: '3'
Isso informa ao Docker a versão que docker-compose
você deseja usar. Depois disso, você deve adicionar:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
Por favor, observe o recuo, muito importante. Além disso, observe que, para um serviço, estou capturando uma imagem, mas para outro serviço, digo docker-compose
para procurar dentro do diretório atual para criar a imagem que será usada para o segundo contêiner.
Então você deseja especificar todas as portas diferentes que deseja abrir neste contêiner.
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
-
Observe o traço, um traço em um arquivo yaml é como especificamos uma matriz. Neste exemplo, estou mapeando 8081
na minha máquina local para 8081
o contêiner da seguinte forma:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "8081:8081"
Portanto, a primeira porta é sua máquina local e a outra é a porta do contêiner, você também pode distinguir entre as duas para evitar confusão da seguinte maneira:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "4001:8081"
Ao desenvolver seu docker-compose.yml
arquivo como este, ele criará esses contêineres essencialmente na mesma rede e eles terão acesso livre para se comunicarem da maneira que quiserem e trocarão as informações que desejarem.
Quando os dois contêineres são criados docker-compose
, não precisamos de nenhuma declaração de porta.
Agora, no meu exemplo, precisamos fazer alguma configuração de código no aplicativo Nodejs que se parece com isso:
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
host: 'redis-server'
});
Eu uso este exemplo acima para informá-lo de que pode haver alguma configuração específica que você precisaria fazer além do docker-compose.yml
arquivo que pode ser específico ao seu projeto.
Agora, se você se encontrar trabalhando com um aplicativo Nodejs e redis, desejará garantir que você esteja ciente da porta padrão que o Nodejs usa, então adicionarei isto:
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
host: 'redis-server',
port: 6379
});
Portanto, o Docker verá que o aplicativo Node está procurando redis-server
e redireciona essa conexão para esse contêiner em execução.
O tempo todo, o Dockerfile
único contém isso:
FROM node:alpine
WORKDIR '/app'
COPY /package.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]
Portanto, enquanto antes você precisaria executar docker run myimage
para criar uma instância de todos os contêineres ou serviços dentro do arquivo, você pode executar docker-compose up
e não precisa especificar uma imagem porque o Docker procurará no diretório de trabalho atual e procurará umdocker-compose.yml
arquivo dentro de lá.
Antes docker-compose.yml
, tínhamos que lidar com dois comandos separados de docker build .
e docker run myimage
, mas no docker-compose
mundo, se você deseja reconstruir suas imagens que escreve docker-compose up --build
. Isso diz ao Docker para reiniciar os contêineres, mas reconstruí-lo para obter as alterações mais recentes.
Isso docker-compose
facilita o trabalho com vários contêineres. Na próxima vez que você precisar iniciar esse grupo de contêineres em segundo plano, poderá fazer docker-compose up -d
e pará-los docker-compose down
.