Isang Gabay ng Baguhan sa Docker Compose

Ang may-akda ng artikulo, ang pagsasalin kung saan ipina-publish namin ngayon, ay nagsabi na ito ay inilaan para sa mga developer na gustong matuto ng Docker Compose at sumusulong sa paglikha ng kanilang unang client-server application gamit ang Docker. Ipinapalagay na ang mambabasa ng materyal na ito ay pamilyar sa mga pangunahing kaalaman ng Docker. Kung hindi ito ang kaso, maaari mong tingnan ito serye ng mga materyales sa ito post na sumasaklaw sa mga pangunahing kaalaman sa Docker kasama ng mga pangunahing kaalaman sa Kubernetes, at ito artikulo para sa mga nagsisimula.

Isang Gabay ng Baguhan sa Docker Compose

Ano ang Docker Compose?

Ang Docker Compose ay isang tool na kasama sa Docker. Ito ay idinisenyo upang malutas ang mga problema na may kaugnayan sa pag-deploy ng proyekto.

Habang pinag-aaralan ang mga pangunahing kaalaman ng Docker, maaaring nakatagpo ka ng paglikha ng mga simpleng application na gumagana nang kusa at hindi umaasa, halimbawa, sa mga panlabas na mapagkukunan ng data o sa ilang mga serbisyo. Sa pagsasagawa, ang mga naturang aplikasyon ay bihira. Ang mga tunay na proyekto ay karaniwang nagsasangkot ng isang buong hanay ng mga application na nagtutulungan.

Paano mo malalaman kung kailangan mong gumamit ng Docker Compose kapag nagde-deploy ng isang proyekto? Ito ay talagang napaka-simple. Kung gagamit ka ng maraming serbisyo para gumana ang proyektong ito, maaaring magamit ang Docker Compose. Halimbawa, sa isang sitwasyon kung saan lumikha sila ng isang website na kailangang kumonekta sa isang database upang ma-authenticate ang mga user. Ang nasabing proyekto ay maaaring binubuo ng dalawang serbisyo - ang isa na nagsisiguro sa pagpapatakbo ng site, at ang isa na may pananagutan sa pagpapanatili ng database.

Ang teknolohiya ng Docker Compose, upang ilarawan ito sa isang pinasimpleng paraan, ay nagbibigay-daan sa iyong maglunsad ng maraming serbisyo sa isang utos.

Pagkakaiba sa pagitan ng Docker at Docker Compose

Ginagamit ang Docker upang pamahalaan ang mga indibidwal na container (mga serbisyo) na bumubuo sa isang application.

Ginagamit ang Docker Compose upang sabay-sabay na pamahalaan ang maraming container na bumubuo sa isang application. Ang tool na ito ay nag-aalok ng parehong mga kakayahan bilang Docker, ngunit nagbibigay-daan sa iyo upang gumana sa mas kumplikadong mga application.

Isang Gabay ng Baguhan sa Docker Compose
Docker (iisang lalagyan) at Docker Compose (maraming lalagyan)

Karaniwang kaso ng paggamit para sa Docker Compose

Ang Docker Compose ay, nasa tamang mga kamay, isang napakalakas na tool na nagbibigay-daan sa iyong napakabilis na mag-deploy ng mga application na may mga kumplikadong arkitektura. Ngayon ay titingnan natin ang isang halimbawa ng praktikal na paggamit ng Docker Compose, ang pagsusuri kung saan ay magbibigay-daan sa iyong suriin ang mga benepisyo na ibibigay sa iyo ng paggamit ng Docker Compose.

Isipin na ikaw ay isang developer ng isang web project. Kasama sa proyektong ito ang dalawang website. Ang una ay nagpapahintulot sa mga negosyante na lumikha ng mga online na tindahan sa ilang mga pag-click lamang. Ang pangalawa ay naglalayong suporta sa customer. Ang dalawang site na ito ay nakikipag-ugnayan sa parehong database.

Ang iyong proyekto ay nagiging mas at mas sikat, at lumalabas na ang kapangyarihan ng server kung saan ito tumatakbo ay hindi na sapat. Bilang resulta, nagpasya kang ilipat ang buong proyekto sa isa pang makina.

Sa kasamaang palad, hindi ka gumamit ng isang bagay tulad ng Docker Compose. Samakatuwid, kailangan mong ilipat at muling i-configure ang mga serbisyo nang paisa-isa, umaasa na hindi mo malilimutan ang anuman sa proseso.

