Guida a Docker Compose per principianti

L'autore dell'articolo, la cui traduzione pubblichiamo oggi, afferma che è destinato a quei sviluppatori che desiderano approfondire Docker Compose e sono in procinto di creare la loro prima applicazione client-server utilizzando Docker. Si presume che il lettore di questo materiale abbia familiarità con le basi di Docker. Se così non fosse, puoi dare un'occhiata a questa una serie di materiali, su questa una pubblicazione in cui le basi di Docker sono esaminate insieme alle basi di Kubernetes, e su questa un articolo per principianti.

Guida a Docker Compose per principianti

Che cos'è Docker Compose?

Docker Compose è uno strumento che fa parte di Docker. È destinato a risolvere problemi legati al deployment di progetti.

Studiare le basi di Docker potrebbe averti portato a creare applicazioni semplici che funzionano in modo autonomo, non dipendenti, ad esempio, da fonti di dati esterne o da determinati servizi. Nella pratica, però, simili applicazioni sono rare. I progetti reali di solito includono un insieme di applicazioni che lavorano insieme.

Come puoi sapere se, durante il deployment di un progetto, ti serve utilizzare Docker Compose? In realtà è molto semplice. Se per il funzionamento di questo progetto vengono utilizzati più servizi, Docker Compose potrebbe esserti utile. Ad esempio, in una situazione in cui viene creato un sito web che, per l'autenticazione degli utenti, deve connettersi a un database. Un progetto simile potrebbe consistere in due servizi: quello che gestisce il sito e quello responsabile della gestione del database.

La tecnologia Docker Compose, se la descriviamo in modo semplificato, consente di avviare numerosi servizi con un solo comando.

La differenza tra Docker e Docker Compose

Docker è utilizzato per gestire singoli container (servizi) di cui è composto l'applicativo.

Docker Compose è utilizzato per gestire simultaneamente più container che fanno parte dell'applicativo. Questo strumento offre le stesse funzionalità di Docker, ma consente di lavorare con applicazioni più complesse.

Guida a Docker Compose per principianti
Docker (container singolo) e Docker Compose (più container)

Scenari tipici di utilizzo di Docker Compose

Docker Compose è uno strumento molto potente, nelle mani esperte, che consente di distribuire rapidamente applicazioni con architetture complesse. Ora esamineremo un esempio pratico dell'uso di Docker Compose, il cui esame ti permetterà di valutare i vantaggi che l'uso di Docker Compose ti apporterà.

Immagina di essere uno sviluppatore di un progetto web. Questo progetto include due siti web. Il primo consente alle persone che gestiscono un'attività di creare, con pochi clic del mouse, negozi online. Il secondo è destinato a fornire supporto ai clienti. Questi due siti interagiscono con lo stesso database.

Il tuo progetto sta diventando sempre più popolare e scopri che le risorse del server su cui opera non sono più sufficienti. Di conseguenza, decidi di trasferire l'intero progetto su un'altra macchina.

Sfortunatamente, non hai utilizzato nulla di simile a Docker Compose. Pertanto, dovrai trasferire e riconfigurare i servizi uno per uno, sperando di non dimenticare nulla durante questo processo.

Se usi Docker Compose, il trasferimento del tuo progetto su un nuovo server è una questione che si risolve con pochi comandi. Per completare il trasferimento del progetto in una nuova posizione, devi solo eseguire alcune configurazioni e caricare sul nuovo server un backup del database.

Sviluppo di un'applicazione client-server utilizzando Docker Compose

Ora che sai a cosa intendiamo utilizzare Docker Compose, è tempo di creare la tua prima applicazione client-server con questo strumento. Si tratta nello specifico dello sviluppo di un piccolo sito web (server) in Python, che è in grado di fornire un file con un frammento di testo. Questo file è richiesto da un programma (client), anch'esso scritto in Python. Dopo aver ricevuto il file dal server, il programma visualizza il testo contenuto nel file sullo schermo.

Si prega di notare che ci aspettiamo che tu abbia una comprensione di base di Docker e che tu abbia già installato la piattaforma Docker.

Iniziamo a lavorare sul progetto.

▍1. Creazione del progetto

Per costruire la tua prima applicazione client-server, ti suggerisco di iniziare creando la cartella del progetto. Questa dovrebbe contenere i seguenti file e cartelle:

  • all'interno di ogni container per impostazione predefinita apparirà così: docker-compose.yml. Questo è un file Docker Compose che conterrà le istruzioni necessarie per avviare e configurare i servizi.
  • Cartella server. Questa conterrà i file necessari per garantire il funzionamento del server.
  • Cartella client. Qui si troveranno i file dell'applicazione client.

Di conseguenza, il contenuto della cartella principale del tuo progetto dovrebbe apparire così:

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

▍2. Creazione del server

Qui, durante il processo di creazione del server, tratteremo alcune cose basilari relative a Docker.

2a. Creazione dei file

Vai alla cartella server e crea i seguenti file al suo interno:

  • all'interno di ogni container per impostazione predefinita apparirà così: server.py. Qui sarà presente il codice del server.
  • all'interno di ogni container per impostazione predefinita apparirà così: index.html. In questo file ci sarà un frammento di testo che l'applicazione client deve restituire.
  • all'interno di ogni container per impostazione predefinita apparirà così: Dockerfile. Questo è un file Docker che conterrà le istruzioni necessarie per creare l'ambiente del server.

