En nybegynnerveiledning til Docker Compose

Forfatteren av artikkelen, oversettelsen av som vi publiserer i dag, sier at den er beregnet på de utviklerne som ønsker å lære Docker Compose og går mot å lage sin første klient-server-applikasjon ved hjelp av Docker. Det antas at leseren av dette materialet er kjent med det grunnleggende om Docker. Hvis dette ikke er tilfelle, kan du ta en titt på dette rekke materialer på dette innlegg som dekker Docker grunnleggende sammen med Kubernetes grunnleggende, og dette artikkel for nybegynnere.

En nybegynnerveiledning til Docker Compose

Hva er Docker Compose?

Docker Compose er et verktøy som følger med Docker. Den er designet for å løse problemer knyttet til prosjektdistribusjon.

Mens du lærte det grunnleggende om Docker, kan det hende du har opplevd å lage enkle applikasjoner som fungerer autonomt og ikke er avhengige av for eksempel eksterne datakilder eller visse tjenester. I praksis er slike applikasjoner sjeldne. Virkelige prosjekter involverer vanligvis et helt sett med søknader som jobber sammen.

Hvordan vet du om du trenger å bruke Docker Compose når du distribuerer et prosjekt? Det er faktisk veldig enkelt. Hvis du bruker flere tjenester for å få dette prosjektet til å fungere, kan Docker Compose være nyttig. For eksempel i en situasjon der de oppretter et nettsted som må kobles til en database for å autentisere brukere. Et slikt prosjekt kan bestå av to tjenester – den som sikrer driften av siden, og den som er ansvarlig for å vedlikeholde databasen.

Docker Compose-teknologi, for å beskrive den på en forenklet måte, lar deg starte mange tjenester med én kommando.

Forskjellen mellom Docker og Docker Compose

Docker brukes til å administrere de individuelle containerne (tjenestene) som utgjør en applikasjon.

Docker Compose brukes til å administrere flere containere som utgjør en applikasjon samtidig. Dette verktøyet tilbyr de samme egenskapene som Docker, men lar deg jobbe med mer komplekse applikasjoner.

En nybegynnerveiledning til Docker Compose
Docker (enkeltbeholder) og Docker Compose (flere beholdere)

Typisk brukstilfelle for Docker Compose

Docker Compose er, i de riktige hender, et veldig kraftig verktøy som lar deg veldig raskt distribuere applikasjoner med komplekse arkitekturer. Nå skal vi se på et eksempel på praktisk bruk av Docker Compose, hvis analyse vil tillate deg å vurdere fordelene ved å bruke Docker Compose.

Tenk deg at du er en utvikler av et nettprosjekt. Dette prosjektet inkluderer to nettsteder. Den første lar forretningsfolk lage nettbutikker med bare noen få klikk. Den andre er rettet mot kundestøtte. Disse to nettstedene samhandler med den samme databasen.

Prosjektet ditt blir mer og mer populært, og det viser seg at kraften til serveren den kjører på ikke lenger er nok. Som et resultat bestemmer du deg for å flytte hele prosjektet til en annen maskin.

Dessverre brukte du ikke noe som Docker Compose. Derfor må du overføre og rekonfigurere tjenester én om gangen, i håp om at du ikke vil glemme noe i prosessen.

Hvis du bruker Docker Compose, er det å flytte prosjektet til en ny server en sak som kan løses ved å kjøre noen få kommandoer. For å fullføre overføringen av prosjektet til et nytt sted, trenger du bare å gjøre noen innstillinger og laste opp en sikkerhetskopi av databasen til den nye serveren.

Utvikle en klient-server-applikasjon ved hjelp av Docker Compose

Nå som du vet hva vi skal bruke Docker Compose til, er det på tide å lage din første klient-server-applikasjon ved å bruke dette verktøyet. Vi snakker nemlig om å utvikle en liten nettside (server) i Python som kan sende ut en fil med et fragment av tekst. Denne filen er forespurt fra serveren av et program (klient), også skrevet i Python. Etter å ha mottatt en fil fra serveren, viser programmet teksten som er lagret i den på skjermen.

Vær oppmerksom på at vi antar at du har en grunnleggende forståelse av Docker og at du allerede har Docker-plattformen installert.

La oss begynne å jobbe med prosjektet.

▍1. Opprette et prosjekt

For å bygge din første klient-server-applikasjon foreslår jeg at du starter med å lage en prosjektmappe. Den skal inneholde følgende filer og mapper:

  • fil docker-compose.yml. Dette er en Docker Compose-fil som vil inneholde instruksjonene som trengs for å starte og konfigurere tjenestene.
  • Folder server. Den vil inneholde filene som er nødvendige for å holde serveren i gang.
  • Folder client. Klientapplikasjonsfilene vil være plassert her.

Som et resultat bør innholdet i prosjektets hovedmappe se slik ut:

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

▍2. Opprette en server

Her, i prosessen med å lage en server, vil vi berøre noen grunnleggende ting angående Docker.

2a. Opprette filer

