docker-compose існує для того, щоб вам не довелося писати багато команд, які вам доведеться виконати з docker-cli.
docker-compose також спрощує запуск декількох контейнерів одночасно та автоматично з'єднує їх разом із деякою формою мереж.
Мета docker-compose - функціонувати як docker cli, але набагато швидше видавати кілька команд.
Щоб використовувати docker-compose, вам потрібно кодувати команди, які ви виконували раніше, у docker-compose.ymlфайл.
Ви не просто збираєтесь скопіювати вставити їх у файл yaml, є спеціальний синтаксис.
Після створення ви повинні подати його до док-композиційного кліпу, і кліп повинен буде розібрати файл і створити всі різні контейнери з правильною конфігурацією, яку ми задаємо.
Отже, у вас будуть окремі контейнери, скажімо, наприклад, один є, redis-serverа другий є, node-appі ви хочете, що створено за допомогою Dockerfileу вашому поточному каталозі.
Крім того, зробивши цей контейнер, ви зіставите порт із контейнера на локальну машину, щоб отримати доступ до всього, що працює всередині нього.
Отже, для вашого docker-compose.ymlфайлу ви хочете почати перший рядок так:
version: '3'
Це повідомляє Docker версію, docker-composeяку ви хочете використовувати. Після цього потрібно додати:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
Зверніть увагу на відступ, дуже важливий. Також зауважте, що для однієї служби я захоплюю зображення, але для іншої послуги я кажу docker-composeзаглянути всередину поточного каталогу, щоб створити зображення, яке буде використано для другого контейнера.
Потім ви хочете вказати всі різні порти, які ви хочете відкрити на цьому контейнері.
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
-
Зауважте, тире, тире у файлі yaml - це те, як ми визначаємо масив. У цьому прикладі я зіставляю 8081свою локальну машину 8081з контейнером так:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "8081:8081"
Отже, перший порт - це ваша локальна машина, а другий - порт на контейнері, ви також можете розрізняти два, щоб уникнути плутанини на зразок:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "4001:8081"
Розвиваючи такий docker-compose.ymlфайл, він створить ці контейнери по суті одній і тій же мережі, і вони матимуть вільний доступ для спілкування один з одним будь-яким способом, яким вони захочуть, та обміном інформацією, скільки вони захочуть.
Коли два контейнери створені за допомогою, docker-composeнам не потрібні декларації портів.
Тепер у моєму прикладі нам потрібно зробити конфігурацію коду в додатку Nodejs, який виглядає приблизно так:
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
host: 'redis-server'
});
Я використовую цей приклад вище, щоб зрозуміти, що може бути певна конфігурація, яку вам доведеться зробити додатково до docker-compose.yml файлу, який може бути специфічним для вашого проекту.
Тепер, якщо ви коли-небудь опинитеся на роботі з додатком Nodejs і перепрофілюєте, ви хочете переконатися, що ви знаєте про порт за замовчуванням, який використовує Nodejs, і я додам це:
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
host: 'redis-server',
port: 6379
});
Тож Докер побачить, що шукає додаток Node redis-server і перенаправляє це з'єднання на цей запущений контейнер.
Весь час, Dockerfileєдине містить це:
FROM node:alpine
WORKDIR '/app'
COPY /package.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]
Отже, тоді як перед тим, як вам доведеться запустити, docker run myimageстворити екземпляр усіх контейнерів або служб всередині файлу, який ви можете замість цього запустити, docker-compose upі вам не потрібно вказувати зображення, оскільки Docker буде шукати в поточній робочій директорії і шукатиdocker-compose.yml файл всередині.
Раніше docker-compose.ymlнам доводилося мати справу з двома окремими командами docker build .та docker run myimage, але у docker-composeсвіті, якщо ви хочете відновити свої написані вами зображення docker-compose up --build. Це говорить Docker знову запускати контейнери, але відновлювати його, щоб отримати останні зміни.
Так що docker-composeполегшує роботу з декількома контейнерами. Наступного разу, коли вам потрібно запустити цю групу контейнерів у фоновому режимі, яку ви можете зробити, docker-compose up -dі зупинити їх, ви можете це зробити docker-compose down.