De auteur van het artikel waarvan we vandaag de vertaling publiceren, zegt dat het bedoeld is voor ontwikkelaars die Docker Compose willen leren en hun eerste client-serverapplicatie met Docker willen maken. Aangenomen wordt dat de lezer van dit materiaal bekend is met de basisprincipes van Docker. Als dat niet zo is, kunt u kijken naar reeks artikelen, naar de publicatie waarin de basisprincipes van Docker samen met de basisprincipes van Kubernetes worden behandeld, en naar een artikel voor beginners.
Wat is Docker Compose?
Docker Compose is een hulpmiddel dat deel uitmaakt van Docker. Het is ontworpen voor het oplossen van problemen bij het implementeren van projecten.
Tijdens het leren van de basisprincipes van Docker kunt u zijn gekomen tot het maken van eenvoudige applicaties die autonoom werken, zonder afhankelijk te zijn van externe datapunten of services. In de praktijk zijn dergelijke applicaties echter zeldzaam. Echte projecten omvatten doorgaans een reeks samenwerkende applicaties.
Hoe weet je of je Docker Compose moet gebruiken bij het implementeren van een project? Het is eigenlijk heel eenvoudig. Als het project meerdere services vereist voor de correcte werking, kan Docker Compose nuttig zijn. Bijvoorbeeld in een situatie waarin een website wordt gemaakt die voor gebruikersauthenticatie verbinding moet maken met een database. Een dergelijk project kan uit twee services bestaan: degene die de website draaiende houdt en degene die verantwoordelijk is voor de databaseondersteuning.
De technologie Docker Compose, eenvoudig gezegd, maakt het mogelijk om met één opdracht meerdere services te starten.
Het Verschil Tussen Docker en Docker Compose
Docker wordt gebruikt voor het beheren van afzonderlijke containers (services) die deel uitmaken van een applicatie.
Docker Compose wordt gebruikt voor het gelijktijdig beheren van meerdere containers die deel uitmaken van de applicatie. Dit hulpmiddel biedt dezelfde mogelijkheden als Docker, maar stelt je in staat om met complexere applicaties te werken.

