Yangi boshlanuvchilar uchun Docker Compose qo'llanmasi

Tarjimasi bugun biz e'lon qilayotgan maqola muallifining ta'kidlashicha, u Docker Compose-ni o'rganmoqchi bo'lgan va Docker yordamida o'zining birinchi mijoz-server ilovasini yaratishga intilayotgan dasturchilar uchun mo'ljallangan. Ushbu materialni o'quvchi Docker asoslari bilan tanish deb taxmin qilinadi. Agar bunday bo'lmasa, siz ko'rib chiqishingiz mumkin bu bo'yicha materiallar seriyasi bu Kubernetes asoslari bilan bir qatorda Docker asoslarini qamrab olgan post va bu yangi boshlanuvchilar uchun maqola.

Yangi boshlanuvchilar uchun Docker Compose qo'llanmasi

Docker Compose nima?

Docker Compose - bu Docker-ga kiritilgan vosita. U loyihani joylashtirish bilan bog'liq muammolarni hal qilish uchun mo'ljallangan.

Docker asoslarini o'rganayotganda, siz, masalan, tashqi ma'lumotlar manbalariga yoki ma'lum xizmatlarga bog'liq bo'lmagan avtonom ishlaydigan va oddiy ilovalarni yaratishga duch kelgan bo'lishingiz mumkin. Amalda bunday ilovalar kamdan-kam uchraydi. Haqiqiy loyihalar odatda birgalikda ishlaydigan ilovalarning butun majmuasini o'z ichiga oladi.

Loyihani joylashtirishda Docker Compose-dan foydalanish kerakligini qanday bilasiz? Bu aslida juda oddiy. Agar siz ushbu loyihani amalga oshirish uchun bir nechta xizmatlardan foydalansangiz, Docker Compose yordam berishi mumkin. Masalan, foydalanuvchilarni autentifikatsiya qilish uchun ma'lumotlar bazasiga ulanishi kerak bo'lgan veb-sayt yaratadigan vaziyatda. Bunday loyiha ikkita xizmatdan iborat bo'lishi mumkin - saytning ishlashini ta'minlaydigan va ma'lumotlar bazasini saqlash uchun mas'ul bo'lgan xizmat.

Docker Compose texnologiyasi, uni soddalashtirilgan tarzda tavsiflash uchun bir buyruq bilan ko'plab xizmatlarni ishga tushirish imkonini beradi.

Docker va Docker Compose o'rtasidagi farq

Docker ilovani tashkil etuvchi alohida konteynerlarni (xizmatlarni) boshqarish uchun ishlatiladi.

Docker Compose ilovani tashkil etuvchi bir nechta konteynerlarni bir vaqtda boshqarish uchun ishlatiladi. Ushbu vosita Docker bilan bir xil imkoniyatlarni taqdim etadi, lekin sizga murakkabroq ilovalar bilan ishlash imkonini beradi.

Yangi boshlanuvchilar uchun Docker Compose qo'llanmasi
Docker (bitta konteyner) va Docker Compose (bir nechta konteyner)

Docker Compose uchun odatiy hol

Docker Compose, o'ng qo'llarda, murakkab arxitekturaga ega ilovalarni juda tez joylashtirish imkonini beruvchi juda kuchli vositadir. Endi biz Docker Compose-dan amaliy foydalanish misolini ko'rib chiqamiz, uning tahlili Docker Compose-dan foydalanish sizga beradigan afzalliklarni baholashga imkon beradi.

Tasavvur qiling-a, siz veb-loyihani ishlab chiquvchisiz. Ushbu loyiha ikkita veb-saytni o'z ichiga oladi. Birinchisi, ishbilarmonlarga bir necha marta bosish orqali onlayn-do'konlar yaratish imkonini beradi. Ikkinchisi mijozlarni qo'llab-quvvatlashga qaratilgan. Ushbu ikki sayt bir xil ma'lumotlar bazasi bilan o'zaro ishlaydi.

Sizning loyihangiz tobora ommalashib bormoqda va u ishlaydigan serverning kuchi endi etarli emasligi ma'lum bo'ldi. Natijada siz butun loyihani boshqa mashinaga ko'chirishga qaror qilasiz.

Afsuski, siz Docker Compose kabi biror narsadan foydalanmadingiz. Shuning uchun, bu jarayonda hech narsani unutmasligingizga umid qilib, xizmatlarni birma-bir o'tkazishingiz va qayta sozlashingiz kerak bo'ladi.

