Hướng dẫn soạn thảo Docker cho người mới bắt đầu

Tác giả của bài báo, bản dịch mà chúng tôi xuất bản ngày hôm nay, nói rằng nó dành cho những nhà phát triển muốn tìm hiểu Docker Compose và đang trên đường tạo ứng dụng máy khách-máy chủ đầu tiên của họ bằng Docker. Giả định rằng người đọc tài liệu này đã quen thuộc với những kiến ​​thức cơ bản về Docker. Nếu đây không phải là trường hợp, bạn có thể xem điều này loạt tài liệu về điều này bài đăng bao gồm những điều cơ bản về Docker cùng với những điều cơ bản về Kubernetes và điều này bài viết dành cho người mới bắt đầu.

Hướng dẫn soạn thảo Docker cho người mới bắt đầu

Docker Compose là gì?

Docker Compose là một công cụ đi kèm với Docker. Nó được thiết kế để giải quyết các vấn đề liên quan đến việc triển khai các dự án.

Trong khi tìm hiểu những điều cơ bản về Docker, bạn có thể đã gặp phải việc tạo các ứng dụng đơn giản hoạt động tự động và không phụ thuộc, chẳng hạn như vào nguồn dữ liệu bên ngoài hoặc vào một số dịch vụ nhất định. Trong thực tế, những ứng dụng như vậy rất hiếm. Các dự án thực tế thường liên quan đến toàn bộ các ứng dụng hoạt động cùng nhau.

Làm cách nào để biết liệu bạn có cần sử dụng Docker Compose khi triển khai dự án hay không? Nó thực sự rất đơn giản. Nếu bạn sử dụng nhiều dịch vụ để thực hiện dự án này thì Docker Compose có thể hữu ích. Ví dụ: trong tình huống họ tạo một trang web cần kết nối với cơ sở dữ liệu để xác thực người dùng. Một dự án như vậy có thể bao gồm hai dịch vụ - một dịch vụ đảm bảo hoạt động của trang web và một dịch vụ chịu trách nhiệm duy trì cơ sở dữ liệu.

Công nghệ Docker Compose, để mô tả một cách đơn giản, cho phép bạn khởi chạy nhiều dịch vụ chỉ bằng một lệnh.

Sự khác biệt giữa Docker và Docker Compose

Docker được sử dụng để quản lý các vùng chứa (dịch vụ) riêng lẻ tạo nên một ứng dụng.

Docker Compose được sử dụng để quản lý đồng thời nhiều vùng chứa tạo nên một ứng dụng. Công cụ này cung cấp các khả năng tương tự như Docker nhưng cho phép bạn làm việc với các ứng dụng phức tạp hơn.

Hướng dẫn soạn thảo Docker cho người mới bắt đầu
Docker (vùng chứa đơn) và Docker Compose (nhiều vùng chứa)

Trường hợp sử dụng Docker Compose điển hình

Docker Compose, trong tầm tay, là một công cụ rất mạnh mẽ cho phép bạn triển khai rất nhanh các ứng dụng có kiến ​​trúc phức tạp. Bây giờ chúng ta sẽ xem xét một ví dụ về cách sử dụng Docker Compose thực tế, việc phân tích ví dụ này sẽ cho phép bạn đánh giá những lợi ích mà việc sử dụng Docker Compose sẽ mang lại cho bạn.

Hãy tưởng tượng rằng bạn là nhà phát triển của một dự án web. Dự án này bao gồm hai trang web. Việc đầu tiên cho phép người kinh doanh tạo các cửa hàng trực tuyến chỉ bằng vài cú nhấp chuột. Thứ hai là nhằm hỗ trợ khách hàng. Hai trang web này tương tác với cùng một cơ sở dữ liệu.

Dự án của bạn ngày càng trở nên phổ biến và hóa ra sức mạnh của máy chủ nơi nó chạy không còn đủ nữa. Kết quả là bạn quyết định chuyển toàn bộ dự án sang một máy khác.

Thật không may, bạn đã không sử dụng thứ gì đó như Docker Compose. Do đó, bạn sẽ phải chuyển và cấu hình lại từng dịch vụ một, hy vọng rằng bạn sẽ không quên bất cứ điều gì trong quá trình này.

