En nybörjarguide till Docker Compose

Författaren till den artikel vi publicerar idag säger att den är avsedd för utvecklare som vill lära sig Docker Compose och strävar efter att skapa sin första klient-server-applikation med hjälp av Docker. Det antas att läsaren av detta material är bekant med grunderna i Docker. Om detta inte är fallet — ta en titt på denna den serie artiklar som finns på denna publiceringen där grunderna i Docker går igenom tillsammans med grunderna i Kubernetes, samt denna artikeln för nybörjare.

En nybörjarguide till Docker Compose

Vad är Docker Compose?

Docker Compose är ett verktyg som ingår i Docker. Det är avsett att lösa uppgifter relaterade till distribution av projekt.

När du studerar grunderna i Docker kan du ha stött på att skapa de enklaste applikationerna, som fungerar fristående, utan att vara beroende av t.ex. externa datakällor eller tjänster. I praktiken är sådana applikationer sällsynta. Riktiga projekt omfattar vanligtvis ett helt spektrum av samverkande applikationer.

Hur kan du veta om du behöver använda Docker Compose vid distribution av ett visst projekt? Faktum är att det är väldigt enkelt. Om flera tjänster krävs för att projektet ska fungera, kan Docker Compose vara till nytta för dig. Till exempel, i en situation där en webbplats skapas, som behöver ansluta till en databas för att utföra användarautentisering. Ett sådant projekt kan bestå av två tjänster — den som driver webbplatsen och den som hanterar databasstödet.

Tekniken Docker Compose, för att beskriva den enkelt, gör att du med ett enda kommando kan starta flera tjänster.

Skillnaden mellan Docker och Docker Compose

Docker används för att hantera individuella containrar (tjänster) som utgör en applikation.

Docker Compose används för att samtidigt hantera flera containrar som ingår i applikationen. Detta verktyg erbjuder samma funktioner som Docker, men låter dig arbeta med mer komplexa applikationer.

En nybörjarguide till Docker Compose
Docker (individuell container) och Docker Compose (flera containrar)

En typisk användning av Docker Compose

Docker Compose — i skickliga händer, är ett mycket kraftfullt verktyg som gör det möjligt att snabbt distribuera applikationer med komplex arkitektur. Nu ska vi gå igenom ett praktiskt exempel på hur Docker Compose används, vilket kommer att låta dig uppskatta de fördelar som du får av att använda Docker Compose.

Tänk dig att du är utvecklare av ett webbprojekt. Projektet innefattar två webbplatser. Den första gör det möjligt för företagare att skapa webbshoppar med bara några få klick. Den andra är inriktad på kundsupport. Dessa två webbplatser interagerar med samma databas.

Ditt projekt blir mer och mer populärt, och det visar sig att serverkapaciteten, där det körs, inte längre räcker till. Som ett resultat bestämmer du dig för att flytta hela projektet till en annan maskin.

Tyvärr har du inte använt något som Docker Compose. Därför måste du flytta och konfigurera tjänster en och en, och hoppas att du inte glömmer något under arbetets gång.

Men om du använder Docker Compose är flytten av ditt projekt till en ny server en fråga som löses med några kommandon. För att slutföra flytten av projektet till den nya platsen behöver du bara göra vissa inställningar och ladda upp en säkerhetskopia av databasen till den nya servern.

Utveckling av ett klient-server-applikation med Docker Compose

Nu när du vet vad vi ska använda Docker Compose till är det dags att skapa din första klient-server-applikation med hjälp av detta verktyg. Det handlar om att utveckla en liten webbplats (server) i Python som kan returnera en fil med en textsnutt. Denna fil begärs av ett program (klient) som också är skrivet i Python. Efter att ha fått filen från servern skriver programmet ut texten som finns i den på skärmen.

Observera att vi förväntar oss att du har grundläggande kunskaper i Docker och att du redan har installerat Docker-plattformen.

Låt oss börja arbeta med projektet.

▍1. Skapa projektet

För att bygga din första klient-server-applikation föreslår jag att vi börjar med att skapa en projektmapp. Den bör innehålla följande filer och mappar:

  • Fil docker-compose.ymlDet här är en Docker Compose-fil som kommer att innehålla instruktioner som krävs för att köra och konfigurera tjänster.
  • Mapp serverDen kommer att innehålla filer som är nödvändiga för att servern ska fungera.
  • Mapp klientHär kommer filerna för klientapplikationen att finnas.

Som ett resultat bör innehållet i huvudmappen för ditt projekt se ut så här:

.
├── client/
├── docker-compose.yml
└── server/
2 kataloger, 1 fil

▍2. Skapa servern

Här kommer vi, under skapandet av servern, att ta upp några grundläggande saker som rör Docker.

2a. Skapa filer