Agar siz Docker Compose-dan foydalansangiz, loyihangizni yangi serverga ko'chirish bir nechta buyruqlarni bajarish orqali hal qilinishi mumkin bo'lgan masaladir. Loyihani yangi joyga o'tkazishni yakunlash uchun siz faqat ba'zi sozlamalarni o'rnatishingiz va ma'lumotlar bazasining zaxira nusxasini yangi serverga yuklashingiz kerak.

Docker Compose yordamida mijoz-server ilovasini ishlab chiqish

Endi siz Docker Compose’dan nima maqsadda foydalanishimizni bilganingizdan so‘ng, ushbu vosita yordamida birinchi mijoz-server ilovangizni yaratish vaqti keldi. Ya'ni, biz Python-da matn parchasi bilan faylni chiqara oladigan kichik veb-saytni (serverni) ishlab chiqish haqida gapiramiz. Ushbu fayl serverdan Python-da yozilgan dastur (mijoz) tomonidan so'raladi. Serverdan faylni olgandan so'ng, dastur unda saqlangan matnni ekranda ko'rsatadi.

Esda tutingki, siz Docker haqida asosiy tushunchaga egasiz va sizda allaqachon Docker platformasi oʻrnatilgan.

Keling, loyiha ustida ishlashni boshlaylik.

▍1. Loyiha yaratish

Birinchi mijoz-server ilovangizni yaratish uchun men sizga loyiha papkasini yaratishdan boshlashni maslahat beraman. U quyidagi fayl va papkalarni o'z ichiga olishi kerak:

  • Fayl docker-compose.yml. Bu Docker Compose fayli boʻlib, unda xizmatlarni ishga tushirish va sozlash uchun zarur boʻlgan koʻrsatmalar mavjud.
  • Jild server. Unda serverning ishlashi uchun zarur bo'lgan fayllar bo'ladi.
  • Jild client. Mijoz ilovasi fayllari shu yerda joylashadi.

Natijada, loyihangizning asosiy papkasining mazmuni quyidagicha ko'rinishi kerak:

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

▍2. Server yaratish

Bu erda, server yaratish jarayonida biz Docker bilan bog'liq ba'zi asosiy narsalarga to'xtalamiz.

2a. Fayllarni yaratish

Jildga o'ting server va unda quyidagi fayllarni yarating:

  • Fayl server.py. U server kodini o'z ichiga oladi.
  • Fayl index.html. Ushbu faylda mijoz ilovasi chiqishi kerak bo'lgan matn bo'lagi bo'ladi.
  • Fayl Dockerfile. Bu server muhitini yaratish uchun zarur bo'lgan ko'rsatmalarni o'z ichiga olgan Docker fayli.

Jildingizning mazmuni shunday ko'rinishi kerak server/:

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

2b. Python faylini tahrirlash.

Faylga qo'shish server.py quyidagi kod:

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

Bu kod oddiy veb-server yaratish imkonini beradi. U mijozlarga faylni beradi index.html, uning mazmuni keyinchalik veb-sahifada ko'rsatiladi.

2c. HTML faylni tahrirlash

Fayl uchun index.html quyidagi matnni qo'shing:

Docker-Compose is magic!

Ushbu matn mijozga yuboriladi.

2d. Docker faylini tahrirlash

Endi biz oddiy fayl yaratamiz Dockerfile, Python serveri uchun ish vaqti muhitini tashkil qilish uchun javobgar bo'ladi. Yaratilgan tasvir uchun asos sifatida biz foydalanamiz rasmiy tarzda, Python-da yozilgan dasturlarni ishga tushirish uchun mo'ljallangan. Mana Dockerfile mazmuni:

# На всякий случай напоминаю, что 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/

Endi mijoz ustida ishlashni boshlaylik.

▍3. Mijoz yaratish

Loyihamizning mijoz tomonini yaratishda biz Docker asoslarini eslaymiz.

3a. Fayllarni yaratish

Loyihangiz papkasiga o'ting client va unda quyidagi fayllarni yarating:

  • Fayl client.py. Mijoz kodi bu erda joylashgan bo'ladi.
  • Fayl Dockerfile. Ushbu fayl server jildidagi o'xshash fayl bilan bir xil rol o'ynaydi. Ya'ni, u mijoz kodini bajarish uchun muhitni qanday yaratishni tavsiflovchi ko'rsatmalarni o'z ichiga oladi.

