Phau Ntawv Qhia Beginner rau Docker Compose

Tus sau ntawm tsab xov xwm, cov lus txhais uas peb tab tom tshaj tawm hnub no, hais tias nws yog npaj rau cov neeg tsim khoom uas xav kawm Docker Compose thiab tab tom mus rau kev tsim lawv thawj tus neeg siv-server daim ntawv thov siv Docker. Nws yog xav tias tus nyeem ntawv ntawm cov ntaub ntawv no paub txog cov hauv paus ntawm Docker. Yog tias tsis yog qhov no, koj tuaj yeem saib xyuas qhov no series ntawm cov ntaub ntawv rau qhov no tshaj tawm npog Docker hauv paus nrog rau Kubernetes cov hauv paus, thiab qhov no tsab xov xwm rau beginners.

Phau Ntawv Qhia Beginner rau Docker Compose

Docker Compose yog dab tsi?

Docker Compose yog cov cuab yeej suav nrog Docker. Nws yog tsim los daws cov teeb meem ntsig txog kev xa tawm qhov project.

Thaum kawm txog cov hauv paus ntawm Docker, tej zaum koj yuav tau ntsib kev tsim cov ntawv thov yooj yim uas ua haujlwm ywj siab thiab tsis nyob ntawm, piv txwv li, ntawm cov ntaub ntawv sab nraud lossis ntawm qee qhov kev pabcuam. Hauv kev xyaum, cov ntawv thov no tsis tshua muaj. Cov phiaj xwm tiag tiag feem ntau suav nrog tag nrho cov ntawv thov ua haujlwm ua ke.

Koj paub li cas yog tias koj yuav tsum siv Docker Compose thaum siv qhov project? Nws ua tau yooj yim heev. Yog tias koj siv ntau qhov kev pabcuam los ua qhov haujlwm no, ces Docker Compose tuaj yeem ua ke. Piv txwv li, nyob rau hauv ib qho xwm txheej uas lawv tsim ib lub vev xaib uas yuav tsum tau txuas mus rau ib lub chaw khaws ntaub ntawv txhawm rau txheeb xyuas cov neeg siv. Xws li ib txoj haujlwm yuav muaj ob qhov kev pabcuam - ib qho uas ua kom muaj kev ua haujlwm ntawm lub xaib, thiab ib qho uas yog lub luag haujlwm tswj xyuas cov ntaub ntawv.

Docker Compose thev naus laus zis, los piav txog nws txoj hauv kev yooj yim, tso cai rau koj tso ntau yam kev pabcuam nrog ib qho lus txib.

Qhov sib txawv ntawm Docker thiab Docker Compose

Docker yog siv los tswj tus kheej lub thawv (cov kev pabcuam) uas tsim ib daim ntawv thov.

Docker Compose yog siv rau ib txhij tswj ntau lub thawv uas tsim ib daim ntawv thov. Cov cuab yeej no muaj peev xwm zoo ib yam li Docker, tab sis tso cai rau koj ua haujlwm nrog ntau cov ntawv thov nyuaj.

Phau Ntawv Qhia Beginner rau Docker Compose
Docker (ib lub thawv) thiab Docker Compose (ntau lub thawv)

Cov ntaub ntawv siv rau Docker Compose

Docker Compose yog, nyob rau hauv txoj cai tes, lub cuab tam muaj zog heev uas tso cai rau koj kom sai sai xa cov ntawv thov nrog cov txheej txheem nyuaj. Tam sim no peb yuav saib ib qho piv txwv ntawm kev siv Docker Compose, qhov kev tshuaj xyuas uas yuav tso cai rau koj los ntsuas cov txiaj ntsig uas siv Docker Compose yuav muab rau koj.

Xav txog tias koj yog tus tsim tawm ntawm qhov project web. Qhov project no suav nrog ob lub vev xaib. Thawj tso cai rau cov neeg lag luam los tsim cov khw muag khoom online nrog ob peb clicks. Qhov thib ob yog tsom rau cov neeg siv khoom txhawb nqa. Ob qhov chaw no cuam tshuam nrog tib lub database.

Koj qhov project tau dhau los ua neeg nyiam, thiab nws hloov tawm tias lub zog ntawm lub server uas nws khiav tsis txaus lawm. Yog li ntawd, koj txiav txim siab txav tag nrho qhov project mus rau lwm lub tshuab.

Hmoov tsis zoo, koj tsis tau siv qee yam xws li Docker Compose. Yog li ntawd, koj yuav tau hloov thiab kho cov kev pab cuam ib zaug ib zaug, vam tias koj yuav tsis hnov ​​​​qab dab tsi hauv cov txheej txheem.

Yog tias koj siv Docker Compose, ces txav koj qhov project mus rau lub server tshiab yog qhov teeb meem uas tuaj yeem daws tau los ntawm kev khiav ob peb cov lus txib. Txhawm rau ua kom tiav qhov kev hloov pauv ntawm qhov project mus rau qhov chaw tshiab, koj tsuas yog yuav tsum ua qee qhov chaw thiab xa cov ntawv luam theej ntawm cov ntaub ntawv mus rau lub server tshiab.

