Guida introduttiva a Docker Compose

L'autore dell'articolo che pubblichiamo oggi afferma che è destinato a quegli sviluppatori che desiderano apprendere Docker Compose e sono in procinto di creare la propria prima applicazione client-server utilizzando Docker. Si presume che il lettore di questo materiale abbia familiarità con i fondamenti di Docker. Se non è così, puoi dare un'occhiata a questo una serie di materiali su questo un articolo che tratta le basi di Docker insieme a quelle di Kubernetes, e questo un articolo per principianti.

Guida introduttiva a Docker Compose

Che cos'è Docker Compose?

Docker Compose è uno strumento che fa parte di Docker. È progettato per gestire attività relative al deployment dei progetti.

Imparando le basi di Docker, potresti aver affrontato la creazione delle applicazioni più semplici, funzionanti autonomamente, che non dipendono, ad esempio, da fonti di dati esterne o da alcuni servizi. Tuttavia, tali applicazioni sono rare in pratica. I progetti reali solitamente comprendono un'intera serie di applicazioni che lavorano insieme.

Come capire se, per distribuire un progetto, hai bisogno di utilizzare Docker Compose? In realtà è molto semplice. Se per il funzionamento di questo progetto vengono utilizzati più servizi, Docker Compose può tornarti utile. Ad esempio, nella situazione in cui si crea un sito web che, per l'autenticazione degli utenti, deve connettersi a un database. Un progetto di questo tipo può consistere in due servizi: quello che gestisce il sito e quello responsabile del supporto al database.

La tecnologia Docker Compose, in termini semplici, consente, con un solo comando, di avviare più servizi.

Differenza tra Docker e Docker Compose

Docker è usato per gestire singoli contenitori (servizi) che compongono l'applicazione.

Docker Compose è utilizzato per gestire simultaneamente più contenitori all'interno dell'applicazione. Questo strumento offre le stesse funzionalità di Docker, ma consente di lavorare con applicazioni più complesse.

Guida introduttiva a Docker Compose
Docker (contenitore singolo) e Docker Compose (più contenitori)

Scenario tipico di utilizzo di Docker Compose

Docker Compose — un potente strumento che, nelle mani esperte, permette di distribuire rapidamente applicazioni con architetture complesse. In questa sezione, esamineremo un esempio pratico di utilizzo di Docker Compose, che vi mostrerà i vantaggi che offre.

Immaginate di essere uno sviluppatore di un progetto web. Questo progetto comprende due siti web. Il primo consente agli imprenditori di creare, con pochi clic, negozi online. Il secondo è dedicato all'assistenza clienti. Questi due siti interagiscono con lo stesso database.

Il vostro progetto sta diventando sempre più popolare e vi rendete conto che le risorse del server su cui gira non sono più sufficienti. Pertanto, decidete di trasferire l'intero progetto su un'altra macchina.

Sfortunatamente, non avete utilizzato strumenti come Docker Compose. Pertanto, dovrete trasferire e riconfigurare i servizi uno a uno, sperando di non dimenticare nulla durante questo processo.

Se stai utilizzando Docker Compose, il trasferimento del tuo progetto su un nuovo server è una questione che si risolve eseguendo alcuni comandi. Per completare il trasferimento del progetto, devi solo eseguire alcune configurazioni e caricare una copia di backup del database sul nuovo server.

Sviluppo di un'applicazione client-server utilizzando Docker Compose

Ora che sai a cosa intendiamo usare Docker Compose, è giunto il momento di creare la tua prima applicazione client-server con questo strumento. In particolare, si tratta di sviluppare un piccolo sito web (server) in Python, capace di restituire un file contenente un estratto di testo. Questo file viene richiesto dal programma (cliente), anch'esso scritto in Python. Dopo aver ricevuto il file dal server, il programma visualizza il testo in esso contenuto sullo schermo.

Tieni presente che ci aspettiamo che tu abbia familiarità con le basi di Docker e che tu abbia già installato la piattaforma Docker.

Iniziamo a lavorare sul progetto.

▍1. Creazione del progetto