Docker (afzonderlijke container) en Docker Compose (meerdere containers)
Typisch Gebruiksscenario voor Docker Compose
Docker Compose is, in skilled hands, a very powerful tool that allows you to quickly deploy applications with complex architectures. Now we will look at a practical example of using Docker Compose, the analysis of which will help you appreciate the advantages that using Docker Compose will give you.
Imagine you are a developer of a certain web project. This project includes two websites. The first allows business people to create online stores with just a few clicks. The second is focused on customer support. These two sites interact with the same database.
Your project is becoming more popular, and it turns out that the server capacity it runs on is no longer sufficient. As a result, you decide to migrate the entire project to another machine.
Unfortunately, you haven't used anything like Docker Compose. Therefore, you will have to migrate and reconfigure services one by one, hoping that you won't forget anything during this process.
If you use Docker Compose, migrating your project to a new server is a matter of executing a few commands. To complete the migration of the project to a new location, you only need to make some configurations and upload a backup of the database to the new server.
Developing a client-server application using Docker Compose
Now that you know why we are going to use Docker Compose, it’s time to create your first client-server application using this tool. Specifically, we will be developing a small website (server) in Python that is capable of delivering a file with a snippet of text. This file is requested from the server by a program (client), also written in Python. After receiving the file from the server, the program will display the text contained in it on the screen.
Please note that we expect you to have a basic understanding of Docker and that you already have the Docker platform installed.
Let's get started on the project.
▍1. Creating the project
To build your first client-server application, I suggest starting by creating a project folder. It should contain the following files and folders:
- Bestand
docker-compose.ymlDit is een Docker Compose-bestand dat instructies zal bevatten die nodig zijn voor het starten en configureren van de services. - Map
serverDeze zal de bestanden bevatten die nodig zijn om de server te laten draaien. - Map
clientHier komen de bestanden van de clienttoepassing.
Het resultaat moet zijn dat de hoofdmap van je project er zo uitziet:
.
├── client/
├── docker-compose.yml
└── server/
2 mappen, 1 bestand▍2. Server maken
Hierbij zullen we tijdens het maken van de server enkele basisprincipes van Docker behandelen.
2a. Bestanden maken
Navigeer naar de map server en maak de volgende bestanden aan:
- Bestand
server.pyHierin komt de servercode. - Bestand
index.htmlIn dit bestand komt een tekstfragment dat de clienttoepassing moet weergeven. - Bestand
DockerfileDit is een Docker-bestand dat instructies zal bevatten voor het creëren van de serveromgeving.
Zo zou de inhoud van je map server/ moeten eruitzien: . ├── Dockerfile ├── index.html └── server.py 0 mappen, 3 bestanden:
2b. Python-bestand bewerken.Laten we de volgende code aan het bestand
toevoegen: server.py Deze code maakt een eenvoudige webserver. Het zal bestanden naar clients sturen
#!/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() , waarvan de inhoud later op de webpagina wordt weergegeven. index.html2c. HTML-bestand bewerken
We voegen de volgende tekst toe aan het bestand
: index.html Docker-Compose is magie!
Deze tekst wordt naar de client verzonden.2d. Dockerfile bewerken
Laten we nu een eenvoudig bestand aanmaken
, dat verantwoordelijk zal zijn voor het opzetten van de uitvoeringsomgeving voor de Python-server. We gebruiken de Dockerfileofficiële afbeelding Nu gaan we verder met het werk aan de client.
# На всякий случай напоминаю, что 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/▍3. Client maken
Bij het maken van het clientgedeelte van ons project zullen we ook enkele basisprincipes van Docker herhalen.
3a. Bestanden maken
Ga naar de map van je project
client.py client en maak de volgende bestanden aan:
- Bestand
Hierin komt de clientcode.Dit bestand vervult dezelfde rol als het overeenkomstige bestand in de servermap. Namelijk, het bevat de instructie die de creatie van de uitvoeringsomgeving voor de clientcode beschrijft. - Bestand
DockerfileHet resultaat is dat je map
client/ aan het einde van deze fase er zo uit moet zien: . ├── client.py └── Dockerfile 0 mappen, 2 bestanden 3b. Python-bestand bewerken
Dankzij deze code kan de clienttoepassing gegevens van de server ophalen en deze op het scherm weergeven.3c. Dockerfile bewerken
toevoegen: Hierin komt de clientcode. Deze code maakt een eenvoudige webserver. Het zal bestanden naar clients sturen
#!/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()Laten we nu de Dockerfile voor de client bewerken.
3c. Bewerken van het Dockerfile
Net als bij de server creëren we een eenvoudige Dockerfile, verantwoordelijk voor het creëren van de omgeving waarin de client Python-applicatie zal draaien. Hier is de code van de client Dockerfile:
# То же самое, что и в серверном Dockerfile.
FROM python:latest
# Импортируем 'client.py' в папку '/client/'.
ADD client.py /client/
# Устанавливаем в качестве рабочей директории '/client/'.
WORKDIR /client/▍4. Docker Compose
Zoals je misschien hebt opgemerkt, hebben we twee verschillende projecten gemaakt: server en client. Elk van hen heeft zijn eigen bestand Dockerfile. Tot nu toe is alles wat we hebben behandeld binnen de basisprincipes van Docker gebleven. Nu beginnen we te werken met Docker Compose. Hiervoor bekijken we het bestand docker-compose.yml, dat zich in de wortelmap van het project bevindt.
Let op dat we hier niet proberen alle commando's te behandelen die mogelijk zijn in docker-compose.yml. Ons hoofddoel is om een praktijkvoorbeeld te bespreken dat je basiskennis van Docker Compose geeft.
Hier is de code die je in het bestand moet plaatsen 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. Project samenstellen
Nadat alle benodigde instructies in docker-compose.yml zijn aangebracht, moet het project worden samengesteld. Deze stap in ons proces lijkt op het gebruik van de command docker build, maar het bijbehorende commando heeft betrekking op meerdere services:
$ docker-compose build▍6. Project starten
Nu het project is samengesteld, is het tijd om het te starten. Deze stap in ons proces komt overeen met de stap waarin, bij het werken met afzonderlijke containers, de command docker run:
$ docker-compose up Na het uitvoeren van deze command zou er tekst in de terminal moeten verschijnen, die door de client van de server is geladen: Deze tekst wordt naar de client verzonden..
Zoals al eerder vermeld, gebruikt de server de poort van de computer 1234 om verzoeken van de client te bedienen. Daarom, als we in de browser naar het adres gaan , zal er een pagina met de tekst worden weergegeven Deze tekst wordt naar de client verzonden..
Nuttige commando's
Laten we enkele commando's bekijken die handig voor je kunnen zijn bij het werken met Docker Compose.
Dit commando stelt je in staat om containers en andere resources die door de command docker-compose up:
$ docker-compose downDit commando geeft de logs van de services weer:
$ docker-compose logs -f [service name] Bijvoorbeeld, in ons project kan het als volgt worden gebruikt: $ docker-compose logs -f [service name].
Met zo'n commando kun je de lijst van containers weergeven:
$ docker-compose psDit commando stelt je in staat om een commando in een draaiende container uit te voeren:
$ docker-compose exec [service name] [command] Bijvoorbeeld, het kan er als volgt uitzien: docker-compose exec server ls.
Dit commando stelt je in staat om de lijst van beelden weer te geven:
$ docker-compose imagesConclusies
We hebben de basisprincipes van het werken met de Docker Compose-technologie behandeld, waarvan de kennis u in staat stelt deze technologie te gebruiken en, indien gewenst, verder te gaan met een diepere studie ervan. de repository met de code van het project dat we hier hebben besproken.
Geachte lezers! Gebruik je Docker Compose in je projecten?
Bron: habr.com
