Guida alla composizione di Docker per principianti

L'autore dell'articolo che pubblichiamo oggi afferma che è destinato a quegli sviluppatori che vogliono imparare Docker Compose e sono sulla buona strada per creare la loro prima applicazione client-server utilizzando Docker. Si presuppone che il lettore di questo materiale abbia familiarità con le basi di Docker. Se questo non è il caso, puoi dare un'occhiata a questo serie di materiali questo un post che copre le nozioni di base di Docker insieme alle nozioni di base di Kubernetes e questo articolo per principianti.

Guida alla composizione di Docker per principianti

Cos'è Docker Compose?

Docker Compose è uno strumento incluso con Docker. È progettato per risolvere i problemi relativi alla distribuzione dei progetti.

Imparando le basi di Docker, potresti esserti imbattuto nella creazione delle applicazioni più semplici che funzionano in modo autonomo, non dipendendo, ad esempio, da fonti dati esterne o da determinati servizi. In pratica, tali applicazioni sono rare. I progetti reali di solito coinvolgono tutta una serie di applicazioni collaborative.

Come fai a sapere se è necessario utilizzare Docker Compose durante la distribuzione di un progetto? In realtà è molto semplice. Se utilizzi più servizi per eseguire questo progetto, Docker Compose potrebbe tornare utile. Ad esempio, in una situazione in cui si crea un sito Web che, per eseguire l'autenticazione dell'utente, deve connettersi a un database. Tale progetto può consistere in due servizi: uno che garantisce il funzionamento del sito e l'altro che è responsabile del supporto del database.

La tecnologia Docker Compose, se la descrivi in ​​modo semplificato, consente di avviare molti servizi con un unico comando.

Differenza tra Docker e Docker Compose

Docker viene utilizzato per gestire i singoli contenitori (servizi) che compongono un'applicazione.

Docker Compose viene utilizzato per gestire più contenitori che fanno parte di un'applicazione contemporaneamente. Questo strumento offre le stesse funzionalità di Docker, ma ti consente di lavorare con applicazioni più complesse.

Guida alla composizione di Docker per principianti
Docker (contenitore singolo) e Docker Compose (contenitori multipli)

Tipico caso d'uso di Docker Compose

Docker Compose è, nelle mani giuste, uno strumento molto potente che consente di distribuire rapidamente applicazioni con architetture complesse. Adesso vedremo un esempio di utilizzo pratico di Docker Compose, la cui analisi ti permetterà di valutare i vantaggi che ti darà l'utilizzo di Docker Compose.

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

Il tuo progetto sta diventando sempre più popolare e si scopre che la capacità del server su cui funziona non è più sufficiente. Di conseguenza, decidi di trasferire l'intero progetto su un'altra macchina.

Sfortunatamente, non hai usato qualcosa come Docker Compose. Pertanto, dovrai migrare e riconfigurare i servizi uno alla volta, sperando di non dimenticare nulla nel processo di questo lavoro.

Se utilizzi Docker Compose, la migrazione del tuo progetto su un nuovo server è un problema che può essere risolto eseguendo alcuni comandi. Per completare il trasferimento del progetto in una nuova posizione, è sufficiente effettuare alcune impostazioni e caricare una copia di backup del database sul nuovo server.

Sviluppo di un'applicazione client-server utilizzando Docker Compose

Ora che sai per cosa utilizzeremo Docker Compose, è il momento di creare la tua prima applicazione client/server utilizzando questo strumento. Stiamo parlando cioè dello sviluppo di un piccolo sito web (server) in Python, che può produrre un file con un frammento di testo. Questo file viene richiesto al server da un programma (client), anch'esso scritto in Python. Dopo aver ricevuto il file dal server, il programma visualizza sullo schermo il testo in esso memorizzato.

Tieni presente che presupponiamo che tu abbia le nozioni di base di Docker e che tu abbia già installato la piattaforma Docker.

Iniziamo a lavorare sul progetto.

▍1. Crea un progetto

Per creare la tua prima applicazione client/server, ti suggerisco di iniziare creando una cartella di progetto. Dovrebbe contenere i seguenti file e cartelle:

  • file docker-compose.yml. Questo è un file Docker Compose che conterrà le istruzioni necessarie per avviare e configurare i servizi.
  • Cartella server. Conterrà i file necessari per far funzionare il server.
  • Cartella client. È qui che verranno posizionati i file dell'applicazione client.

Di conseguenza, il contenuto della cartella principale del tuo progetto dovrebbe assomigliare a questo:

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