Kung gumagamit ka ng Docker Compose, ang paglipat ng iyong proyekto sa isang bagong server ay isang bagay na maaaring malutas sa pamamagitan ng pagpapatakbo ng ilang mga utos. Upang makumpleto ang paglipat ng proyekto sa isang bagong lokasyon, kailangan mo lamang gumawa ng ilang mga setting at mag-upload ng backup na kopya ng database sa bagong server.

Pagbuo ng isang client-server application gamit ang Docker Compose

Ngayong alam mo na kung para saan namin gagamitin ang Docker Compose, oras na para gawin ang iyong unang client-server application gamit ang tool na ito. Ibig sabihin, pinag-uusapan natin ang tungkol sa pagbuo ng isang maliit na website (server) sa Python na maaaring mag-output ng isang file na may isang fragment ng teksto. Ang file na ito ay hiniling mula sa server ng isang programa (kliyente), na nakasulat din sa Python. Matapos matanggap ang isang file mula sa server, ipinapakita ng programa ang teksto na nakaimbak dito sa screen.

Pakitandaan na ipinapalagay namin na mayroon kang pangunahing pag-unawa sa Docker at mayroon ka nang naka-install na platform ng Docker.

Magsimula tayong magtrabaho sa proyekto.

▍1. Paglikha ng isang Proyekto

Upang bumuo ng iyong unang client-server application, iminumungkahi kong magsimula ka sa pamamagitan ng paglikha ng isang folder ng proyekto. Dapat itong maglaman ng mga sumusunod na file at folder:

  • talaksan docker-compose.yml. Ito ay isang Docker Compose file na maglalaman ng mga tagubiling kailangan para simulan at i-configure ang mga serbisyo.
  • Folder server. Maglalaman ito ng mga file na kinakailangan upang mapanatiling tumatakbo ang server.
  • Folder client. Ang mga file ng aplikasyon ng kliyente ay matatagpuan dito.

Bilang resulta, ang mga nilalaman ng pangunahing folder ng iyong proyekto ay dapat magmukhang ganito:

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

▍2. Paglikha ng isang server

Dito, sa proseso ng paglikha ng isang server, tatalakayin natin ang ilang mga pangunahing bagay tungkol sa Docker.

2a. Paglikha ng mga file

Pumunta sa folder server at lumikha ng mga sumusunod na file dito:

  • talaksan server.py. Maglalaman ito ng code ng server.
  • talaksan index.html. Maglalaman ang file na ito ng isang piraso ng text na dapat i-output ng client application.
  • talaksan Dockerfile. Ito ay isang Docker file na maglalaman ng mga tagubiling kailangan upang lumikha ng kapaligiran ng server.

Ganito dapat ang hitsura ng mga nilalaman ng iyong folder server/:

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

2b. Pag-edit ng Python file.

Idagdag sa file server.py ang sumusunod na code:

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

Ang code na ito ay nagpapahintulot sa iyo na lumikha ng isang simpleng web server. Ibibigay niya sa mga kliyente ang file index.html, ang mga nilalaman nito ay ipapakita sa ibang pagkakataon sa web page.

2c. Pag-edit ng HTML File

Upang mag-file index.html idagdag ang sumusunod na teksto:

Docker-Compose is magic!

Ipapadala ang text na ito sa kliyente.

2d. Pag-edit ng Dockerfile

Ngayon ay gagawa kami ng isang simpleng file Dockerfile, na magiging responsable para sa pag-aayos ng runtime environment para sa Python server. Bilang batayan para sa nilikha na imahe, gagamitin namin sa isang opisyal na paraan, na idinisenyo upang magpatakbo ng mga program na nakasulat sa Python. Narito ang nilalaman ng 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/

Ngayon simulan natin ang pagtatrabaho sa kliyente.

▍3. Paglikha ng isang kliyente

Habang nililikha ang bahagi ng kliyente ng aming proyekto, tatandaan namin ang ilang mga pangunahing kaalaman sa Docker.

3a. Paglikha ng mga file

Pumunta sa iyong folder ng proyekto client at lumikha ng mga sumusunod na file dito:

  • talaksan client.py. Ang client code ay makikita dito.
  • talaksan Dockerfile. Ang file na ito ay gumaganap ng parehong papel bilang isang katulad na file sa folder ng server. Lalo na, naglalaman ito ng mga tagubilin na naglalarawan kung paano lumikha ng isang kapaligiran para sa pagpapatupad ng code ng kliyente.

