Docker Compose Guide för nybörjare

Författaren till artikeln, som vi publicerar idag, säger att den är avsedd för de utvecklare som vill lära sig Docker Compose och är på väg att skapa sin första klient-serverapplikation med Docker. Det antas att läsaren av detta material är bekant med grunderna i Docker. Om så inte är fallet kan du ta en titt på detta serie av material detta ett inlägg som täcker grunderna i Docker tillsammans med grunderna i Kubernetes, och detta artikel för nybörjare.

Docker Compose Guide för nybörjare

Vad är Docker Compose?

Docker Compose är ett verktyg som ingår i Docker. Den är utformad för att lösa problem relaterade till utplaceringen av projekt.

Medan du lär dig grunderna i Docker kan du ha stött på skapandet av de enklaste applikationerna som fungerar autonomt, inte beroende till exempel på externa datakällor eller på vissa tjänster. I praktiken är sådana tillämpningar sällsynta. Verkliga projekt involverar vanligtvis en hel uppsättning samarbetsapplikationer.

Hur vet du om du behöver använda Docker Compose när du distribuerar ett projekt? Egentligen är det väldigt enkelt. Om du använder flera tjänster för att köra det här projektet kan Docker Compose vara praktiskt. Till exempel i en situation där du skapar en webbplats som, för att kunna utföra användarautentisering, behöver ansluta till en databas. Ett sådant projekt kan bestå av två tjänster - en som säkerställer driften av sajten och en som är ansvarig för att stödja databasen.

Docker Compose-teknik, för att beskriva det på ett förenklat sätt, låter dig starta många tjänster med ett kommando.

Skillnaden mellan Docker och Docker Compose

Docker används för att hantera de individuella behållare (tjänster) som utgör en applikation.

Docker Compose används för att hantera flera behållare som är en del av en applikation samtidigt. Detta verktyg erbjuder samma funktioner som Docker, men låter dig arbeta med mer komplexa applikationer.

Docker Compose Guide för nybörjare
Docker (enkel behållare) och Docker Compose (flera behållare)

Typiskt användningsfall för Docker Compose

Docker Compose är, i rätt händer, ett mycket kraftfullt verktyg som låter dig snabbt distribuera applikationer med komplexa arkitekturer. Nu ska vi titta på ett exempel på den praktiska användningen av Docker Compose, vars analys gör att du kan utvärdera fördelarna som användningen av Docker Compose kommer att ge dig.

Föreställ dig att du är utvecklare av ett webbprojekt. Detta projekt omfattar två webbplatser. Den första tillåter affärsmän att skapa onlinebutiker med bara några 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 kapaciteten på servern som det fungerar på inte längre räcker till. Som ett resultat bestämmer du dig för att överföra hela projektet till en annan maskin.

Tyvärr har du inte använt något som Docker Compose. Därför måste du migrera och konfigurera om tjänsterna en i taget, i hopp om att du inte kommer att glömma något i processen med detta arbete.

Om du använder Docker Compose är att flytta ditt projekt till en ny server en fråga som kan lösas genom att köra några kommandon. För att slutföra överföringen av projektet till en ny plats behöver du bara göra några inställningar och ladda upp en säkerhetskopia av databasen till den nya servern.

Utveckla en klient-serverapplikation 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/serverapplikation med det här verktyget. Vi pratar nämligen om utvecklingen av en liten webbplats (server) i Python, som kan producera en fil med ett textfragment. Denna fil begärs från servern av ett program (klient), även skrivet i Python. Efter att ha tagit emot filen från servern visar programmet texten som är lagrad i den på skärmen.

Observera att vi antar att du har grunderna i Docker och att du redan har Docker-plattformen installerad.

Låt oss börja arbeta med projektet.

▍1. Skapa ett projekt

För att bygga din första klient/serverapplikation föreslår jag att du börjar med att skapa en projektmapp. Den bör innehålla följande filer och mappar:

  • fil docker-compose.yml. Detta är en Docker Compose-fil som innehåller instruktionerna som behövs för att starta och konfigurera tjänsterna.
  • Mapp server. Den kommer att innehålla de filer som behövs för att få servern att fungera.
  • Mapp client. Det är här klientapplikationsfilerna kommer 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 directories, 1 file

▍2. Skapande av server

Här kommer vi, i processen att skapa en server, att beröra några grundläggande saker angående Docker.

