คู่มือเขียน Docker สำหรับผู้เริ่มต้น

ผู้เขียนบทความซึ่งเรากำลังเผยแพร่ในวันนี้กล่าวว่ามีไว้สำหรับนักพัฒนาที่ต้องการเรียนรู้ Docker Compose และกำลังสร้างแอปพลิเคชันไคลเอนต์เซิร์ฟเวอร์แรกโดยใช้ Docker สันนิษฐานว่าผู้อ่านเนื้อหานี้คุ้นเคยกับพื้นฐานของ Docker หากไม่เป็นเช่นนั้น คุณสามารถดูได้ที่ นี้ ชุดของวัสดุ นี้ โพสต์ที่ครอบคลุมพื้นฐานของ Docker พร้อมกับพื้นฐานของ Kubernetes และ นี้ บทความสำหรับผู้เริ่มต้น

คู่มือเขียน Docker สำหรับผู้เริ่มต้น

Docker Compose คืออะไร?

Docker Compose เป็นเครื่องมือที่มาพร้อมกับ Docker ออกแบบมาเพื่อแก้ปัญหาที่เกี่ยวข้องกับการปรับใช้โครงการ

ในขณะที่เรียนรู้พื้นฐานของ Docker คุณอาจได้พบกับการสร้างแอปพลิเคชันที่ง่ายที่สุดซึ่งทำงานโดยอัตโนมัติโดยไม่ต้องพึ่งพา ตัวอย่างเช่น จากแหล่งข้อมูลภายนอกหรือบริการบางอย่าง ในทางปฏิบัติ แอปพลิเคชันดังกล่าวหายาก โครงการจริงมักเกี่ยวข้องกับแอปพลิเคชันการทำงานร่วมกันทั้งชุด

คุณจะรู้ได้อย่างไรว่าคุณต้องใช้ Docker Compose เมื่อปรับใช้โครงการ จริงๆแล้วมันง่ายมาก หากคุณใช้บริการหลายอย่างเพื่อเรียกใช้โปรเจ็กต์นี้ Docker Compose อาจมีประโยชน์ ตัวอย่างเช่น ในสถานการณ์ที่คุณสร้างเว็บไซต์ซึ่งจำเป็นต้องเชื่อมต่อกับฐานข้อมูลเพื่อดำเนินการตรวจสอบสิทธิ์ผู้ใช้ โครงการดังกล่าวอาจประกอบด้วยสองบริการ - หนึ่งบริการที่รับรองการทำงานของไซต์และอีกหนึ่งบริการที่รับผิดชอบในการสนับสนุนฐานข้อมูล

หากคุณอธิบายเทคโนโลยี Docker Compose ให้เข้าใจง่ายขึ้น จะช่วยให้คุณสามารถเริ่มบริการต่างๆ ได้ด้วยคำสั่งเดียว

ความแตกต่างระหว่าง Docker และ Docker Compose

นักเทียบท่าใช้ในการจัดการคอนเทนเนอร์ (บริการ) แต่ละรายการที่ประกอบกันเป็นแอปพลิเคชัน

Docker Compose ใช้เพื่อจัดการหลายคอนเทนเนอร์ที่เป็นส่วนหนึ่งของแอปพลิเคชันในเวลาเดียวกัน เครื่องมือนี้มีคุณสมบัติเหมือนกับ Docker แต่ช่วยให้คุณทำงานกับแอปพลิเคชันที่ซับซ้อนกว่าได้

คู่มือเขียน 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 เราจะใช้พื้นฐานของภาพที่สร้างขึ้น อย่างเป็นทางการออกแบบมาเพื่อเรียกใช้โปรแกรมที่เขียนด้วย Python นี่คือเนื้อหาของ 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/

ตอนนี้เรามาทำงานกับลูกค้า

▍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 เพื่อตอบสนองความต้องการของลูกค้า ดังนั้นหากคุณไปที่ที่อยู่เบราว์เซอร์ http://localhost: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 ในโครงการของคุณหรือไม่?

คู่มือเขียน Docker สำหรับผู้เริ่มต้น

ที่มา: will.com

เพิ่มความคิดเห็น