Ecco come dovrebbe apparire il contenuto della tua cartella server/:

.
├── Dockerfile
├── index.html
└── server.py
0 directory, 3 file

2b. Modifica del file Python.

Aggiungiamo al file server.py il seguente codice:

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

Questo codice permette di creare un semplice server web. Restituirà ai client il file index.html, il cui contenuto sarà successivamente visualizzato sulla pagina web.

2c. Modifica del file HTML

Nel file index.html aggiungeremo il seguente testo:

Docker-Compose è magia!

Questo testo sarà comunicato al client.

2d. Modifica del file Dockerfile

Ora creeremo un semplice file Dockerfile, che sarà responsabile dell'organizzazione dell'ambiente di esecuzione per il server Python. Come base per l'immagine che stiamo creando, utilizzeremo l'immagine ufficiale, destinata all'esecuzione di programmi scritti in Python. Ecco il contenuto del 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/

Ora ci occuperemo del lavoro sul client.

▍3. Creazione del client

Creando la parte client del nostro progetto, ricorderemo anche alcune nozioni di base su Docker.

3a. Creazione dei file

Vai alla cartella del tuo progetto client e crea i seguenti file al suo interno:

  • all'interno di ogni container per impostazione predefinita apparirà così: client.py. Qui sarà presente il codice del client.
  • all'interno di ogni container per impostazione predefinita apparirà così: Dockerfile. Questo file svolge lo stesso ruolo del file analogo nella cartella del server. Ovvero, contiene l'istruzione che descrive la creazione dell'ambiente per l'esecuzione del codice client.

Di conseguenza, la tua cartella client/ in questa fase del lavoro dovrebbe apparire così:

.
├── client.py
└── Dockerfile
0 directory, 2 file

3b. Modifica del file Python

Aggiungiamo al file client.py il seguente codice:

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

Grazie a questo codice, l'applicazione client può caricare dati dal server e visualizzarli sullo schermo.

3c. Modifica del file Dockerfile

Come nel caso del server, stiamo creando per il client un semplice Dockerfile, responsabile della creazione dell'ambiente in cui funzionerà l'applicazione client Python. Ecco il codice del client Dockerfile:

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

FROM python:latest

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

ADD client.py /client/

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

WORKDIR /client/

▍4. Docker Compose

Come avrete notato, abbiamo creato due progetti diversi: server e client. Ognuno di essi ha il proprio file Dockerfile. Fino ad ora, tutto ciò che è accaduto non esce dai fondamenti dell'uso di Docker. Ora iniziamo a lavorare con Docker Compose. A questo scopo, facciamo riferimento al file docker-compose.yml, situato nella cartella radice del progetto.

Si noti che qui non ci proponiamo di affrontare assolutamente tutti i comandi che è possibile utilizzare in docker-compose.yml. Il nostro obiettivo principale è analizzare un esempio pratico che vi fornisca conoscenze di base su Docker Compose.

Ecco il codice che deve essere inserito nel file 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. Costruzione del progetto

Dopo che nel docker-compose.yml sono state inserite tutte le istruzioni necessarie, è necessario costruire il progetto. Questo passaggio del nostro lavoro ricorda l'uso del comando docker build, ma il comando corrispondente riguarda più servizi:

$ docker-compose build

▍6. Avvio del progetto

Ora che il progetto è stato costruito, è tempo di avviarlo. Questo passaggio del nostro lavoro corrisponde al passaggio in cui, durante il lavoro con container separati, viene eseguito il comando docker run:

$ docker-compose up

Dopo aver eseguito questo comando nel terminale, dovrebbe apparire il testo caricato dal client dal server: Docker-Compose è magia!.

Come già detto, il server utilizza la porta del computer 1234 per gestire le richieste del client. Pertanto, se visitate nel browser l'indirizzo http://localhost:1234/, verrà visualizzata una pagina con il testo Docker-Compose è magia!.

Comandi utili

Analizziamo alcuni comandi che potrebbero esservi utili durante il lavoro con Docker Compose.

Questo comando permette di arrestare e rimuovere i container e altre risorse create dal comando docker-compose up:

$ docker-compose down

Questo comando visualizza i log dei servizi:

$ docker-compose logs -f [service name]

Ad esempio, nel nostro progetto può essere utilizzato in questo modo: $ docker-compose logs -f [service name].

Con questo comando è possibile visualizzare l'elenco dei container:

$ docker-compose ps

Questo comando permette di eseguire un comando in un container in esecuzione:

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

Ad esempio, potrebbe apparire così: docker-compose exec server ls.

Questo comando permette di visualizzare l'elenco delle immagini:

$ docker-compose images

Conclusioni

Abbiamo esaminato le basi dell'uso della tecnologia Docker Compose, la conoscenza delle quali vi consentirà di utilizzare questa tecnologia e, se lo desiderate, di iniziare a studiarla più approfonditamente. Ecco repository con il codice del progetto che abbiamo esaminato qui.

Gentili lettori! Utilizzi Docker Compose nei tuoi progetti?

Guida a Docker Compose per principianti

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS 🔥 Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS - ProHoster