2a. Skapa filer

Gå till mappen server och skapa följande filer i den:

  • fil server.py. Den kommer att innehålla serverkoden.
  • fil index.html. Den här filen kommer att innehålla en bit text som klientprogrammet ska visa.
  • fil Dockerfile. Detta är Docker-filen som kommer att innehålla instruktionerna som behövs för att skapa servermiljön.

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

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

2b. Redigera en Python-fil.

Lägg till i fil 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 låter dig skapa en enkel webbserver. Han kommer att ge kunderna en fil index.html, vars innehåll senare kommer att visas på webbsidan.

2c. Redigera en HTML-fil

Att fila index.html lägg till följande text:

Docker-Compose is magic!

Denna text kommer att skickas till kunden.

2d. Redigera dockerfilen

Nu ska vi skapa en enkel fil Dockerfile, som kommer att ansvara för att organisera runtime-miljön för Python-servern. Som grund för den skapade bilden kommer vi att använda officiellt, designad för att köra program skrivna i Python. Här är innehållet i Dockerfilen:

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

Låt oss nu arbeta med klienten.

▍3. Skapa en klient

När vi skapar kundsidan av vårt projekt kommer vi att komma ihåg några grunder i Docker längs vägen.

3a. Skapa filer

Gå till din projektmapp client och skapa följande filer i den:

  • fil client.py. Det är här klientkoden kommer att finnas.
  • fil Dockerfile. Den här filen spelar samma roll som en liknande fil i servermappen. Den innehåller nämligen instruktioner som beskriver hur man skapar en miljö för exekvering av klientkod.

Som ett resultat, din mapp client/ I det här skedet borde det se ut så här:

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

3b. Redigera en Python-fil

Lägg till i fil 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 ladda ner data från servern och visa den på skärmen.

3c. Redigera dockerfilen

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

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

FROM python:latest

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

ADD client.py /client/

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

WORKDIR /client/

▍4. Docker Compose

Som du kan se har vi skapat två olika projekt: server och klient. Var och en av dem har sin egen fil Dockerfile. Än så länge går inte allt som händer utöver grunderna för att arbeta med Docker. Nu börjar vi jobba med Docker Compose. För att göra detta, se filen docker-compose.ymlfinns i projektets rotmapp.

Observera att vi här inte syftar till att täcka absolut alla kommandon som kan användas i docker-compose.yml. Vårt huvudmål är att bryta ner ett praktiskt exempel som ger dig grundläggande kunskaper om Docker Compose.

Här är koden att lägga 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. Projektuppbyggnad

Efter in docker-compose.yml alla nödvändiga instruktioner har gjorts, projektet måste monteras. Detta steg i vårt arbete liknar användningen av kommandot docker build, men motsvarande kommando är relaterat till flera tjänster:

$ docker-compose build

▍6. Lansering av projektet

Nu när projektet är byggt är det dags att köra det. Detta steg i vårt arbete motsvarar det steg vid vilket kommandot utförs när man arbetar med enskilda behållare docker run:

$ docker-compose up

Efter att ha utfört detta kommando bör texten som laddas av klienten från servern visas i terminalen: Docker-Compose is magic!.

Som redan nämnts använder servern datorporten 1234 för att betjäna kundernas önskemål. Därför, om du går i webbläsaren till adressen http://localhost:1234/, kommer den att visa en sida med text Docker-Compose is magic!.

Användbara kommandon

Låt oss ta en titt på några av kommandona som du kan ha nytta av när du arbetar med Docker Compose.

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

$ docker-compose down

Detta kommando skriver ut serviceloggarna:

$ docker-compose logs -f [service name]

Till exempel, i vårt projekt kan det användas i denna form: $ docker-compose logs -f [service name].

Med det här kommandot kan du visa en lista med behållare:

$ docker-compose ps

Detta kommando låter dig utföra ett kommando i en körande behållare:

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

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

Detta kommando låter dig visa en lista med bilder:

$ docker-compose images

Resultat av

Vi har tittat på grunderna för att arbeta med Docker Compose-teknik, vars kunskap gör att du kan använda denna teknik och, om så önskas, börja studera den mer på djupet. Här repository med projektkoden, som vi övervägde här.

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

Docker Compose Guide för nybörjare

Källa: will.com

Lägg en kommentar