Nếu bạn đang sử dụng Docker Compose thì việc di chuyển dự án của bạn sang máy chủ mới là một vấn đề có thể được giải quyết bằng cách chạy một vài lệnh. Để hoàn tất việc chuyển dự án sang vị trí mới, bạn chỉ cần thực hiện một số cài đặt và tải bản sao lưu của cơ sở dữ liệu lên máy chủ mới.

Phát triển ứng dụng máy khách-máy chủ bằng Docker Compose

Bây giờ bạn đã biết chúng ta sẽ sử dụng Docker Compose để làm gì, đã đến lúc tạo ứng dụng máy khách-máy chủ đầu tiên của bạn bằng công cụ này. Cụ thể, chúng ta đang nói về việc phát triển một trang web (máy chủ) nhỏ bằng Python có thể xuất ra một tệp có một đoạn văn bản. Tệp này được yêu cầu từ máy chủ bởi một chương trình (máy khách), cũng được viết bằng Python. Sau khi nhận được một tệp từ máy chủ, chương trình sẽ hiển thị văn bản được lưu trong đó trên màn hình.

Xin lưu ý rằng chúng tôi giả định rằng bạn có hiểu biết cơ bản về Docker và bạn đã cài đặt nền tảng Docker.

Hãy bắt đầu làm việc với dự án.

▍1. Tạo một dự án

Để xây dựng ứng dụng máy khách-máy chủ đầu tiên của bạn, tôi khuyên bạn nên bắt đầu bằng cách tạo một thư mục dự án. Nó phải chứa các tập tin và thư mục sau:

  • hồ sơ docker-compose.yml. Đây là tệp Docker Compose sẽ chứa các hướng dẫn cần thiết để bắt đầu và định cấu hình dịch vụ.
  • Thư mục server. Nó sẽ chứa các tập tin cần thiết để duy trì hoạt động của máy chủ.
  • Thư mục client. Các tập tin ứng dụng khách sẽ được đặt ở đây.

Kết quả là nội dung thư mục chính của dự án của bạn sẽ trông như thế này:

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

▍2. Tạo một máy chủ

Ở đây, trong quá trình tạo máy chủ, chúng ta sẽ đề cập đến một số điều cơ bản liên quan đến Docker.

2a. Tạo tập tin

Đi tới thư mục server và tạo các tệp sau trong đó:

  • hồ sơ server.py. Nó sẽ chứa mã máy chủ.
  • hồ sơ index.html. Tệp này sẽ chứa một đoạn văn bản mà ứng dụng khách sẽ xuất ra.
  • hồ sơ Dockerfile. Đây là tệp Docker sẽ chứa các hướng dẫn cần thiết để tạo môi trường máy chủ.

Nội dung thư mục của bạn sẽ trông như thế này server/:

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

2b. Chỉnh sửa tệp Python.

Thêm vào tập tin server.py đoạn mã sau:

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

Mã này cho phép bạn tạo một máy chủ web đơn giản. Anh ta sẽ đưa cho khách hàng hồ sơ index.html, nội dung sau này sẽ được hiển thị trên trang web.

2c. Chỉnh sửa tệp HTML

Nộp index.html thêm văn bản sau:

Docker-Compose is magic!

Văn bản này sẽ được gửi đến khách hàng.

2d. Chỉnh sửa Dockerfile

Bây giờ chúng ta sẽ tạo một tập tin đơn giản Dockerfile, người sẽ chịu trách nhiệm tổ chức môi trường thời gian chạy cho máy chủ Python. Để làm cơ sở cho hình ảnh được tạo, chúng ta sẽ sử dụng chính thức, được thiết kế để chạy các chương trình viết bằng Python. Đây là nội dung của 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/

Bây giờ chúng ta hãy làm việc trên máy khách.

▍3. Tạo một khách hàng

Trong khi tạo phía máy khách cho dự án của mình, chúng tôi sẽ nhớ lại một số điều cơ bản về Docker trong quá trình thực hiện.

3a. Tạo tập tin

Chuyển đến thư mục dự án của bạn client và tạo các tệp sau trong đó:

  • hồ sơ client.py. Mã khách hàng sẽ được đặt ở đây.
  • hồ sơ Dockerfile. Tệp này đóng vai trò giống như một tệp tương tự trong thư mục máy chủ. Cụ thể, nó chứa các hướng dẫn mô tả cách tạo môi trường để thực thi mã máy khách.

