docker-compose istnieje, abyś musiał pisać mnóstwo poleceń, które musiałbyś zrobić za pomocą docker-cli.
docker-compose ułatwia także uruchamianie wielu kontenerów jednocześnie i automatyczne łączenie ich ze sobą za pomocą jakiejś formy sieci.
Zadaniem kompilowania dokera jest funkcjonowanie jako cli dokera, ale znacznie szybsze wydawanie wielu poleceń.
Aby skorzystać z funkcji dokowania-komponowania, musisz zakodować wcześniej uruchomione polecenia w docker-compose.yml
pliku.
Nie tylko skopiujesz je wklej do pliku yaml, istnieje specjalna składnia.
Po utworzeniu musisz go przesłać do cli dokującej-skomponuj, a zadaniem cli będzie parsowanie pliku i utworzenie wszystkich różnych kontenerów z określoną przez nas poprawną konfiguracją.
Będziesz miał oddzielne kontenery, powiedzmy na przykład, że jeden jest, redis-server
a drugi jest node-app
i chcesz, aby został utworzony za pomocąDockerfile
w bieżącym katalogu.
Ponadto po utworzeniu tego kontenera można zmapować część portu z kontenera na maszynę lokalną, aby uzyskać dostęp do wszystkiego, co w nim działa.
Więc dla swojego docker-compose.yml
pliku chciałbyś rozpocząć pierwszą linię w następujący sposób:
version: '3'
To mówi Dockerowi, której wersji docker-compose
chcesz użyć. Następnie musisz dodać:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
Proszę zauważyć wcięcie, bardzo ważne. Zauważ też, że dla jednej usługi pobieram obraz, ale dla innej usługi każę docker-compose
zajrzeć do bieżącego katalogu, aby zbudować obraz, który będzie używany dla drugiego kontenera.
Następnie chcesz określić wszystkie różne porty, które chcesz otworzyć w tym kontenerze.
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
-
Zauważ, że myślnik, myślnik w pliku yaml to sposób określania tablicy. W tym przykładzie mapuję 8081
na moim komputerze lokalnym do 8081
kontenera w następujący sposób:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "8081:8081"
Tak więc pierwszy port to komputer lokalny, a drugi to port w kontenerze, możesz również rozróżnić oba, aby uniknąć nieporozumień:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "4001:8081"
Opracowując docker-compose.yml
taki plik, utworzy on te kontenery w zasadniczo tej samej sieci i będzie miał swobodny dostęp do komunikowania się ze sobą w dowolny sposób i wymiany dowolnych informacji.
Gdy dwa kontenery są tworzone przy użyciu docker-compose
, nie potrzebujemy żadnych deklaracji portów.
Teraz w moim przykładzie musimy wykonać konfigurację kodu w aplikacji Nodejs, która wygląda mniej więcej tak:
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
host: 'redis-server'
});
Korzystam z tego przykładu powyżej, aby poinformować Cię, że może istnieć pewna konkretna konfiguracja, którą musisz wykonać oprócz docker-compose.yml
pliku, który może być specyficzny dla twojego projektu.
Teraz, jeśli kiedykolwiek będziesz pracować z aplikacją Nodejs i redis, chcesz upewnić się, że znasz domyślny port, z którego korzysta Nodejs, więc dodam to:
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
host: 'redis-server',
port: 6379
});
Dlatego Docker zobaczy, że aplikacja Node szuka redis-server
i przekieruje to połączenie do tego działającego kontenera.
Cały czas Dockerfile
tylko to zawiera:
FROM node:alpine
WORKDIR '/app'
COPY /package.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]
Tak więc, podczas gdy zanim będziesz musiał uruchomić, docker run myimage
aby utworzyć instancję wszystkich kontenerów lub usług w pliku, możesz zamiast tego uruchomić docker-compose up
i nie musisz określać obrazu, ponieważ Docker będzie szukał w bieżącym katalogu roboczym i szukałdocker-compose.yml
plik tam.
Wcześniej docker-compose.yml
mieliśmy do czynienia z dwoma oddzielnymi poleceniami docker build .
i docker run myimage
, ale na docker-compose
świecie, jeśli chcesz odbudować swoje obrazy, piszesz docker-compose up --build
. To mówi Dockerowi, aby ponownie uruchomił kontenery, ale odbuduje go, aby uzyskać najnowsze zmiany.
Tak docker-compose
ułatwia pracę z wieloma pojemnikami. Następnym razem, gdy będziesz musiał uruchomić tę grupę kontenerów w tle, możesz to zrobić docker-compose up -d
i aby je zatrzymać, możesz to zrobić docker-compose down
.