Docker Compose Guida per i principianti

L'autore di l'articulu, chì publichemu oghje, dice chì hè destinatu à quelli sviluppatori chì volenu amparà Docker Compose è sò in strada per creà a so prima applicazione cliente-servitore cù Docker. Hè assumatu chì u lettore di stu materiale hè familiarizatu cù i principii di Docker. Se questu ùn hè micca u casu, pudete piglià un ochju questu serie di materiali questu un post chì copre i principii di Docker cù i principii di Kubernetes, è questu articulu per i principianti.

Docker Compose Guida per i principianti

Cosa hè Docker Compose?

Docker Compose hè un strumentu inclusu cù Docker. Hè pensatu per risolve i prublemi ligati à l'implementazione di prughjetti.

Mentre amparate i principii di Docker, pudete avè scontru cù a creazione di l'applicazioni più simplici chì travaglianu in modu autonomu, senza dipende, per esempiu, di fonti di dati esterni o di certi servizii. In pratica, tali applicazioni sò rari. I prughjetti veri di solitu implicanu un inseme sanu di applicazioni di cullaburazione.

Cumu sapete se avete bisognu di utilizà Docker Compose quandu implementate un prughjettu? In fatti, hè assai sèmplice. Sè vo aduprate parechji servizii per eseguisce stu prughjettu, allora Docker Compose pò esse utile. Per esempiu, in una situazione induve crea un situ web chì, per fà l'autentificazione di l'utilizatori, hà bisognu di cunnette à una basa di dati. Un tali prughjettu pò esse cumpostu di dui servizii - unu chì assicura u funziunamentu di u situ, è unu chì hè rispunsevule per sustene a basa di dati.

A tecnulugia di Docker Compose, se a descriva in una manera simplificata, permette di inizià parechji servizii cù un solu cumandamentu.

Differenza trà Docker è Docker Compose

Docker hè utilizatu per gestisce i cuntenituri individuali (servizii) chì custituiscenu una applicazione.

Docker Compose hè utilizatu per gestisce parechje cuntenituri chì facenu parte di una applicazione à u stessu tempu. Stu strumentu offre e listessi funziunalità cum'è Docker, ma permette di travaglià cù applicazioni più cumplesse.

Docker Compose Guida per i principianti
Docker (contenitore unicu) è Docker Compose (contenituri multipli)

Casu d'usu tipicu di Docker Compose

Docker Compose hè, in e mani dritte, un strumentu assai putente chì permette di implementà rapidamente applicazioni cù architetture cumplesse. Avà fighjemu un esempiu di l'usu praticu di Docker Compose, l'analisi di quale vi permetterà di valutà i benefici chì l'usu di Docker Compose vi darà.

Imagine chì site u sviluppatore di un prughjettu web. Stu prughjettu include dui siti web. U primu permette à l'imprese di creà, cù uni pochi clicchi, magazzini in linea. U sicondu hè destinatu à u supportu di i clienti. Sti dui siti interagisce cù a stessa basa di dati.

U vostru prughjettu hè diventatu sempre più populari, è risulta chì a capacità di u servitore nantu à quale travaglia ùn hè più abbastanza. In u risultatu, decide di trasfirià tuttu u prughjettu à una altra macchina.

Sfortunatamente, ùn avete micca usatu qualcosa cum'è Docker Compose. Per quessa, vi tuccherà à migrà è cunfigurà servizii unu à tempu, sperendu chì ùn vi scurdate di nunda in u prucessu di stu travagliu.

Sè vo aduprate Docker Compose, allora a migrazione di u vostru prughjettu à un novu servitore hè un prublema chì pò esse risolta da alcuni cumandamenti. Per compie u trasferimentu di u prugettu à un novu locu, avete solu bisognu di fà alcuni paràmetri è carica una copia di salvezza di a basa di dati à u novu servitore.

Sviluppà una applicazione cliente-servitore cù Docker Compose

Avà chì sapete per ciò chì useremu Docker Compose, hè ora di creà a vostra prima applicazione cliente / servitore utilizendu stu strumentu. Vale à dì, parlemu di u sviluppu di un picculu situ web (servitore) in Python, chì pò pruduce un schedariu cù un fragmentu di testu. Stu schedariu hè dumandatu da u servitore da un prugramma (cliente), scrittu ancu in Python. Dopu avè ricivutu u schedariu da u servitore, u prugramma mostra u testu guardatu in questu nantu à u screnu.

Per piacè nutate chì assumemu chì avete i principii di Docker è chì avete digià a piattaforma Docker installata.

Cuminciamu à travaglià nant'à u prugettu.

▍1. Crea un prughjettu

Per custruisce a vostra prima applicazione cliente / servitore, vi cunsigliu di principià per creà un cartulare di prughjettu. Duverebbe cuntene i seguenti schedari è cartulare:

  • u schedariu docker-compose.yml. Questu hè un schedariu Docker Compose chì cuntene l'istruzzioni necessarii per inizià è cunfigurà i servizii.
  • Cartulare server. Cuntenerà i schedarii necessarii per fà u travagliu di u servitore.
  • Cartulare client. Questu hè induve i schedarii di l'applicazione di u cliente seranu situati.

In u risultatu, u cuntenutu di u cartulare principale di u vostru prughjettu deve esse cusì:

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

▍2. Creazione di u servitore

Quì noi, in u prucessu di creà un servitore, tocca à qualchi cose basi riguardanti Docker.

2a. Crià i schedari

