Docker Compose-handleiding voor beginners

De auteur van het artikel, dat we vandaag publiceren, zegt dat het bedoeld is voor ontwikkelaars die Docker Compose willen leren en op weg zijn om hun eerste client-server-applicatie te maken met Docker. Er wordt aangenomen dat de lezer van dit materiaal bekend is met de basisprincipes van Docker. Mocht dit niet het geval zijn, dan kun je er even naar kijken deze reeks materialen deze een bericht over de basisprincipes van Docker samen met de basisprincipes van Kubernetes, en deze artikel voor beginners.

Docker Compose-handleiding voor beginners

Wat is Docker Compose?

Docker Compose is een tool die bij Docker wordt geleverd. Het is ontworpen om problemen op te lossen die verband houden met de inzet van projecten.

Terwijl je de basisprincipes van Docker leerde, ben je misschien de eenvoudigste applicaties tegengekomen die autonoom werken, niet afhankelijk van bijvoorbeeld externe gegevensbronnen of bepaalde services. In de praktijk zijn dergelijke toepassingen zeldzaam. Bij echte projecten gaat het meestal om een ​​hele reeks samenwerkingstoepassingen.

Hoe weet u of u Docker Compose moet gebruiken bij het implementeren van een project? Eigenlijk is het heel eenvoudig. Als u meerdere services gebruikt om dit project uit te voeren, kan Docker Compose van pas komen. Bijvoorbeeld in een situatie waarin u een website maakt die, om gebruikersauthenticatie uit te voeren, verbinding moet maken met een database. Zo'n project kan uit twee diensten bestaan: één die zorgt voor de werking van de site en één die verantwoordelijk is voor de ondersteuning van de database.

Met de Docker Compose-technologie kunt u, als u deze op een vereenvoudigde manier beschrijft, veel services starten met één enkele opdracht.

Verschil tussen Docker en Docker Compose

Docker wordt gebruikt om de individuele containers (diensten) waaruit een applicatie bestaat te beheren.

Docker Compose wordt gebruikt om meerdere containers die deel uitmaken van een applicatie tegelijkertijd te beheren. Deze tool biedt dezelfde functionaliteiten als Docker, maar maakt het mogelijk om met complexere applicaties te werken.

Docker Compose-handleiding voor beginners
Docker (enkele container) en Docker Compose (meerdere containers)

Typisch Docker Compose-gebruiksscenario

Docker Compose is in de juiste handen een zeer krachtige tool waarmee u snel applicaties met complexe architecturen kunt implementeren. Nu zullen we kijken naar een voorbeeld van het praktische gebruik van Docker Compose, waarvan de analyse u in staat zal stellen de voordelen te evalueren die het gebruik van Docker Compose u zal opleveren.

Stel je voor dat je de ontwikkelaar bent van een webproject. Dit project omvat twee websites. Met de eerste kunnen zakenmensen met slechts een paar klikken online winkels opzetten. De tweede is gericht op klantenondersteuning. Deze twee sites communiceren met dezelfde database.

Uw project wordt steeds populairder en het blijkt dat de capaciteit van de server waarop het werkt niet langer voldoende is. Als gevolg hiervan besluit u het hele project naar een andere machine over te brengen.

Helaas heb je nog niet zoiets als Docker Compose gebruikt. Daarom zult u de services één voor één moeten migreren en opnieuw configureren, in de hoop dat u tijdens dit werk niets vergeet.

Als u Docker Compose gebruikt, is het migreren van uw project naar een nieuwe server een probleem dat kan worden opgelost door een paar opdrachten uit te voeren. Om de overdracht van het project naar een nieuwe locatie te voltooien, hoeft u alleen enkele instellingen uit te voeren en een back-up van de database naar de nieuwe server te uploaden.

Het ontwikkelen van een client-server applicatie met behulp van Docker Compose

Nu u weet waarvoor we Docker Compose gaan gebruiken, is het tijd om uw eerste client/server-applicatie met deze tool te maken. We hebben het namelijk over de ontwikkeling van een kleine website (server) in Python, die een bestand met een tekstfragment kan produceren. Dit bestand wordt door een programma (client), eveneens geschreven in Python, bij de server opgevraagd. Nadat het bestand van de server is ontvangen, geeft het programma de daarin opgeslagen tekst op het scherm weer.