och starta applikationen med följande kommando: server och skapa följande filer i den:

  • Fil server.py. Den kommer att innehålla serverkoden.
  • Fil index.html. I den här filen kommer det att finnas en textsnutt som klientapplikationen ska visa.
  • Fil Dockerfile. Detta är en Docker-fil som kommer att innehålla instruktioner som krävs för att skapa servermiljön.

Så här bör innehållet i din mapp se ut server/:

.
├── Dockerfile
├── index.html
└── server.py
0 kataloger, 3 filer

2b. Redigera Python-filen.

Lägg till i filen server.py följande kod:

#!/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()

Denna kod gör det möjligt att skapa en enkel webbserver. Den kommer att leverera filen till klienterna index.html, vars innehåll senare kommer att visas på webbsidan.

2c. Redigera HTML-filen

Till filen index.html lägger vi till följande text:

Docker-Compose är magi!

Denna text kommer att skickas till klienten.

2d. Redigera Dockerfile-filen

Nu ska vi skapa en enkel fil Dockerfile, som kommer att ansvara för att organisera körmiljön för Python-servern. Som grund för den skapade bilden använder vi den officiella bilden, avsedd för att köra program skrivna i Python. Här är innehållet i 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/

Nu ska vi arbeta med klienten.

▍3. Skapa klienten

När vi skapar klientdelen av vårt projekt kommer vi samtidigt att minnas några grunder i Docker.

3a. Skapa filer

Gå till mappen för ditt projekt klient och skapa följande filer i den:

  • Fil client.py. Här kommer klientkoden att finnas.
  • Fil Dockerfile. Denna fil spelar samma roll som motsvarande fil i servermappen. Nämligen, den innehåller instruktionen som beskriver skapandet av miljön för att köra klientkoden.

Som ett resultat bör din mapp client/ i detta skede av arbetet se ut så här:

.
├── client.py
└── Dockerfile
0 kataloger, 2 filer

3b. Redigera Python-filen

Lägg till i filen client.py följande kod:

#!/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()

Tack vare denna kod kan klientapplikationen hämta data från servern och visa dem på skärmen.

3c. Redigera Dockerfile-filen

Som med servern skapar vi för klienten en enkel Dockerfile, ansvarig för att skapa miljön där Python-klientapplikationen kommer att köras. Här är koden för klienten Dockerfile:

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

FROM python:latest

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

ADD client.py /client/

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

WORKDIR /client/

▍4. Docker Compose

Som du kanske har märkt har vi skapat två olika projekt: server och klient. Var och en av dem har sin egen fil Dockerfile. Fram tills nu har allt som hänt legat inom ramen för de grundläggande funktionerna i Docker. Nu går vi vidare till arbetet med Docker Compose. För detta ska vi titta på filen docker-compose.yml, som ligger i projektets rotmapp.

Observera att vi här inte strävar efter att täcka alla kommandon som kan användas i docker-compose.yml. Vårt huvudmål är att granska ett praktiskt exempel som ger dig grundläggande kunskap om Docker Compose.

Här är koden som ska placeras i filen 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. Bygga projektet

När docker-compose.yml har fått alla nödvändiga instruktioner måste projektet byggas. Detta steg i vårt arbete liknar användningen av kommandot docker build, men det motsvarande kommandot gäller flera tjänster:

$ docker-compose build

▍6. Starta projektet

Nu när projektet är byggt är det dags att starta det. Detta steg i vårt arbete motsvarar steget där, när man arbetar med enskilda containrar, kommandot docker run:

$ docker-compose up

Efter att ha kört detta kommando ska texten som laddas ner av klienten från servern visas i terminalen: Docker-Compose är magi!.

Som redan nämnts använder servern datorns port 1234 för att tillhandahålla tjänster till klienten. Så om man går till webbläsaren och skriver in adressen http://localhost:1234/, kommer en sida med texten att visas Docker-Compose är magi!.

Nyttiga kommandon

Låt oss titta på några kommandon som kan vara användbara när man arbetar med Docker Compose.

Detta kommando låter dig stoppa och ta bort containrar och andra resurser som skapats av kommandot docker-compose up:

$ docker-compose down

Detta kommando visar logs för tjänsterna:

$ docker-compose logs -f [service name]

Till exempel kan det användas i vårt projekt på följande sätt: $ docker-compose logs -f [service name].

Med hjälp av ett sådant kommando kan du lista containrar:

$ docker-compose ps

Detta kommando låter dig köra ett kommando i en körande container:

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

Till exempel kan det se ut så här: docker-compose exec server ls.

Ett sådant kommando gör det möjligt att lista bilder:

$ docker-compose images

Sammanfattning

Vi har granskat grunderna i arbetet med Docker Compose-teknologin, vilken kunskap kommer att låta dig använda denna teknologi och, om så önskas, börja studera den djupare. Här är repository med projektkoden som vi har diskuterat här.

Kära läsare! Använder du Docker Compose i dina projekt?

En nybörjarguide till Docker Compose

Källa: habr.com

Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar 🔥 Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster