ผู้เขียนบทความซึ่งเรากำลังเผยแพร่ในวันนี้กล่าวว่ามีไว้สำหรับนักพัฒนาที่ต้องการเรียนรู้ Docker Compose และกำลังสร้างแอปพลิเคชันไคลเอนต์เซิร์ฟเวอร์แรกโดยใช้ Docker สันนิษฐานว่าผู้อ่านเนื้อหานี้คุ้นเคยกับพื้นฐานของ Docker หากไม่เป็นเช่นนั้น คุณสามารถดูได้ที่
Docker Compose คืออะไร?
Docker Compose เป็นเครื่องมือที่มาพร้อมกับ Docker ออกแบบมาเพื่อแก้ปัญหาที่เกี่ยวข้องกับการปรับใช้โครงการ
ในขณะที่เรียนรู้พื้นฐานของ Docker คุณอาจได้พบกับการสร้างแอปพลิเคชันที่ง่ายที่สุดซึ่งทำงานโดยอัตโนมัติโดยไม่ต้องพึ่งพา ตัวอย่างเช่น จากแหล่งข้อมูลภายนอกหรือบริการบางอย่าง ในทางปฏิบัติ แอปพลิเคชันดังกล่าวหายาก โครงการจริงมักเกี่ยวข้องกับแอปพลิเคชันการทำงานร่วมกันทั้งชุด
คุณจะรู้ได้อย่างไรว่าคุณต้องใช้ Docker Compose เมื่อปรับใช้โครงการ จริงๆแล้วมันง่ายมาก หากคุณใช้บริการหลายอย่างเพื่อเรียกใช้โปรเจ็กต์นี้ Docker Compose อาจมีประโยชน์ ตัวอย่างเช่น ในสถานการณ์ที่คุณสร้างเว็บไซต์ซึ่งจำเป็นต้องเชื่อมต่อกับฐานข้อมูลเพื่อดำเนินการตรวจสอบสิทธิ์ผู้ใช้ โครงการดังกล่าวอาจประกอบด้วยสองบริการ - หนึ่งบริการที่รับรองการทำงานของไซต์และอีกหนึ่งบริการที่รับผิดชอบในการสนับสนุนฐานข้อมูล
หากคุณอธิบายเทคโนโลยี Docker Compose ให้เข้าใจง่ายขึ้น จะช่วยให้คุณสามารถเริ่มบริการต่างๆ ได้ด้วยคำสั่งเดียว
ความแตกต่างระหว่าง Docker และ Docker Compose
นักเทียบท่าใช้ในการจัดการคอนเทนเนอร์ (บริการ) แต่ละรายการที่ประกอบกันเป็นแอปพลิเคชัน
Docker Compose ใช้เพื่อจัดการหลายคอนเทนเนอร์ที่เป็นส่วนหนึ่งของแอปพลิเคชันในเวลาเดียวกัน เครื่องมือนี้มีคุณสมบัติเหมือนกับ Docker แต่ช่วยให้คุณทำงานกับแอปพลิเคชันที่ซับซ้อนกว่าได้
Docker (คอนเทนเนอร์เดียว) และ Docker Compose (หลายคอนเทนเนอร์)
กรณีการใช้งาน Docker Compose ทั่วไป
Docker Compose เป็นเครื่องมือที่มีประสิทธิภาพมากซึ่งช่วยให้คุณสามารถปรับใช้แอปพลิเคชันได้อย่างรวดเร็วด้วยสถาปัตยกรรมที่ซับซ้อน ตอนนี้เราจะดูตัวอย่างการใช้งานจริงของ Docker Compose ซึ่งการวิเคราะห์จะช่วยให้คุณสามารถประเมินประโยชน์ที่การใช้ Docker Compose จะมอบให้คุณ
ลองนึกภาพว่าคุณเป็นผู้พัฒนาโครงการเว็บ โครงการนี้ประกอบด้วยสองเว็บไซต์ วิธีแรกช่วยให้นักธุรกิจสามารถสร้างร้านค้าออนไลน์ได้ด้วยการคลิกเพียงไม่กี่ครั้ง ประการที่สองมุ่งเป้าไปที่การสนับสนุนลูกค้า ไซต์ทั้งสองนี้โต้ตอบกับฐานข้อมูลเดียวกัน
โครงการของคุณกำลังเป็นที่นิยมมากขึ้นเรื่อย ๆ และปรากฎว่าความจุของเซิร์ฟเวอร์ที่ใช้งานไม่เพียงพออีกต่อไป ด้วยเหตุนี้ คุณจึงตัดสินใจถ่ายโอนโครงการทั้งหมดไปยังเครื่องอื่น
น่าเสียดายที่คุณไม่ได้ใช้บางอย่างเช่น Docker Compose ดังนั้น คุณจะต้องโอนย้ายและกำหนดค่าบริการใหม่ทีละรายการ โดยหวังว่าคุณจะไม่ลืมสิ่งใดในกระบวนการของงานนี้
หากคุณใช้ Docker Compose การย้ายโปรเจ็กต์ของคุณไปยังเซิร์ฟเวอร์ใหม่จะเป็นปัญหาที่สามารถแก้ไขได้ด้วยการเรียกใช้คำสั่งสองสามคำสั่ง ในการถ่ายโอนโปรเจ็กต์ไปยังตำแหน่งใหม่ให้เสร็จสมบูรณ์ คุณเพียงแค่ทำการตั้งค่าบางอย่างและอัปโหลดสำเนาสำรองของฐานข้อมูลไปยังเซิร์ฟเวอร์ใหม่
การพัฒนาแอปพลิเคชันไคลเอ็นต์เซิร์ฟเวอร์โดยใช้ Docker Compose
ตอนนี้คุณรู้แล้วว่าเราจะใช้ Docker Compose เพื่ออะไร ก็ถึงเวลาสร้างแอปพลิเคชันไคลเอนต์/เซิร์ฟเวอร์แรกของคุณโดยใช้เครื่องมือนี้ กล่าวคือเรากำลังพูดถึงการพัฒนาเว็บไซต์ขนาดเล็ก (เซิร์ฟเวอร์) ใน Python ซึ่งสามารถสร้างไฟล์ที่มีส่วนของข้อความได้ ไฟล์นี้ถูกร้องขอจากเซิร์ฟเวอร์โดยโปรแกรม (ไคลเอนต์) ที่เขียนด้วย Python หลังจากได้รับไฟล์จากเซิร์ฟเวอร์ โปรแกรมจะแสดงข้อความที่เก็บไว้ในนั้นบนหน้าจอ
โปรดทราบว่าเราถือว่าคุณมีพื้นฐานของ Docker และคุณได้ติดตั้งแพลตฟอร์ม Docker ไว้แล้ว
มาเริ่มทำงานในโครงการกัน
▍1. สร้างโครงการ
ในการสร้างแอปพลิเคชันไคลเอนต์/เซิร์ฟเวอร์แรกของคุณ ฉันขอแนะนำให้คุณเริ่มต้นด้วยการสร้างโฟลเดอร์โครงการ ควรมีไฟล์และโฟลเดอร์ต่อไปนี้:
- ไฟล์
docker-compose.yml
. นี่คือไฟล์ Docker Compose ซึ่งจะมีคำแนะนำที่จำเป็นในการเริ่มต้นและกำหนดค่าบริการ - โฟลเดอร์
server
. มันจะมีไฟล์ที่จำเป็นในการทำให้เซิร์ฟเวอร์ทำงานได้ - โฟลเดอร์
client
. นี่คือตำแหน่งของไฟล์แอปพลิเคชันไคลเอนต์
ดังนั้น เนื้อหาของโฟลเดอร์หลักของโปรเจ็กต์ของคุณควรมีลักษณะดังนี้:
.
├── client/
├── docker-compose.yml
└── server/
2 directories, 1 file
▍2. การสร้างเซิร์ฟเวอร์
ในกระบวนการสร้างเซิร์ฟเวอร์ เราจะกล่าวถึงสิ่งพื้นฐานบางอย่างเกี่ยวกับ Docker
2a การสร้างไฟล์
ไปที่โฟลเดอร์ server
และสร้างไฟล์ต่อไปนี้ในนั้น:
- ไฟล์
server.py
. มันจะมีรหัสเซิร์ฟเวอร์ - ไฟล์
index.html
. ไฟล์นี้จะมีส่วนของข้อความที่แอปพลิเคชันไคลเอนต์ควรแสดง - ไฟล์
Dockerfile
. นี่คือไฟล์ Docker ซึ่งจะมีคำแนะนำที่จำเป็นในการสร้างสภาพแวดล้อมเซิร์ฟเวอร์
นี่คือลักษณะของเนื้อหาในโฟลเดอร์ของคุณควรมีลักษณะดังนี้ server/
:
.
├── Dockerfile
├── index.html
└── server.py
0 directories, 3 files
2b. การแก้ไขไฟล์ Python
เพิ่มไปยังไฟล์ server.py
รหัสต่อไปนี้:
#!/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()
รหัสนี้ช่วยให้คุณสร้างเว็บเซิร์ฟเวอร์อย่างง่าย เขาจะให้ลูกค้าไฟล์ index.html
ซึ่งเนื้อหาจะแสดงบนหน้าเว็บในภายหลัง
2ค. การแก้ไขไฟล์ HTML
เพื่อยื่น index.html
เพิ่มข้อความต่อไปนี้:
Docker-Compose is magic!
ข้อความนี้จะถูกส่งไปยังลูกค้า
2 วัน การแก้ไขไฟล์ Docker
ตอนนี้เราจะสร้างไฟล์อย่างง่าย Dockerfile
ซึ่งจะรับผิดชอบในการจัดระเบียบสภาพแวดล้อมรันไทม์สำหรับเซิร์ฟเวอร์ Python เราจะใช้พื้นฐานของภาพที่สร้างขึ้น
# На всякий случай напоминаю, что 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/
ตอนนี้เรามาทำงานกับลูกค้า
▍3. สร้างลูกค้า
ในขณะที่สร้างฝั่งไคลเอ็นต์ของโปรเจ็กต์ เราจะเรียกคืนข้อมูลพื้นฐานบางอย่างของ Docker ไปพร้อมกัน
3a การสร้างไฟล์
ไปที่โฟลเดอร์โครงการของคุณ client
และสร้างไฟล์ต่อไปนี้ในนั้น:
- ไฟล์
client.py
. นี่คือรหัสลูกค้าที่จะอยู่ - ไฟล์
Dockerfile
. ไฟล์นี้มีบทบาทเดียวกับไฟล์ที่คล้ายกันในโฟลเดอร์เซิร์ฟเวอร์ กล่าวคือ มีคำสั่งที่อธิบายถึงวิธีสร้างสภาพแวดล้อมสำหรับการดำเนินการรหัสไคลเอนต์
เป็นผลให้โฟลเดอร์ของคุณ client/
ในขั้นตอนนี้ควรมีลักษณะดังนี้:
.
├── client.py
└── Dockerfile
0 directories, 2 files
3ข. การแก้ไขไฟล์ Python
เพิ่มไปยังไฟล์ client.py
รหัสต่อไปนี้:
#!/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()
ด้วยรหัสนี้ แอปพลิเคชันไคลเอนต์สามารถดาวน์โหลดข้อมูลจากเซิร์ฟเวอร์และแสดงบนหน้าจอ
3ค. การแก้ไขไฟล์ Docker
ในกรณีของเซิร์ฟเวอร์ เราสร้างแบบง่ายๆ สำหรับลูกค้า Dockerfile
รับผิดชอบในการกำหนดสภาพแวดล้อมที่แอปพลิเคชันไคลเอนต์ Python จะทำงาน นี่คือรหัสลูกค้า Dockerfile
:
# То же самое, что и в серверном Dockerfile.
FROM python:latest
# Импортируем 'client.py' в папку '/client/'.
ADD client.py /client/
# Устанавливаем в качестве рабочей директории '/client/'.
WORKDIR /client/
▍4. การเขียนนักเทียบท่า
อย่างที่คุณเห็น เราได้สร้างสองโครงการที่แตกต่างกัน: เซิร์ฟเวอร์และไคลเอนต์ แต่ละคนมีไฟล์ของตัวเอง Dockerfile
. จนถึงตอนนี้ทุกสิ่งที่เกิดขึ้นไม่เกินพื้นฐานของการทำงานกับ Docker ตอนนี้เรามาทำงานกับ Docker Compose เมื่อต้องการทำเช่นนี้ ให้อ้างอิงถึงไฟล์ docker-compose.yml
อยู่ในโฟลเดอร์รูทของโปรเจ็กต์
โปรดทราบว่าที่นี่เราไม่ได้มุ่งหวังที่จะครอบคลุมคำสั่งทั้งหมดที่สามารถใช้ได้ docker-compose.yml
. เป้าหมายหลักของเราคือการแบ่งตัวอย่างที่ใช้งานได้จริงซึ่งจะให้ความรู้พื้นฐานเกี่ยวกับ Docker Compose
นี่คือรหัสที่จะใส่ในไฟล์ 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. สร้างโครงการ
หลังจากเข้า docker-compose.yml
มีการจัดทำคำแนะนำที่จำเป็นทั้งหมดแล้วจำเป็นต้องประกอบโครงการ ขั้นตอนการทำงานของเรานี้คล้ายกับการใช้คำสั่ง docker build
แต่คำสั่งที่เกี่ยวข้องเกี่ยวข้องกับหลายบริการ:
$ docker-compose build
▍6. เปิดตัวโครงการ
ตอนนี้โครงการถูกสร้างขึ้นแล้วก็ถึงเวลาดำเนินการ ขั้นตอนการทำงานของเรานี้สอดคล้องกับขั้นตอนที่คำสั่งจะถูกดำเนินการเมื่อทำงานกับแต่ละคอนเทนเนอร์ docker run
:
$ docker-compose up
หลังจากดำเนินการคำสั่งนี้ ข้อความที่ไคลเอนต์โหลดจากเซิร์ฟเวอร์ควรปรากฏในเทอร์มินัล: Docker-Compose is magic!
.
เซิร์ฟเวอร์ใช้พอร์ตคอมพิวเตอร์ 1234
เพื่อตอบสนองความต้องการของลูกค้า ดังนั้นหากคุณไปที่ที่อยู่เบราว์เซอร์ Docker-Compose is magic!
.
คำสั่งที่เป็นประโยชน์
มาดูคำสั่งบางคำสั่งที่คุณอาจพบว่ามีประโยชน์เมื่อทำงานกับ Docker Compose
คำสั่งนี้อนุญาตให้คุณหยุดและลบคอนเทนเนอร์และรีซอร์สอื่นๆ ที่สร้างโดยคำสั่ง docker-compose up
:
$ docker-compose down
คำสั่งนี้พิมพ์บันทึกการบริการ:
$ docker-compose logs -f [service name]
ตัวอย่างเช่น ในโครงการของเราสามารถใช้ในรูปแบบนี้: $ docker-compose logs -f [service name]
.
ด้วยคำสั่งนี้ คุณสามารถแสดงรายการคอนเทนเนอร์:
$ docker-compose ps
คำสั่งนี้อนุญาตให้คุณดำเนินการคำสั่งในคอนเทนเนอร์ที่กำลังทำงานอยู่:
$ docker-compose exec [service name] [command]
ตัวอย่างเช่น อาจมีลักษณะดังนี้: docker-compose exec server ls
.
คำสั่งนี้อนุญาตให้คุณแสดงรายการรูปภาพ:
$ docker-compose images
ผลของการ
เราได้กล่าวถึงพื้นฐานของการทำงานกับเทคโนโลยี Docker Compose ซึ่งเป็นความรู้ที่จะช่วยให้คุณสามารถใช้เทคโนโลยีนี้ และหากต้องการ ให้เริ่มศึกษาในเชิงลึกมากขึ้น
เรียนผู้อ่าน! คุณใช้ Docker Compose ในโครงการของคุณหรือไม่?
ที่มา: will.com