Kết quả là thư mục của bạn client/ ở giai đoạn làm việc này, nó sẽ trông như thế này:

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

3b. Chỉnh sửa tệp Python

Thêm vào tập tin client.py đoạn mã sau:

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

Với mã này, ứng dụng khách có thể tải dữ liệu từ máy chủ và hiển thị trên màn hình.

3c. Chỉnh sửa Dockerfile

Như trong trường hợp máy chủ, chúng ta tạo một Dockerfile, chịu trách nhiệm tạo môi trường trong đó ứng dụng khách Python sẽ chạy. Đây là mã khách hàng Dockerfile:

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

FROM python:latest

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

ADD client.py /client/

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

WORKDIR /client/

▍4. Docker Soạn

Như bạn có thể thấy, chúng tôi đã tạo hai dự án khác nhau: máy chủ và máy khách. Mỗi người trong số họ có tập tin riêng của mình Dockerfile. Cho đến nay, mọi thứ xảy ra không vượt quá những điều cơ bản khi làm việc với Docker. Bây giờ chúng ta bắt đầu làm việc với Docker Compose. Để thực hiện việc này, hãy tham khảo tệp docker-compose.yml, nằm trong thư mục gốc của dự án.

Xin lưu ý rằng ở đây chúng tôi không nhằm mục đích bao gồm hoàn toàn tất cả các lệnh có thể được sử dụng trong docker-compose.yml. Mục tiêu chính của chúng tôi là xem qua một ví dụ thực tế sẽ cung cấp cho bạn kiến ​​thức cơ bản về Docker Compose.

Đây là mã để đặt vào tập tin 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. Xây dựng dự án

Sau khi vào docker-compose.yml Tất cả các hướng dẫn cần thiết đã được nhập, dự án cần được lắp ráp. Bước làm việc này của chúng ta tương tự như sử dụng lệnh docker build, nhưng lệnh tương ứng có liên quan đến một số dịch vụ:

$ docker-compose build

▍6. Khởi động dự án

Bây giờ dự án đã được xây dựng, đã đến lúc chạy nó. Bước công việc này của chúng tôi tương ứng với bước mà khi làm việc với các vùng chứa riêng lẻ, lệnh được thực thi docker run:

$ docker-compose up

Sau khi thực hiện lệnh này, văn bản được máy khách tải xuống từ máy chủ sẽ xuất hiện trong thiết bị đầu cuối: Docker-Compose is magic!.

Như đã đề cập, máy chủ sử dụng cổng máy tính 1234 để phục vụ các yêu cầu của khách hàng. Vì vậy, nếu bạn truy cập địa chỉ trong trình duyệt của mình http://localhost:1234/, nó sẽ hiển thị một trang có văn bản Docker-Compose is magic!.

Các lệnh hữu ích

Chúng ta hãy xem một số lệnh mà bạn có thể thấy hữu ích khi làm việc với Docker Compose.

Lệnh này cho phép bạn dừng và xóa các thùng chứa cũng như các tài nguyên khác được tạo bởi lệnh docker-compose up:

$ docker-compose down

Lệnh này in nhật ký dịch vụ:

$ docker-compose logs -f [service name]

Ví dụ: trong dự án của chúng tôi, nó có thể được sử dụng ở dạng này: $ docker-compose logs -f [service name].

Với lệnh này, bạn có thể hiển thị danh sách các vùng chứa:

$ docker-compose ps

Lệnh này cho phép bạn thực thi một lệnh trong vùng chứa đang chạy:

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

Ví dụ: nó có thể trông như thế này: docker-compose exec server ls.

Lệnh này cho phép bạn hiển thị danh sách hình ảnh:

$ docker-compose images

Kết quả

Chúng tôi đã xem xét những kiến ​​thức cơ bản khi làm việc với công nghệ Docker Compose, kiến ​​thức về công nghệ này sẽ cho phép bạn sử dụng công nghệ này và nếu muốn, hãy bắt đầu nghiên cứu sâu hơn về nó. Đây kho lưu trữ có mã dự án mà chúng tôi đã xem xét ở đây.

Gởi bạn đọc! Bạn có sử dụng Docker Compose trong dự án của mình không?

Hướng dẫn soạn thảo Docker cho người mới bắt đầu

Nguồn: www.habr.com

Thêm một lời nhận xét