En Ufänger Guide fir Docker Compose

Den Auteur vum Artikel, d'Iwwersetzung vun där mir haut verëffentlechen, seet datt et fir déi Entwéckler geduecht ass, déi Docker Compose léiere wëllen a sech op d'Schafe vun hirer éischter Client-Server Applikatioun mat Docker bewegen. Et gëtt ugeholl datt de Lieser vun dësem Material d'Basics vum Docker vertraut ass. Wann dat net de Fall ass, kënnt Dir e Bléck huelen dat Serie vun Material op dat Post deckt Docker Basics zesumme mat Kubernetes Basics, an dat Artikel fir Ufänger.

En Ufänger Guide fir Docker Compose

Wat ass Docker Compose?

Docker Compose ass en Tool mat Docker abegraff. Et ass entwéckelt fir Probleemer am Zesummenhang mam Projet Deployment ze léisen.

Wärend Dir d'Grondlage vum Docker léiert, hutt Dir vläicht d'Schafung vun einfachen Uwendungen begéint, déi autonom funktionnéieren an net ofhängeg sinn, zum Beispill vun externen Datequellen oder vu bestëmmte Servicer. An der Praxis sinn esou Uwendungen rar. Real Projeten enthalen normalerweis eng ganz Rei vun Uwendungen déi zesumme schaffen.

Wéi wësst Dir ob Dir Docker Compose benotze musst wann Dir e Projet ofsetzt? Et ass eigentlech ganz einfach. Wann Dir verschidde Servicer benotzt fir dëse Projet ze schaffen, da kann Docker Compose praktesch kommen. Zum Beispill, an enger Situatioun wou se eng Websäit kreéieren déi mat enger Datebank verbonne musse fir d'Benotzer ze authentifizéieren. Esou e Projet kann aus zwee Servicer besteet - deen deen de Fonctionnement vum Site garantéiert, an deen deen verantwortlech ass fir d'Datebank z'erhalen.

Docker Compose Technologie, fir et op eng vereinfacht Manéier ze beschreiwen, erlaabt Iech vill Servicer mat engem Kommando ze starten.

Ënnerscheed tëscht Docker an Docker Compose

Docker gëtt benotzt fir déi eenzel Container (Servicer) ze managen déi eng Applikatioun ausmaachen.

Docker Compose gëtt benotzt fir gläichzäiteg verschidde Container ze managen déi eng Applikatioun ausmaachen. Dëst Tool bitt déiselwecht Fäegkeeten wéi Docker, awer erlaabt Iech mat méi komplexen Uwendungen ze schaffen.

En Ufänger Guide fir Docker Compose
Docker (eenzel Container) an Docker Compose (Multiple Container)

Typesch Benotzungsfall fir Docker Compose

Docker Compose ass, an de richtegen Hänn, e ganz mächtegt Tool dat Iech erlaabt ganz séier Uwendungen mat komplexen Architekturen z'installéieren. Elo wäerte mir e Beispill vun der praktescher Notzung vun Docker Compose kucken, d'Analyse vun deem Iech erlaabt d'Virdeeler ze evaluéieren déi d'Benotzung vun Docker Compose Iech gëtt.

Stellt Iech vir datt Dir en Entwéckler vun engem Webprojet sidd. Dëse Projet enthält zwee Websäiten. Déi éischt erlaabt Geschäftsleit online Geschäfter mat just e puer Mausklicken ze kreéieren. Déi zweet zielt fir Clientssupport. Dës zwee Site interagéiere mat der selwechter Datebank.

Äre Projet gëtt ëmmer méi populär, an et stellt sech eraus datt d'Kraaft vum Server op deem et leeft net méi genuch ass. Als Resultat, décidéiert Dir de ganze Projet op eng aner Maschinn ze plënneren.

Leider hutt Dir net eppes wéi Docker Compose benotzt. Dofir musst Dir d'Servicer gläichzäiteg transferéieren an nei konfiguréieren, an der Hoffnung datt Dir näischt am Prozess vergiesst.