Tsim ib daim ntawv thov neeg siv khoom siv Docker Compose

Tam sim no koj paub tias peb yuav siv Docker Compose rau dab tsi, nws yog lub sijhawm los tsim koj thawj tus neeg siv-server daim ntawv thov siv cov cuab yeej no. Namely, peb tab tom tham txog kev tsim lub vev xaib me me (server) hauv Python uas tuaj yeem tso tawm cov ntaub ntawv nrog ib feem ntawm cov ntawv nyeem. Cov ntaub ntawv no tau thov los ntawm tus neeg rau zaub mov los ntawm ib qho kev pab cuam (tus neeg siv), kuj tau sau rau hauv Python. Tom qab tau txais cov ntaub ntawv los ntawm tus neeg rau zaub mov, qhov kev pab cuam qhia cov ntawv khaws cia hauv nws ntawm qhov screen.

Thov nco ntsoov tias peb xav tias koj muaj kev nkag siab yooj yim ntawm Docker thiab koj twb tau teeb tsa Docker platform.

Cia peb pib ua haujlwm ntawm qhov project.

▍1. Tsim ib qhov project

Txhawm rau tsim koj thawj tus neeg siv-server daim ntawv thov, kuv xav kom koj pib los ntawm kev tsim ib qhov project folder. Nws yuav tsum muaj cov ntaub ntawv thiab folders hauv qab no:

  • cov ntaub ntawv docker-compose.yml. Nov yog Docker Compose cov ntaub ntawv uas yuav muaj cov lus qhia xav tau los pib thiab teeb tsa cov kev pabcuam.
  • nplaub tshev server. Nws yuav muaj cov ntaub ntawv tsim nyog kom lub server khiav.
  • nplaub tshev client. Cov ntaub ntawv thov cov neeg siv khoom yuav nyob ntawm no.

Yog li ntawd, cov ntsiab lus ntawm koj qhov project lub ntsiab folder yuav tsum zoo li no:

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

▍ 2. Tsim ib lub server

Ntawm no, nyob rau hauv tus txheej txheem ntawm kev tsim ib tug neeg rau zaub mov, peb yuav kov rau tej yam yooj yim hais txog Docker.

2 ib a. Tsim cov ntaub ntawv

Mus rau ntawm daim nplaub tshev server thiab tsim cov ntaub ntawv hauv qab no hauv nws:

  • cov ntaub ntawv server.py. Nws yuav muaj tus server code.
  • cov ntaub ntawv index.html. Cov ntaub ntawv no yuav muaj ib daim ntawv uas tus neeg thov yuav tsum tso tawm.
  • cov ntaub ntawv Dockerfile. Qhov no yog Docker cov ntaub ntawv uas yuav muaj cov lus qhia xav tau los tsim lub server ib puag ncig.

Qhov no yog dab tsi cov ntsiab lus ntawm koj daim nplaub tshev yuav tsum zoo li server/:

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

2b ib. Kho cov ntaub ntawv Python.

Ntxiv rau cov ntaub ntawv server.py cov cai hauv qab no:

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

Cov cai no tso cai rau koj los tsim lub web server yooj yim. Nws yuav muab cov ntaub ntawv rau cov neeg siv khoom index.html, cov ntsiab lus uas tom qab ntawd yuav tshwm rau ntawm nplooj ntawv web.

2c ib. Kho kom raug cov ntaub ntawv HTML

Ua ntaub ntawv index.html ntxiv cov ntawv hauv qab no:

Docker-Compose is magic!

Cov ntawv no yuav raug xa mus rau tus neeg siv khoom.

2d ib. Kho qhov Dockerfile

Tam sim no peb yuav tsim cov ntaub ntawv yooj yim Dockerfile, leej twg yuav yog lub luag haujlwm rau kev teeb tsa lub sijhawm ua haujlwm rau Python server. Raws li lub hauv paus rau cov duab tsim, peb yuav siv nyob rau hauv ib tug official yam, tsim los khiav cov kev pab cuam sau hauv Python. Nov yog cov ntsiab lus ntawm 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/

Tam sim no cia peb pib ua haujlwm ntawm tus neeg siv khoom.

▍ 3. Tsim tus neeg siv khoom

Thaum tsim cov neeg siv khoom ntawm peb qhov project, peb yuav nco ntsoov qee qhov Docker hauv paus ntawm txoj kev.

3 ib a. Tsim cov ntaub ntawv

Mus rau koj qhov project folder client thiab tsim cov ntaub ntawv hauv qab no hauv nws:

  • cov ntaub ntawv client.py. Tus neeg siv code yuav nyob ntawm no.
  • cov ntaub ntawv Dockerfile. Cov ntaub ntawv no ua lub luag haujlwm tib yam li cov ntaub ntawv zoo sib xws hauv server folder. Namely, nws muaj cov lus qhia uas piav qhia yuav ua li cas los tsim ib qho chaw rau kev ua tiav cov neeg siv khoom code.