Andà à u cartulare server è creanu i seguenti schedarii in questu:

  • u schedariu server.py. Contenerà u codice di u servitore.
  • u schedariu index.html. Stu schedariu cuntene un pezzu di testu chì l'applicazione cliente deve vede.
  • u schedariu Dockerfile. Questu hè u schedariu Docker chì cuntene l'istruzzioni necessarii per creà l'ambiente di u servitore.

Questu hè ciò chì u cuntenutu di u vostru cartulare duverebbe vede server/:

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

2b. Edizione di un schedariu Python.

Aghjunghjite à u schedariu server.py u codice seguente:

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

Stu codice permette di creà un servitore web simplice. Darà à i clienti un schedariu index.html, chì u cuntenutu sarà dopu esse visualizatu nantu à a pagina web.

2c. Edizione di un schedariu HTML

Per file index.html aghjunghje u testu seguente:

Docker-Compose is magic!

Stu testu serà mandatu à u cliente.

2d. Edità u Dockerfile

Avà avemu da creà un schedariu simplice Dockerfile, chì serà rispunsevule per urganizà l'ambiente di runtime per u servitore Python. Cum'è a basa di l'imaghjini creatu, avemu aduprà ufficialmente, cuncepitu per eseguisce prugrammi scritti in Python. Eccu u cuntenutu di u 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/

Avà andemu à travaglià nantu à u cliente.

▍3. Crea un cliente

Mentre creanu u latu di u cliente di u nostru prughjettu, ricurderemu alcuni principii di Docker in a strada.

3a. Crià i schedari

Andà à u vostru cartulare prughjettu client è creanu i seguenti schedarii in questu:

  • u schedariu client.py. Questu hè induve u codice di u cliente serà.
  • u schedariu Dockerfile. Stu schedariu ghjoca u listessu rolu cum'è un schedariu simili in u cartulare di u servitore. Vale à dì, cuntene una dichjarazione chì descrive cumu creà un ambiente per eseguisce u codice cliente.

In u risultatu, u vostru cartulare client/ In questu stadiu, deve esse cusì:

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

3b. Edite un File Python

Aghjunghjite à u schedariu client.py u codice seguente:

#!/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 à stu codice, l'applicazione cliente pò scaricà dati da u servitore è vede nantu à u screnu.

3c. Edità u Dockerfile

Cum'è in u casu di u servitore, creamu per u cliente un simplice Dockerfile, rispunsevuli di furmà l'ambiente in quale l'applicazione cliente Python correrà. Eccu u codice di u cliente Dockerfile:

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

FROM python:latest

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

ADD client.py /client/

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

WORKDIR /client/

▍4. Docker Compose

Comu pudete vede, avemu creatu dui prughjetti diffirenti: servitore è cliente. Ognunu di elli hà u so schedariu Dockerfile. Finu a ora, tuttu ciò chì succede ùn va più di i principii di travaglià cù Docker. Avà avemu da travaglià cù Docker Compose. Per fà questu, riferite à u schedariu docker-compose.ymlsituatu in u cartulare radicali di u prugettu.

Per piacè nutate chì quì ùn avemu micca scopu di copre assolutamente tutti i cumandamenti chì ponu esse aduprati docker-compose.yml. U nostru scopu principale hè di scumpressà un esempiu praticu chì vi dà a cunniscenza basica di Docker Compose.

Eccu u codice per mette in u schedariu 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. Custruzzione di prughjettu

Dopu à in docker-compose.yml tutte l'istruzzioni necessarii sò stati fatti, u prugettu deve esse assemblatu. Stu passu di u nostru travagliu s'assumiglia à l'usu di u cumandamentu docker build, ma u cumandamentu currispundenti hè in relazione cù parechji servizii:

$ docker-compose build

▍6. Lanciamentu di u prugettu

Avà chì u prugettu hè custruitu, hè ora di eseguisce. Stu passu di u nostru travagliu currisponde à u passu à quale, quandu travaglia cù cuntenituri individuali, u cumandamentu hè eseguitu docker run:

$ docker-compose up

Dopu avè eseguitu stu cumandamentu, u testu caricatu da u cliente da u servitore deve apparisce in u terminal: Docker-Compose is magic!.

Comu digià dettu, u servitore usa u portu di l'urdinatore 1234 per serve i richieste di i clienti. Dunque, si vai in u navigatore à l'indirizzu http://localhost:1234/, mostrarà una pagina cù testu Docker-Compose is magic!.

Cumandamenti utili

Fighjemu un pocu di i cumandamenti chì pudete truvà utile quandu travagliate cù Docker Compose.

Stu cumandamentu permette di firmà è sguassate cuntenituri è altre risorse create da u cumandamentu docker-compose up:

$ docker-compose down

Questu cumandimu stampa i logs di serviziu:

$ docker-compose logs -f [service name]

Per esempiu, in u nostru prughjettu pò esse usatu in questa forma: $ docker-compose logs -f [service name].

Cù stu cumandamentu, pudete vede una lista di cuntenituri:

$ docker-compose ps

Stu cumandamentu permette di eseguisce un cumandamentu in un containeru in esecuzione:

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

Per esempiu, pò vede cusì: docker-compose exec server ls.

Stu cumandimu permette di vede una lista di imagine:

$ docker-compose images

Risultati

Avemu cupertu i fundamenti di travaglià cù a tecnulugia Docker Compose, a cunniscenza di quale vi permetterà di utilizà sta tecnulugia è, se vulete, cumincià à studià in più prufundità. quì repository cù u codice di u prughjettu, chì avemu cunsideratu quì.

Beni, lettori! Aduprate Docker Compose in i vostri prughjetti?

Docker Compose Guida per i principianti

Source: www.habr.com

Add a comment