Wann Dir Docker Compose benotzt, da réckelt Äre Projet op en neie Server eng Saach déi geléist ka ginn andeems Dir e puer Kommandoen leeft. Fir den Transfer vum Projet op eng nei Plaz ofzeschléissen, braucht Dir nëmmen e puer Astellungen ze maachen an eng Backupkopie vun der Datebank op den neie Server eropzelueden.

Eng Client-Server Applikatioun entwéckelen mat Docker Compose

Elo datt Dir wësst wat mir Docker Compose benotze fir, ass et Zäit Är éischt Client-Server Applikatioun mat dësem Tool ze kreéieren. Mir schwätzen nämlech iwwer d'Entwécklung vun enger klenger Websäit (Server) am Python, déi e Fichier mat engem Textfragment erausginn kann. Dëse Fichier gëtt vum Server vun engem Programm (Client) gefrot, och am Python geschriwwen. Nodeems Dir eng Datei vum Server kritt hutt, weist de Programm den Text deen an deem gespäichert ass um Bildschierm.

Notéiert w.e.g. datt mir dovun ausgoen datt Dir e Basisverständnis vun Docker hutt an datt Dir schonn d'Docker Plattform installéiert hutt.

Loosst eis un de Projet schaffen.

▍1. E Projet erstellen

Fir Är éischt Client-Server Applikatioun ze bauen, proposéieren ech Iech unzefänken andeems Dir e Projet Dossier erstellt. Et sollt déi folgend Dateien an Ordner enthalen:

  • Fichier docker-compose.yml. Dëst ass eng Docker Compose Datei déi d'Instruktioune enthält fir d'Servicer ze starten an ze konfiguréieren.
  • Dossier server. Et enthält déi néideg Dateien fir de Server ze lafen.
  • Dossier client. D'Clientapplikatiounsdateien ginn hei lokaliséiert.

Als Resultat, soll den Inhalt vun Ärem Projet Haaptrei Dossier esou ausgesinn:

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

▍2. Schafen engem Server

Hei, am Prozess vun der Schafung vun engem Server, wäerte mir e puer grondleeënd Saachen iwwer Docker beréieren.

2a. Schafen Dateien

Gitt an den Dossier server a erstellt déi folgend Dateien dran:

  • Fichier server.py. Et wäert de Servercode enthalen.
  • Fichier index.html. Dëse Fichier enthält e Stéck Text, deen d'Clientapplikatioun soll ausginn.
  • Fichier Dockerfile. Dëst ass eng Docker Datei déi d'Instruktioune enthält déi néideg ass fir de Serverëmfeld ze kreéieren.

Dëst ass wéi den Inhalt vun Ärem Dossier soll ausgesinn server/:

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

2b vun. Änneren vun enger Python Datei.

Add to file server.py folgende 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()

Dëse Code erlaabt Iech en einfachen Webserver ze kreéieren. Hie gëtt Clienten de Fichier index.html, den Inhalt vun deem spéider op der Websäit ugewise gëtt.

2c vun. Änneren vun enger HTML Datei

Fir Fichier index.html füügt de folgenden Text derbäi:

Docker-Compose is magic!

Dësen Text gëtt un de Client geschéckt.

2 d. Änneren vum Dockerfile

Elo wäerte mir eng einfach Datei erstellen Dockerfile, deen verantwortlech ass fir d'Runtime-Ëmfeld fir de Python-Server z'organiséieren. Als Basis fir dat erstallt Bild wäerte mir benotzen op eng offiziell Manéier, entwéckelt fir Programmer ze lafen, déi am Python geschriwwe sinn. Hei ass den Inhalt vun der Dockerfile:

# На всякий случай напоминаю, что 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/

Loosst eis elo un de Client schaffen.

▍3. Schafen engem Client

Wärend der Client Säit vun eisem Projet erstallt ginn, erënnere mir eis e puer Docker Basics laanscht de Wee.

3a. Schafen Dateien

Gitt an Äre Projet Dossier client a erstellt déi folgend Dateien dran:

  • Fichier client.py. De Client Code wäert hei sinn.
  • Fichier Dockerfile. Dëse Fichier spillt déi selwecht Roll wéi eng ähnlech Datei am Server Dossier. Et enthält nämlech Instruktiounen déi beschreiwen wéi een en Ëmfeld erstellt fir de Client Code auszeféieren.