Houd er rekening mee dat we ervan uitgaan dat u over de basisprincipes van Docker beschikt en dat u het Docker-platform al hebt geïnstalleerd.

Laten we aan het project gaan werken.

▍1. Maak een project

Om uw eerste client/server-applicatie te bouwen, raad ik u aan om te beginnen met het maken van een projectmap. Het moet de volgende bestanden en mappen bevatten:

  • file docker-compose.yml. Dit is een Docker Compose-bestand dat de instructies bevat die nodig zijn om de services te starten en te configureren.
  • Map server. Het bevat de bestanden die nodig zijn om de server te laten werken.
  • Map client. Dit is waar de clienttoepassingsbestanden zich zullen bevinden.

Als gevolg hiervan zou de inhoud van de hoofdmap van uw project er als volgt uit moeten zien:

.
├── client/
├── docker-compose.yml
└── server/
2 directories, 1 file

▍2. Servercreatie

Hier zullen we, tijdens het maken van een server, enkele basiszaken met betrekking tot Docker bespreken.

2a. Bestanden maken

Ga naar map server en maak daarin de volgende bestanden:

  • file server.py. Het bevat de servercode.
  • file index.html. Dit bestand bevat een stukje tekst dat de clienttoepassing moet weergeven.
  • file Dockerfile. Dit is het Docker-bestand dat de instructies bevat die nodig zijn om de serveromgeving te creëren.

Zo zou de inhoud van uw map eruit moeten zien server/:

.
├── Dockerfile
├── index.html
└── server.py
0 directories, 3 files

2b. Een Python-bestand bewerken.

Toevoegen aan bestand server.py de volgende code:

#!/usr/bin/env python3

# Импорт системных библиотек python.
# Эти библиотеки будут использоваться для создания веб-сервера.
# Вам не нужно устанавливать что-то особенное, эти библиотеки устанавливаются вместе с Python.

import http.server
import socketserver

# Эта переменная нужна для обработки запросов клиента к серверу.

handler = http.server.SimpleHTTPRequestHandler

# Тут мы указываем, что сервер мы хотим запустить на порте 1234. 
# Постарайтесь запомнить эти сведения, так как они нам очень пригодятся в дальнейшем, при работе с docker-compose.

with socketserver.TCPServer(("", 1234), handler) as httpd:

    # Благодаря этой команде сервер будет выполняться постоянно, ожидая запросов от клиента.

   httpd.serve_forever()

Met deze code kunt u een eenvoudige webserver maken. Hij zal de cliënten een dossier geven index.html, waarvan de inhoud later op de webpagina wordt weergegeven.

2c. Een HTML-bestand bewerken

Om in te dienen index.html voeg de volgende tekst toe:

Docker-Compose is magic!

Deze tekst wordt naar de klant verzonden.

2d. Het Dockerbestand bewerken

Nu gaan we een eenvoudig bestand maken Dockerfile, die verantwoordelijk zal zijn voor het organiseren van de runtime-omgeving voor de Python-server. Als basis van de gemaakte afbeelding zullen we gebruiken officieel, ontworpen om programma's uit te voeren die in Python zijn geschreven. Hier is de inhoud van het Dockerbestand:

# На всякий случай напоминаю, что Dockerfile всегда должен начинаться с импорта базового образа.
# Для этого используется ключевое слово 'FROM'.
# Здесь нам нужно импортировать образ python (с DockerHub).
# В результате мы, в качестве имени образа, указываем 'python', а в качестве версии - 'latest'.

FROM python:latest

# Для того чтобы запустить в контейнере код, написанный на Python, нам нужно импортировать файлы 'server.py' и 'index.html'.
# Для того чтобы это сделать, мы используем ключевое слово 'ADD'.
# Первый параметр, 'server.py', представляет собой имя файла, хранящегося на компьютере.
# Второй параметр, '/server/', это путь, по которому нужно разместить указанный файл в образе.
# Здесь мы помещаем файл в папку образа '/server/'.

ADD server.py /server/
ADD index.html /server/

# Здесь мы воспользуемся командой 'WORKDIR', возможно, новой для вас.
# Она позволяет изменить рабочую директорию образа.
# В качестве такой директории, в которой будут выполняться все команды, мы устанавливаем '/server/'.