▍2. Creazione del server

Qui, nel processo di creazione di un server, toccheremo alcune cose basilari riguardanti Docker.

2a. Creazione di file

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

  • file server.py. Conterrà il codice del server.
  • file index.html. Questo file conterrà una parte di testo che dovrà essere visualizzata dall'applicazione client.
  • file Dockerfile. Questo è il file Docker che conterrà le istruzioni necessarie per creare l'ambiente server.

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

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

2b. Modifica di un file Python.

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

2c. Modifica di un file HTML

Da archiviare index.html aggiungere il seguente testo:

Docker-Compose is magic!

Questo testo verrà inviato al cliente.

2d. Modifica del Dockerfile

Ora creeremo un semplice file Dockerfile, che sarà responsabile dell'organizzazione dell'ambiente runtime per il server Python. Utilizzeremo la base dell'immagine creata in modo ufficiale, progettato 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 lavoriamo sul client.

▍3. Crea un cliente

Durante la creazione del lato client del nostro progetto, ricorderemo alcune nozioni di base su Docker lungo il percorso.

3a. Creazione di file

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

  • file client.py. Qui è dove sarà il codice cliente.
  • file Dockerfile. Questo file svolge lo stesso ruolo di un file simile nella cartella del server. Vale a dire, contiene una dichiarazione che descrive come creare un ambiente per l'esecuzione del codice client.

Di conseguenza, la tua cartella client/ In questa fase dovrebbe assomigliare a questo:

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

3b. Modifica di un file Python

Aggiungi 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ò scaricare i dati dal server e visualizzarli sullo schermo.

3c. Modifica del Dockerfile

Come nel caso del server, creiamo per il client un semplice Dockerfile, responsabile della definizione dell'ambiente in cui verrà eseguita l'applicazione client Python. Ecco il codice cliente Dockerfile:

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

FROM python:latest

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

ADD client.py /client/

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

WORKDIR /client/

▍4. Docker Componi

Come puoi vedere, abbiamo creato due progetti diversi: server e client. Ognuno di loro ha il proprio file Dockerfile. Finora, tutto ciò che accade non va oltre le basi del lavoro con Docker. Ora possiamo lavorare con Docker Compose. Per fare ciò, fare riferimento al file docker-compose.ymlsituato nella cartella principale del progetto.

Tieni presente che qui non miriamo a coprire assolutamente tutti i comandi che possono essere utilizzati in docker-compose.yml. Il nostro obiettivo principale è quello di analizzare un esempio pratico che fornisca una conoscenza di base di 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. Realizzazione del progetto

Dopo dentro docker-compose.yml sono state fornite tutte le istruzioni necessarie, il progetto deve essere assemblato. Questo passaggio del nostro lavoro ricorda l'uso del comando docker build, ma il comando corrispondente è relativo a diversi servizi:

$ docker-compose build

▍6. Lancio del progetto

Ora che il progetto è stato creato, è il momento di eseguirlo. Questa fase del nostro lavoro corrisponde alla fase in cui, quando si lavora con singoli contenitori, 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 is magic!.

Come già accennato, il server utilizza la porta del computer 1234 per soddisfare le richieste dei clienti. Pertanto, se vai nel browser all'indirizzo http://localhost:1234/, verrà visualizzata una pagina con testo Docker-Compose is magic!.

Comandi utili

Diamo un'occhiata ad alcuni dei comandi che potresti trovare utili quando lavori con Docker Compose.

Questo comando consente di arrestare ed eliminare contenitori e altre risorse create dal comando docker-compose up:

$ docker-compose down

Questo comando stampa i log del servizio:

$ docker-compose logs -f [service name]

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

Con questo comando puoi visualizzare un elenco di contenitori:

$ docker-compose ps

Questo comando ti consente di eseguire un comando in un contenitore in esecuzione:

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

Ad esempio, potrebbe assomigliare a questo: docker-compose exec server ls.

Questo comando consente di visualizzare un elenco di immagini:

$ docker-compose images

Risultati di

Abbiamo trattato le basi del lavoro con la tecnologia Docker Compose, la cui conoscenza ti consentirà di utilizzare questa tecnologia e, se lo desideri, di iniziare a studiarla in modo più approfondito. Qui repository con il codice del progetto, che abbiamo considerato qui.

Cari lettori! Utilizzi Docker Compose nei tuoi progetti?

Guida alla composizione di Docker per principianti

Fonte: habr.com

Aggiungi un commento