Als Resultat, Ären Dossier client/ an dëser Etapp vun der Aarbecht soll et esou ausgesinn:

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

3b vun. Änneren vun enger Python Datei

Add to file client.py folgende 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()

Mat dësem Code kann d'Clientapplikatioun Daten vum Server eroflueden an se um Bildschierm weisen.

3c vun. Änneren vum Dockerfile

Wéi am Fall vum Server kreéiere mir eng einfach Dockerfile, verantwortlech fir d'Ëmfeld ze kreéieren an deem d'Python Client Applikatioun leeft. Hei ass de Client Code Dockerfile:

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

FROM python:latest

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

ADD client.py /client/

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

WORKDIR /client/

▍4. Docker Compose

Wéi Dir vläicht gemierkt hutt, hu mir zwee verschidde Projeten erstallt: e Server an e Client. Jiddereng vun hinnen huet seng eege Fichier Dockerfile. Bis elo ass alles wat geschitt ass net iwwer d'Basis vun der Aarbecht mat Docker gaangen. Elo fänken mir mat Docker Compose un. Fir dëst ze maachen, loosst eis op d'Datei goen docker-compose.yml, läit am Projet root Dossier.

Notéiert w.e.g. datt mir hei net probéieren absolut all Kommandoen ze decken déi benotzt kënne ginn docker-compose.yml. Eist Haaptziel ass et duerch e praktescht Beispill ze goen dat Iech d'Basiskenntnisser vun Docker Compose gëtt.

Hei ass de Code fir an d'Datei ze setzen 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. Bau vum Projet

Nach an docker-compose.yml All néideg Instruktioune sinn aginn, de Projet muss zesummegesat ginn. Dëse Schrëtt vun eiser Aarbecht ass ähnlech wéi de Kommando ze benotzen docker build, awer de entspriechende Kommando ass relevant fir verschidde Servicer:

$ docker-compose build

▍6. Start vum Projet

Elo datt de Projet zesummegesat ass, ass et Zäit et ze lancéieren. Dëse Schrëtt vun eiser Aarbecht entsprécht dem Schrëtt an deem, wann Dir mat eenzelne Container schafft, de Kommando ausgefouert gëtt docker run:

$ docker-compose up

Nodeems Dir dëse Kommando ausgefouert hutt, soll den Text, deen vum Client vum Server erofgeluede gëtt, am Terminal erscheinen: Docker-Compose is magic!.

Wéi scho gesot, benotzt de Server de Computerport 1234 Client Ufroen ze Service. Dofir, wann Dir op d'Adress an Ärem Browser gitt http://localhost:1234/, et wäert eng Säit mat Text weisen Docker-Compose is magic!.

Nëtzlech Kommandoen

Loosst eis e puer Kommandoen kucken, déi Dir nëtzlech fannt wann Dir mat Docker Compose schafft.

Dëse Kommando erlaabt Iech Container an aner Ressourcen ze stoppen an ze läschen, déi vum Kommando erstallt ginn docker-compose up:

$ docker-compose down

Dëse Kommando dréckt Service Logbicher:

$ docker-compose logs -f [service name]

Zum Beispill, an eisem Projet kann et an dëser Form benotzt ginn: $ docker-compose logs -f [service name].

Mat dësem Kommando kënnt Dir eng Lëscht vu Container weisen:

$ docker-compose ps

Dëse Kommando erlaabt Iech e Kommando an engem lafende Container auszeféieren:

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

Zum Beispill kann et esou ausgesinn: docker-compose exec server ls.

Dëse Kommando erlaabt Iech eng Lëscht vu Biller ze weisen:

$ docker-compose images

Resultater

Mir hunn d'Basis vun der Aarbecht mat Docker Compose Technologie gekuckt, d'Wësse vun deem erlaabt Iech dës Technologie ze benotzen an, wann Dir wëllt, se méi déif ze studéieren. hei e Repository mam Code fir de Projet dee mir hei gekuckt hunn.

Léif Lieser! Benotzt Dir Docker Compose an Äre Projeten?

En Ufänger Guide fir Docker Compose

Source: will.com

Setzt e Commentaire