WORKDIR /server/

Laten we nu aan de cliënt werken.

▍3. Maak een klant aan

Terwijl we de clientkant van ons project creëren, zullen we onderweg enkele basisbeginselen van Docker in herinnering brengen.

3a. Bestanden maken

Ga naar uw projectmap client en maak daarin de volgende bestanden:

  • file client.py. Hier komt de klantcode te staan.
  • file Dockerfile. Dit bestand speelt dezelfde rol als een soortgelijk bestand in de servermap. Het bevat namelijk een verklaring die beschrijft hoe u een omgeving kunt creëren voor het uitvoeren van clientcode.

Het resultaat is dat uw map client/ In dit stadium zou het er als volgt uit moeten zien:

.
├── client.py
└── Dockerfile
0 directories, 2 files

3b. Een Python-bestand bewerken

Toevoegen aan bestand client.py de volgende code:

#!/usr/bin/env python3

# Импортируем системную библиотеку Python.
# Она используется для загрузки файла 'index.html' с сервера.
# Ничего особенного устанавливать не нужно, эта библиотека устанавливается вместе с Python.

import urllib.request

# Эта переменная содержит запрос к 'http://localhost:1234/'.
# Возможно, сейчас вы задаётесь вопросом о том, что такое 'http://localhost:1234'.
# localhost указывает на то, что программа работает с локальным сервером.
# 1234 - это номер порта, который вам предлагалось запомнить при настройке серверного кода.

fp = urllib.request.urlopen("http://localhost:1234/")

# 'encodedContent' соответствует закодированному ответу сервера ('index.html').
# 'decodedContent' соответствует раскодированному ответу сервера (тут будет то, что мы хотим вывести на экран).

encodedContent = fp.read()
decodedContent = encodedContent.decode("utf8")

# Выводим содержимое файла, полученного с сервера ('index.html').

print(decodedContent)

# Закрываем соединение с сервером.

fp.close()

Dankzij deze code kan de clientapplicatie gegevens van de server downloaden en op het scherm weergeven.

3c. Het Dockerbestand bewerken

Net als bij de server creëren we voor de klant een eenvoudig Dockerfile, verantwoordelijk voor het vormgeven van de omgeving waarin de Python-clientapplicatie zal draaien. Hier vindt u de klantcode Dockerfile:

# То же самое, что и в серверном Dockerfile.

FROM python:latest

# Импортируем 'client.py' в папку '/client/'.

ADD client.py /client/

# Устанавливаем в качестве рабочей директории '/client/'.

WORKDIR /client/

▍4. Docker Componeren

Zoals u kunt zien, hebben we twee verschillende projecten gemaakt: server en client. Elk van hen heeft zijn eigen bestand Dockerfile. Tot nu toe gaat alles wat er gebeurt niet verder dan de basisprincipes van het werken met Docker. Nu gaan we aan de slag met Docker Compose. Raadpleeg hiervoor het bestand docker-compose.ymlbevindt zich in de hoofdmap van het project.

Houd er rekening mee dat het hier niet de bedoeling is om absoluut alle opdrachten te behandelen die kunnen worden gebruikt docker-compose.yml. Ons belangrijkste doel is om een ​​praktisch voorbeeld uit te leggen dat u basiskennis van Docker Compose geeft.

Hier is de code die in het bestand moet worden geplaatst docker-compose.yml:

# Файл docker-compose должен начинаться с тега версии.
# Мы используем "3" так как это - самая свежая версия на момент написания этого кода.

version: "3"

# Следует учитывать, что docker-composes работает с сервисами.
# 1 сервис = 1 контейнер.
# Сервисом может быть клиент, сервер, сервер баз данных...
# Раздел, в котором будут описаны сервисы, начинается с 'services'.