Per creare la tua prima applicazione client-server, ti propongo di iniziare creando una cartella per il progetto. Questa deve contenere i seguenti file e cartelle:

  • File docker-compose.ymlQuesto è il file Docker Compose, che conterrà le istruzioni necessarie per avviare e configurare i servizi.
  • Cartella serverQuesta conterrà i file necessari per il funzionamento del server.
  • Cartella clientQui si troveranno i file dell'applicazione client.

Pertanto, 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 la creazione del server, toccheremo alcune basi relative a Docker.

2a. Creazione dei file

Naviga nella cartella server e crea i seguenti file al suo interno:

  • File server.pyIn esso ci sarà il codice del server.
  • File index.htmlIn questo file ci sarà un frammento di testo che l'applicazione client deve stampare.
  • File DockerfileQuesto è il 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.

Aggiungeremo 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 consente di creare un semplice server web. Restituirà ai clienti un file index.html, il cui contenuto verrà successivamente visualizzato nella pagina web.

2c. Modifica del file HTML

Nel file index.html aggiungiamo il seguente testo:

Docker-Compose è magia!

Questo testo verrà inviato al cliente.

2d. Modifica del file Dockerfile

Ora creeremo un semplice file Dockerfile, che gestirà l'ambiente di esecuzione per il server Python. Come base per l'immagine che stiamo creando, utilizzeremo l'immagine ufficiale, progettata per eseguire 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 occupiamo della parte client.

▍3. Creazione del client

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

3a. Creazione dei file

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

  • File client.py. Qui si troverà il codice del client.
  • File Dockerfile. Questo file svolge lo stesso ruolo del file corrispondente nella cartella del server. In particolare, contiene le istruzioni che descrivono come creare l'ambiente per eseguire il codice client.

Di conseguenza, la tua cartella client/ a questo punto del lavoro dovrebbe apparire così:

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

3b. Modifica del file Python

Aggiungeremo 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'app client può caricare dati dal server e mostrarli sullo schermo.

3c. Modifica del file Dockerfile

Come nel caso del server, creiamo per il client un semplice Dockerfile, responsabile della creazione dell'ambiente in cui funzionerà l'applicazione Python del client. 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 distinti: server e client. Ognuno di essi ha un proprio file Dockerfile. Fino ad ora, tutto ciò che è successo resta all'interno delle basi di lavoro con Docker. Ora iniziamo a lavorare con Docker Compose. Per questo, facciamo riferimento al file docker-compose.yml, situato nella cartella radice del progetto.

Si noti che qui non ci proponiamo di esaminare tutte le comandi che possono essere utilizzati in docker-compose.yml. Il nostro obiettivo principale è analizzare un esempio pratico, fornendovi delle conoscenze di base su Docker Compose.

Ecco il codice da inserire 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 in docker-compose.yml sono state inserite tutte le istruzioni necessarie, il progetto deve essere costruito. Questo passo del nostro lavoro ricorda l'uso del comando docker build, ma il comando appropriato riguarda diversi servizi:

$ docker-compose build

▍6. Avvio del progetto

Ora che il progetto è stato assemblato, è tempo di avviarlo. Questo passaggio del nostro lavoro corrisponde a quello in cui, quando si lavora con contenitori 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 si accede nel browser all'indirizzo http://localhost:1234/, verrà visualizzata una pagina con il testo Docker-Compose è magia!.

Comandi utili

Esaminiamo alcuni comandi che potrebbero tornarti utili quando lavori con Docker Compose.

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

$ docker-compose down

Questo comando mostra i log dei servizi:

$ docker-compose logs -f [service name]

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

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

$ docker-compose ps

Questo comando consente di eseguire un comando all'interno di un contenitore in esecuzione:

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

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

Questo comando consente di visualizzare l'elenco delle immagini:

$ docker-compose images

Risultati

Abbiamo esaminato le basi del funzionamento con la tecnologia Docker Compose, una conoscenza che ti permetterà di utilizzare questa tecnologia e, se lo desideri, di iniziare uno studio più approfondito. Ecco il repository con il codice del progetto che abbiamo esaminato qui.

Gentili lettori! Usi Docker Compose nei tuoi progetti?

Guida introduttiva a Docker Compose

Fonte: habr.com

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