Natijada sizning papkangiz client/ ishning ushbu bosqichida u quyidagicha ko'rinishi kerak:

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

3b. Python faylini tahrirlash

Faylga qo'shish client.py quyidagi kod:

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

Ushbu kod yordamida mijoz ilovasi serverdan ma'lumotlarni yuklab olishi va uni ekranda ko'rsatishi mumkin.

3c. Docker faylini tahrirlash

Serverda bo'lgani kabi, biz oddiy yaratamiz Dockerfile, Python mijoz ilovasi ishlaydigan muhitni yaratish uchun javobgardir. Bu erda mijoz kodi Dockerfile:

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

FROM python:latest

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

ADD client.py /client/

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

WORKDIR /client/

▍4. Docker Compose

E'tibor bergan bo'lsangiz kerak, biz ikki xil loyiha yaratdik: server va mijoz. Ularning har biri o'z fayliga ega Dockerfile. Hozirgacha sodir bo'lgan hamma narsa Docker bilan ishlash asoslaridan tashqariga chiqmadi. Endi biz Docker Compose-dan boshlaymiz. Buning uchun faylga o'tamiz docker-compose.yml, loyihaning ildiz papkasida joylashgan.

E'tibor bering, biz bu erda ishlatilishi mumkin bo'lgan barcha buyruqlarni qamrab olishga harakat qilmayapmiz docker-compose.yml. Bizning asosiy maqsadimiz sizga Docker Compose bo'yicha asosiy bilimlarni beradigan amaliy misolni ko'rib chiqishdir.

Mana faylga qo'yish uchun kod 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. Loyihani qurish

Kirgandan keyin docker-compose.yml Barcha kerakli ko'rsatmalar kiritilgan, loyihani yig'ish kerak. Bizning ishimizning bu bosqichi buyruqni ishlatishga o'xshaydi docker build, lekin tegishli buyruq bir nechta xizmatlarga tegishli:

$ docker-compose build

▍6. Loyihaning ishga tushirilishi

Loyiha yig'ilgandan so'ng, uni ishga tushirish vaqti keldi. Bizning ishimizning bu bosqichi individual konteynerlar bilan ishlashda buyruq bajariladigan bosqichga mos keladi docker run:

$ docker-compose up

Ushbu buyruqni bajargandan so'ng, mijoz tomonidan serverdan yuklab olingan matn terminalda paydo bo'lishi kerak: Docker-Compose is magic!.

Yuqorida aytib o'tilganidek, server kompyuter portidan foydalanadi 1234 mijozlar so'rovlariga xizmat ko'rsatish uchun. Shuning uchun, agar siz brauzeringizdagi manzilga kirsangiz http://localhost:1234/, u matnli sahifani ko'rsatadi Docker-Compose is magic!.

Foydali buyruqlar

Keling, Docker Compose bilan ishlashda foydali bo'lishi mumkin bo'lgan ba'zi buyruqlarni ko'rib chiqaylik.

Bu buyruq konteynerlar va buyruq yordamida yaratilgan boshqa resurslarni to'xtatish va o'chirish imkonini beradi docker-compose up:

$ docker-compose down

Bu buyruq xizmat jurnallarini chop etadi:

$ docker-compose logs -f [service name]

Masalan, bizning loyihamizda u quyidagi shaklda ishlatilishi mumkin: $ docker-compose logs -f [service name].

Ushbu buyruq yordamida siz konteynerlar ro'yxatini ko'rsatishingiz mumkin:

$ docker-compose ps

Bu buyruq ishlaydigan konteynerda buyruqni bajarishga imkon beradi:

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

Masalan, u quyidagicha ko'rinishi mumkin: docker-compose exec server ls.

Ushbu buyruq sizga rasmlar ro'yxatini ko'rsatishga imkon beradi:

$ docker-compose images

natijalar

Biz Docker Compose texnologiyasi bilan ishlash asoslarini ko‘rib chiqdik, uning bilimi sizga ushbu texnologiyadan foydalanish imkonini beradi va agar xohlasangiz, uni chuqurroq o‘rganishni boshlaydi. shu yerda biz bu erda ko'rib chiqqan loyiha uchun kodli ombor.

Hurmatli o'quvchilar! Loyihalaringizda Docker Compose dan foydalanasizmi?

Yangi boshlanuvchilar uchun Docker Compose qo'llanmasi

Manba: www.habr.com

a Izoh qo'shish