Guia Docker Compose per a principiants

L'autor de l'article, la traducció del qual publiquem avui, diu que està pensat per a aquells desenvolupadors que volen aprendre Docker Compose i estan avançant cap a la creació de la seva primera aplicació client-servidor amb Docker. Se suposa que el lector d'aquest material està familiaritzat amb els fonaments bàsics de Docker. Si no és així, podeu fer-hi una ullada això sèrie de materials sobre això publicació que cobreix els conceptes bàsics de Docker juntament amb els conceptes bàsics de Kubernetes i això article per a principiants.

Guia Docker Compose per a principiants

Què és Docker Compose?

Docker Compose és una eina inclosa amb Docker. Està dissenyat per resoldre problemes relacionats amb el desplegament del projecte.

Mentre apreneu els conceptes bàsics de Docker, potser us heu trobat amb la creació d'aplicacions senzilles que funcionen de manera autònoma i que no depenen, per exemple, de fonts de dades externes o de determinats serveis. A la pràctica, aquestes aplicacions són rares. Els projectes reals solen implicar tot un conjunt d'aplicacions que treballen conjuntament.

Com sabeu si necessiteu utilitzar Docker Compose quan implementeu un projecte? En realitat és molt senzill. Si utilitzeu diversos serveis per fer que aquest projecte funcioni, Docker Compose pot ser útil. Per exemple, en una situació en què creen un lloc web que necessita connectar-se a una base de dades per autenticar els usuaris. Aquest projecte pot consistir en dos serveis: el que garanteix el funcionament del lloc i el que s'encarrega del manteniment de la base de dades.

La tecnologia Docker Compose, per descriure-la de manera simplificada, permet llançar molts serveis amb una ordre.

Diferència entre Docker i Docker Compose

Docker s'utilitza per gestionar els contenidors (serveis) individuals que formen una aplicació.

Docker Compose s'utilitza per gestionar simultàniament diversos contenidors que formen una aplicació. Aquesta eina ofereix les mateixes capacitats que Docker, però us permet treballar amb aplicacions més complexes.

Guia Docker Compose per a principiants
Docker (contenidor únic) i Docker Compose (diversos contenidors)

Cas d'ús típic de Docker Compose

Docker Compose és, a les mans adequades, una eina molt potent que permet desplegar molt ràpidament aplicacions amb arquitectures complexes. Ara veurem un exemple d'ús pràctic de Docker Compose, l'anàlisi del qual us permetrà avaluar els beneficis que us aportarà l'ús de Docker Compose.

Imagineu que sou un desenvolupador d'un projecte web. Aquest projecte inclou dues pàgines web. El primer permet als empresaris crear botigues en línia amb només uns quants clics. El segon està dirigit a l'atenció al client. Aquests dos llocs interactuen amb la mateixa base de dades.

El vostre projecte és cada cop més popular, i resulta que la potència del servidor on s'executa ja no és suficient. Com a resultat, decidiu traslladar tot el projecte a una altra màquina.

Malauradament, no heu utilitzat res com Docker Compose. Per tant, haureu de transferir i reconfigurar els serveis un a un, amb l'esperança de no oblidar res en el procés.

Si utilitzeu Docker Compose, moure el projecte a un nou servidor és una qüestió que es pot resoldre executant unes quantes ordres. Per completar la transferència del projecte a una nova ubicació, només cal que feu alguns paràmetres i carregar una còpia de seguretat de la base de dades al nou servidor.

Desenvolupament d'una aplicació client-servidor mitjançant Docker Compose

Ara que ja sabeu per a què farem servir Docker Compose, és hora de crear la vostra primera aplicació client-servidor amb aquesta eina. És a dir, estem parlant de desenvolupar un petit lloc web (servidor) en Python que pot sortir un fitxer amb un fragment de text. Aquest fitxer és sol·licitat al servidor per un programa (client), també escrit en Python. Després de rebre un fitxer del servidor, el programa mostra el text emmagatzemat en ell a la pantalla.

Tingueu en compte que suposem que teniu una comprensió bàsica de Docker i que ja teniu instal·lada la plataforma Docker.

Comencem a treballar en el projecte.

▍1. Creació d'un projecte

Per crear la vostra primera aplicació client-servidor, us suggereixo que comenceu per crear una carpeta de projecte. Ha de contenir els fitxers i carpetes següents:

  • expedient docker-compose.yml. Aquest és un fitxer Docker Compose que contindrà les instruccions necessàries per iniciar i configurar els serveis.
  • Carpeta server. Contindrà els fitxers necessaris per mantenir el servidor en funcionament.
  • Carpeta client. Els fitxers de l'aplicació client es trobaran aquí.

Com a resultat, el contingut de la carpeta principal del vostre projecte hauria de ser així:

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

▍2. Creació d'un servidor

Aquí, en el procés de creació d'un servidor, tocarem algunes coses bàsiques sobre Docker.

2a. Creació de fitxers