Yog li ntawd, koj daim nplaub tshev client/ Nyob rau theem no ntawm kev ua haujlwm nws yuav tsum zoo li no:

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

3b ib. Kho cov ntaub ntawv Python

Ntxiv rau cov ntaub ntawv client.py cov cai hauv qab no:

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

Nrog rau cov cai no, daim ntawv thov tus neeg siv tuaj yeem rub tawm cov ntaub ntawv los ntawm lub server thiab tso rau ntawm qhov screen.

3c ua. Kho qhov Dockerfile

Raws li nyob rau hauv cov ntaub ntawv ntawm lub server, peb tsim ib qho yooj yim Dockerfile, lub luag haujlwm los tsim ib puag ncig uas daim ntawv thov Python tus neeg siv yuav khiav. Ntawm no yog tus neeg siv khoom code Dockerfile:

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

FROM python:latest

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

ADD client.py /client/

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

WORKDIR /client/

▍ 4. Docker Compose

Raws li koj tuaj yeem pom, peb tau tsim ob txoj haujlwm sib txawv: tus neeg rau zaub mov thiab tus neeg siv khoom. Txhua tus ntawm lawv muaj nws tus kheej cov ntaub ntawv Dockerfile. Txog tam sim no, txhua yam uas tau tshwm sim tsis tau dhau los ntawm kev ua haujlwm nrog Docker. Tam sim no peb pib nrog Docker Compose. Ua li no, cia peb mus rau cov ntaub ntawv docker-compose.yml, nyob rau hauv qhov project root folder.

Thov nco ntsoov tias ntawm no peb tsis tau sim npog kiag li tag nrho cov lus txib uas tuaj yeem siv rau hauv docker-compose.yml. Peb lub hom phiaj tseem ceeb yog taug kev los ntawm ib qho piv txwv uas yuav ua rau koj paub txog Docker Compose.

Ntawm no yog cov code tso rau hauv cov ntaub ntawv 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. Tsim qhov project

Tom qab hauv docker-compose.yml Tag nrho cov lus qhia tsim nyog tau nkag mus, qhov project yuav tsum tau sib sau ua ke. Cov kauj ruam ntawm peb txoj haujlwm no zoo ib yam li siv cov lus txib docker build, tab sis cov lus txib sib thooj yog cuam tshuam rau ntau qhov kev pabcuam:

$ docker-compose build

▍ 6. Launch ntawm qhov project

Tam sim no hais tias qhov project tau sib sau ua ke, nws yog lub sijhawm los tso nws. Cov kauj ruam ntawm peb txoj haujlwm no sib raug rau cov kauj ruam uas, thaum ua haujlwm nrog ib tus neeg ntim khoom, cov lus txib raug tua. docker run:

$ docker-compose up

Tom qab ua tiav cov lus txib no, cov ntawv rub tawm los ntawm tus neeg siv khoom los ntawm lub server yuav tsum tshwm sim hauv lub davhlau ya nyob twg: Docker-Compose is magic!.

Raws li twb tau hais lawm, lub server siv lub computer chaw nres nkoj 1234 rau cov neeg siv khoom thov. Yog li ntawd, yog tias koj mus rau qhov chaw nyob hauv koj tus browser http://localhost:1234/, nws yuav tso saib ib nplooj ntawv nrog cov ntawv Docker-Compose is magic!.

Siv tau cov lus txib

Cia peb saib qee cov lus txib uas koj yuav pom muaj txiaj ntsig thaum ua haujlwm nrog Docker Compose.

Cov lus txib no tso cai rau koj nres thiab tshem tawm cov ntim khoom thiab lwm yam kev pabcuam tsim los ntawm cov lus txib docker-compose up:

$ docker-compose down

Cov lus txib no sau cov ntawv teev kev pabcuam:

$ docker-compose logs -f [service name]

Piv txwv li, hauv peb qhov project nws tuaj yeem siv rau hauv daim ntawv no: $ docker-compose logs -f [service name].

Siv cov lus txib no koj tuaj yeem tso saib cov npe ntawm cov thawv:

$ docker-compose ps

Qhov kev hais kom ua no tso cai rau koj los ua cov lus txib hauv lub thawv khiav:

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

Piv txwv li, nws yuav zoo li no: docker-compose exec server ls.

Cov lus txib no tso cai rau koj los tso saib cov npe ntawm cov duab:

$ docker-compose images

Cov txiaj ntsim tau los

Peb tau saib lub hauv paus ntawm kev ua haujlwm nrog Docker Compose thev naus laus zis, kev paub txog uas yuav tso cai rau koj siv cov thev naus laus zis no thiab, yog tias xav tau, pib kawm nws hauv qhov tob ntxiv. no ib lub chaw cia khoom nrog cov lej rau qhov project peb saib ntawm no.

Nyob zoo nyeem! Koj puas siv Docker Compose hauv koj cov haujlwm?

Phau Ntawv Qhia Beginner rau Docker Compose

Tau qhov twg los: www.hab.com

Ntxiv ib saib