Gå til mappen server og lag følgende filer i den:

  • fil server.py. Den vil inneholde serverkoden.
  • fil index.html. Denne filen vil inneholde et stykke tekst som klientapplikasjonen skal sende ut.
  • fil Dockerfile. Dette er en Docker-fil som vil inneholde instruksjonene som trengs for å lage servermiljøet.

Slik skal innholdet i mappen din se ut server/:

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

2b. Redigere en Python-fil.

Legg til i fil server.py følgende kode:

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

Denne koden lar deg lage en enkel webserver. Han vil gi kundene filen index.html, hvis innhold senere vil bli vist på nettsiden.

2c. Redigere en HTML-fil

Å lagre index.html legg til følgende tekst:

Docker-Compose is magic!

Denne teksten vil bli sendt til klienten.

2d. Redigere Dockerfilen

Nå skal vi lage en enkel fil Dockerfile, som vil være ansvarlig for å organisere kjøretidsmiljøet for Python-serveren. Som grunnlag for det opprettede bildet vil vi bruke på offisiell måte, designet for å kjøre programmer skrevet i Python. Her er innholdet 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/

La oss nå begynne å jobbe med klienten.

▍3. Opprette en klient

Mens vi oppretter klientsiden av prosjektet vårt, vil vi huske noen grunnleggende Docker underveis.

3a. Opprette filer

Gå til prosjektmappen din client og lag følgende filer i den:

  • fil client.py. Klientkoden vil ligge her.
  • fil Dockerfile. Denne filen spiller samme rolle som en lignende fil i servermappen. Den inneholder nemlig instruksjoner som beskriver hvordan man lager et miljø for å utføre klientkode.

Som et resultat, mappen din client/ på dette stadiet av arbeidet skal det se slik ut:

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

3b. Redigere en Python-fil

Legg til i fil client.py følgende kode:

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

Med denne koden kan klientapplikasjonen laste ned data fra serveren og vise dem på skjermen.

3c. Redigere Dockerfilen

Som i tilfellet med serveren, lager vi en enkel Dockerfile, ansvarlig for å lage miljøet der Python-klientapplikasjonen skal kjøres. Her er klientkoden Dockerfile:

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

FROM python:latest

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

ADD client.py /client/

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

WORKDIR /client/

▍4. Docker Compose

Som du kanskje har lagt merke til, har vi laget to forskjellige prosjekter: en server og en klient. Hver av dem har sin egen fil Dockerfile. Så langt har ikke alt som har skjedd gått utover det grunnleggende ved å jobbe med Docker. Nå kommer vi i gang med Docker Compose. For å gjøre dette, la oss gå til filen docker-compose.yml, som ligger i prosjektets rotmapp.

Vær oppmerksom på at her prøver vi ikke å dekke absolutt alle kommandoene som kan brukes i docker-compose.yml. Vårt hovedmål er å gå gjennom et praktisk eksempel som vil gi deg grunnleggende kunnskap om Docker Compose.

Her er koden som skal legges inn 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. Bygge prosjektet

Etter inn docker-compose.yml Alle nødvendige instruksjoner er lagt inn, prosjektet må monteres. Dette trinnet i arbeidet vårt ligner på å bruke kommandoen docker build, men den tilsvarende kommandoen er relevant for flere tjenester:

$ docker-compose build

▍6. Lansering av prosjektet

Nå som prosjektet er satt sammen, er det på tide å lansere det. Dette trinnet i arbeidet vårt tilsvarer trinnet der kommandoen utføres når du arbeider med individuelle containere docker run:

$ docker-compose up

Etter å ha utført denne kommandoen, skal teksten lastet ned av klienten fra serveren vises i terminalen: Docker-Compose is magic!.

Som allerede nevnt bruker serveren datamaskinporten 1234 å betjene kundeforespørsler. Derfor, hvis du går til adressen i nettleseren din http://localhost:1234/, vil den vise en side med tekst Docker-Compose is magic!.

Nyttige kommandoer

La oss se på noen kommandoer som du kan finne nyttige når du arbeider med Docker Compose.

Denne kommandoen lar deg stoppe og slette beholdere og andre ressurser opprettet av kommandoen docker-compose up:

$ docker-compose down

Denne kommandoen skriver ut tjenestelogger:

$ docker-compose logs -f [service name]

For eksempel, i vårt prosjekt kan det brukes i denne formen: $ docker-compose logs -f [service name].

Ved å bruke denne kommandoen kan du vise en liste over beholdere:

$ docker-compose ps

Denne kommandoen lar deg utføre en kommando i en løpende beholder:

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

For eksempel kan det se slik ut: docker-compose exec server ls.

Denne kommandoen lar deg vise en liste over bilder:

$ docker-compose images

Resultater av

Vi har sett på det grunnleggende om å jobbe med Docker Compose-teknologi, som vil tillate deg å bruke denne teknologien og om ønskelig begynne å studere den mer i dybden. Her et depot med koden for prosjektet vi så på her.

Kjære lesere! Bruker du Docker Compose i prosjektene dine?

En nybegynnerveiledning til Docker Compose

Kilde: www.habr.com

Legg til en kommentar