Aneu a la carpeta server i creeu-hi els fitxers següents:

  • expedient server.py. Contindrà el codi del servidor.
  • expedient index.html. Aquest fitxer contindrà un fragment de text que l'aplicació client hauria de sortir.
  • expedient Dockerfile. Aquest és un fitxer Docker que contindrà les instruccions necessàries per crear l'entorn del servidor.

Així hauria de ser el contingut de la vostra carpeta server/:

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

2b. Edició d'un fitxer Python.

Afegeix al fitxer server.py el codi següent:

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

Aquest codi us permet crear un servidor web senzill. Ell donarà als clients el fitxer index.html, el contingut del qual es mostrarà posteriorment a la pàgina web.

2c. Edició d'un fitxer HTML

Arxivar index.html afegir el text següent:

Docker-Compose is magic!

Aquest text s'enviarà al client.

2d. Edició del Dockerfile

Ara crearem un fitxer senzill Dockerfile, que serà el responsable d'organitzar l'entorn d'execució del servidor Python. Com a base per a la imatge creada, utilitzarem d'una manera oficial, dissenyat per executar programes escrits en Python. Aquí teniu el contingut 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/

Ara comencem a treballar amb el client.

▍3. Creació d'un client

Mentre creem el costat client del nostre projecte, recordarem alguns conceptes bàsics de Docker al llarg del camí.

3a. Creació de fitxers

Aneu a la carpeta del vostre projecte client i creeu-hi els fitxers següents:

  • expedient client.py. El codi de client es trobarà aquí.
  • expedient Dockerfile. Aquest fitxer té el mateix paper que un fitxer similar a la carpeta del servidor. És a dir, conté instruccions que descriuen com crear un entorn per executar codi de client.

Com a resultat, la vostra carpeta client/ en aquesta fase del treball hauria de tenir aquest aspecte:

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

3b. Edició d'un fitxer Python

Afegeix al fitxer client.py el codi següent:

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

Amb aquest codi, l'aplicació client pot descarregar dades del servidor i mostrar-les a la pantalla.

3c. Edició del Dockerfile

Com en el cas del servidor, creem un senzill Dockerfile, responsable de crear l'entorn en el qual s'executarà l'aplicació client de Python. Aquí teniu el codi del client Dockerfile:

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

FROM python:latest

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

ADD client.py /client/

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

WORKDIR /client/

▍4. Docker Compose

Com haureu vist, hem creat dos projectes diferents: un servidor i un client. Cadascun d'ells té el seu propi fitxer Dockerfile. Fins ara, tot el que ha passat no ha anat més enllà dels fonaments bàsics de treballar amb Docker. Ara comencem amb Docker Compose. Per fer-ho, anem al fitxer docker-compose.yml, situat a la carpeta arrel del projecte.

Tingueu en compte que aquí no estem tractant de cobrir absolutament totes les ordres que es poden utilitzar docker-compose.yml. El nostre objectiu principal és recórrer un exemple pràctic que us donarà els coneixements bàsics de Docker Compose.

Aquí teniu el codi per posar al fitxer 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. Construint el projecte

Després d'entrar docker-compose.yml S'han introduït totes les instruccions necessàries, el projecte s'ha de muntar. Aquest pas del nostre treball és similar a l'ús de l'ordre docker build, però l'ordre corresponent és rellevant per a diversos serveis:

$ docker-compose build

▍6. Llançament del projecte

Ara que el projecte està muntat, és el moment de posar-lo en marxa. Aquest pas del nostre treball correspon al pas en què, quan es treballa amb contenidors individuals, s'executa l'ordre docker run:

$ docker-compose up

Després d'executar aquesta ordre, el text descarregat pel client des del servidor hauria d'aparèixer al terminal: Docker-Compose is magic!.

Com ja s'ha esmentat, el servidor utilitza el port de l'ordinador 1234 per atendre les peticions dels clients. Per tant, si aneu a l'adreça del vostre navegador http://localhost:1234/, mostrarà una pàgina amb text Docker-Compose is magic!.

Ordres útils

Vegem algunes ordres que us poden resultar útils quan treballeu amb Docker Compose.

Aquesta ordre us permet aturar i suprimir contenidors i altres recursos creats per l'ordre docker-compose up:

$ docker-compose down

Aquesta ordre imprimeix els registres de servei:

$ docker-compose logs -f [service name]

Per exemple, al nostre projecte es pot utilitzar d'aquesta forma: $ docker-compose logs -f [service name].

Amb aquesta ordre podeu mostrar una llista de contenidors:

$ docker-compose ps

Aquesta ordre us permet executar una ordre en un contenidor en execució:

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

Per exemple, podria semblar així: docker-compose exec server ls.

Aquesta ordre us permet mostrar una llista d'imatges:

$ docker-compose images

Resultats de

Hem analitzat els fonaments bàsics de treballar amb la tecnologia Docker Compose, el coneixement de la qual us permetrà utilitzar aquesta tecnologia i, si voleu, començar a estudiar-la amb més profunditat. aquí està un repositori amb el codi del projecte que hem vist aquí.

Benvolguts lectors! Utilitzeu Docker Compose als vostres projectes?

Guia Docker Compose per a principiants

Font: www.habr.com

Afegeix comentari