Bilang resulta, ang iyong folder client/ sa yugtong ito ng trabaho dapat itong magmukhang ganito:

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

3b. Pag-edit ng Python File

Idagdag sa file client.py ang sumusunod na code:

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

Gamit ang code na ito, ang client application ay maaaring mag-download ng data mula sa server at ipakita ito sa screen.

3c. Pag-edit ng Dockerfile

Tulad ng sa kaso ng server, lumikha kami ng isang simple Dockerfile, responsable para sa paglikha ng kapaligiran kung saan tatakbo ang Python client application. Narito ang code ng kliyente Dockerfile:

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

FROM python:latest

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

ADD client.py /client/

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

WORKDIR /client/

▍4. Docker Compose

Tulad ng maaaring napansin mo, gumawa kami ng dalawang magkaibang proyekto: isang server at isang kliyente. Ang bawat isa sa kanila ay may sariling file Dockerfile. Sa ngayon, lahat ng nangyari ay hindi lumampas sa mga pangunahing kaalaman sa pagtatrabaho sa Docker. Ngayon ay nagsisimula na tayo sa Docker Compose. Upang gawin ito, pumunta tayo sa file docker-compose.yml, na matatagpuan sa folder ng ugat ng proyekto.

Pakitandaan na dito hindi namin sinusubukang ganap na sakupin ang lahat ng mga utos na maaaring gamitin sa docker-compose.yml. Ang aming pangunahing layunin ay maglakad sa isang praktikal na halimbawa na magbibigay sa iyo ng pangunahing kaalaman sa Docker Compose.

Narito ang code na ilalagay sa 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. Pagbuo ng proyekto

Pagkatapos pumasok docker-compose.yml Ang lahat ng kinakailangang mga tagubilin ay naipasok, ang proyekto ay kailangang tipunin. Ang hakbang na ito ng aming trabaho ay katulad ng paggamit ng command docker build, ngunit ang kaukulang utos ay may kaugnayan sa ilang mga serbisyo:

$ docker-compose build

▍6. Paglulunsad ng proyekto

Ngayon na ang proyekto ay binuo, oras na upang ilunsad ito. Ang hakbang na ito ng aming trabaho ay tumutugma sa hakbang kung saan, kapag nagtatrabaho sa mga indibidwal na lalagyan, ang utos ay isinasagawa docker run:

$ docker-compose up

Pagkatapos isagawa ang utos na ito, ang teksto na na-download ng kliyente mula sa server ay dapat na lumitaw sa terminal: Docker-Compose is magic!.

Tulad ng nabanggit na, ginagamit ng server ang computer port 1234 sa serbisyo sa mga kahilingan ng kliyente. Samakatuwid, kung pupunta ka sa address sa iyong browser http://localhost:1234/, ito ay magpapakita ng isang pahina na may teksto Docker-Compose is magic!.

Mga Kapaki-pakinabang na Utos

Tingnan natin ang ilang mga utos na maaari mong makitang kapaki-pakinabang kapag nagtatrabaho sa Docker Compose.

Binibigyang-daan ka ng command na ito na ihinto at tanggalin ang mga container at iba pang mapagkukunang ginawa ng command docker-compose up:

$ docker-compose down

Ang utos na ito ay nagpi-print ng mga log ng serbisyo:

$ docker-compose logs -f [service name]

Halimbawa, sa aming proyekto maaari itong magamit sa form na ito: $ docker-compose logs -f [service name].

Gamit ang command na ito maaari kang magpakita ng isang listahan ng mga lalagyan:

$ docker-compose ps

Binibigyang-daan ka ng utos na ito na magsagawa ng isang utos sa isang tumatakbong lalagyan:

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

Halimbawa, maaaring ganito ang hitsura nito: docker-compose exec server ls.

Ang utos na ito ay nagpapahintulot sa iyo na magpakita ng isang listahan ng mga larawan:

$ docker-compose images

Mga resulta ng

Tiningnan namin ang mga pangunahing kaalaman sa pagtatrabaho sa teknolohiya ng Docker Compose, kung saan ang kaalaman ay magbibigay-daan sa iyong gamitin ang teknolohiyang ito at, kung ninanais, simulang pag-aralan ito nang mas malalim. Dito isang repository na may code para sa proyektong tiningnan namin dito.

Minamahal na mambabasa! Gumagamit ka ba ng Docker Compose sa iyong mga proyekto?

Isang Gabay ng Baguhan sa Docker Compose

Pinagmulan: www.habr.com

Magdagdag ng komento