services:

  # Как уже было сказано, мы собираемся создать клиентское и серверное приложения.
  # Это означает, что нам нужно два сервиса.
  # Первый сервис (контейнер): сервер.
  # Назвать его можно так, как нужно разработчику.
  # Понятное название сервиса помогает определить его роль.
  # Здесь мы, для именования соответствующего сервиса, используем ключевое слово 'server'.

  server:
 
    # Ключевое слово "build" позволяет задать
    # путь к файлу Dockerfile, который нужно использовать для создания образа,
    # который позволит запустить сервис.
    # Здесь 'server/' соответствует пути к папке сервера,
    # которая содержит соответствующий Dockerfile.

    build: server/

    # Команда, которую нужно запустить после создания образа.
    # Следующая команда означает запуск "python ./server.py".

    command: python ./server.py

    # Вспомните о том, что в качестве порта в 'server/server.py' указан порт 1234.
    # Если мы хотим обратиться к серверу с нашего компьютера (находясь за пределами контейнера),
    # мы должны организовать перенаправление этого порта на порт компьютера.
    # Сделать это нам поможет ключевое слово 'ports'.
    # При его использовании применяется следующая конструкция: [порт компьютера]:[порт контейнера]
    # В нашем случае нужно использовать порт компьютера 1234 и организовать его связь с портом
    # 1234 контейнера (так как именно на этот порт сервер 
    # ожидает поступления запросов).

    ports:
      - 1234:1234

  # Второй сервис (контейнер): клиент.
  # Этот сервис назван 'client'.

  client:
    # Здесь 'client/ соответствует пути к папке, которая содержит
    # файл Dockerfile для клиентской части системы.

    build: client/

    # Команда, которую нужно запустить после создания образа.
    # Следующая команда означает запуск "python ./client.py".
 
    command: python ./client.py

    # Ключевое слово 'network_mode' используется для описания типа сети.
    # Тут мы указываем то, что контейнер может обращаться к 'localhost' компьютера.

    network_mode: host

    # Ключевое слово 'depends_on' позволяет указывать, должен ли сервис,
    # прежде чем запуститься, ждать, когда будут готовы к работе другие сервисы.
    # Нам нужно, чтобы сервис 'client' дождался бы готовности к работе сервиса 'server'.
 
    depends_on:
      - server

▍5. Projectopbouw

Na binnen docker-compose.yml alle benodigde instructies zijn gemaakt, het project moet worden gemonteerd. Deze stap van ons werk lijkt op het gebruik van de opdracht docker build, maar de bijbehorende opdracht is gerelateerd aan verschillende services:

$ docker-compose build

▍6. Lancering van het project

Nu het project is gebouwd, is het tijd om het uit te voeren. Deze stap van ons werk komt overeen met de stap waarbij, bij het werken met individuele containers, het commando wordt uitgevoerd docker run:

$ docker-compose up

Na het uitvoeren van deze opdracht zou de tekst die door de client van de server is geladen in de terminal moeten verschijnen: Docker-Compose is magic!.

Zoals reeds vermeld, gebruikt de server de computerpoort 1234 om klantverzoeken te bedienen. Daarom, als je in de browser naar het adres gaat http://localhost:1234/, wordt een pagina met tekst weergegeven Docker-Compose is magic!.

Nuttige opdrachten

Laten we eens kijken naar enkele opdrachten die u mogelijk handig vindt bij het werken met Docker Compose.

Met deze opdracht kunt u containers en andere bronnen die door de opdracht zijn gemaakt, stoppen en verwijderen docker-compose up:

$ docker-compose down

Met deze opdracht worden de servicelogboeken afgedrukt:

$ docker-compose logs -f [service name]

In ons project kan het bijvoorbeeld in deze vorm worden gebruikt: $ docker-compose logs -f [service name].

Met deze opdracht kunt u een lijst met containers weergeven:

$ docker-compose ps

Met deze opdracht kunt u een opdracht uitvoeren in een actieve container:

$ docker-compose exec [service name] [command]

Het kan er bijvoorbeeld zo uitzien: docker-compose exec server ls.

Met deze opdracht kunt u een lijst met afbeeldingen weergeven:

$ docker-compose images

Resultaten van

We hebben de basisprincipes van het werken met Docker Compose-technologie besproken, waarvan de kennis u in staat stelt deze technologie te gebruiken en, indien gewenst, deze dieper te gaan bestuderen. Hier repository met de projectcode, die we hier hebben overwogen.

Beste lezers! Gebruikt u Docker Compose in uw projecten?

Docker Compose-handleiding voor beginners

Bron: www.habr.com

Voeg een reactie