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.ymlpliku.
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-servera drugi jest node-appi 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.ymlpliku chciałbyś rozpocząć pierwszą linię w następujący sposób:
version: '3'
To mówi Dockerowi, której wersji docker-composechcesz 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-composezajrzeć 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ę 8081na moim komputerze lokalnym do 8081kontenera 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.ymltaki 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-serveri przekieruje to połączenie do tego działającego kontenera.
Cały czas Dockerfiletylko 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 myimageaby utworzyć instancję wszystkich kontenerów lub usług w pliku, możesz zamiast tego uruchomić docker-compose upi 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.ymlmieliś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-composeuł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 -di aby je zatrzymać, możesz to zrobić docker-compose down.