초보자를 위한 Docker Compose 가이드

오늘 우리가 번역한 기사의 저자는 이 기사가 Docker Compose를 배우고자 하며 Docker를 사용하여 첫 번째 클라이언트-서버 애플리케이션을 만드는 과정에 있는 개발자를 대상으로 한다고 말합니다. 이 자료의 독자는 Docker의 기본 사항에 익숙하다고 가정합니다. 그렇지 않은 경우 다음을 살펴볼 수 있습니다. 일련의 재료 Kubernetes의 기본 사항과 함께 Docker의 기본 사항을 다루는 게시물 및 초보자를 위한 글.

초보자를 위한 Docker Compose 가이드

Docker Compose란 무엇입니까?

Docker Compose는 Docker에 포함된 도구입니다. 프로젝트 배포와 관련된 문제를 해결하도록 설계되었습니다.

Docker의 기본 사항을 배우면서 예를 들어 외부 데이터 소스나 특정 서비스에 의존하지 않고 자율적으로 작동하는 가장 단순한 애플리케이션을 생성하는 것을 접했을 수 있습니다. 실제로 이러한 응용 프로그램은 드뭅니다. 실제 프로젝트에는 일반적으로 전체 협업 애플리케이션 세트가 포함됩니다.

프로젝트를 배포할 때 Docker Compose를 사용해야 하는지 어떻게 알 수 있습니까? 실제로는 매우 간단합니다. 여러 서비스를 사용하여 이 프로젝트를 실행하는 경우 Docker Compose가 유용할 수 있습니다. 예를 들어, 사용자 인증을 수행하기 위해 데이터베이스에 연결해야 하는 웹 사이트를 생성하는 상황입니다. 이러한 프로젝트는 사이트 운영을 보장하는 서비스와 데이터베이스 지원을 담당하는 서비스의 두 가지 서비스로 구성될 수 있습니다.

Docker Compose 기술을 단순화하여 설명하면 하나의 명령으로 많은 서비스를 시작할 수 있습니다.

Docker와 Docker Compose의 차이점

Docker는 애플리케이션을 구성하는 개별 컨테이너(서비스)를 관리하는 데 사용됩니다.

Docker Compose는 애플리케이션의 일부인 여러 컨테이너를 동시에 관리하는 데 사용됩니다. 이 도구는 Docker와 동일한 기능을 제공하지만 더 복잡한 애플리케이션으로 작업할 수 있습니다.

초보자를 위한 Docker Compose 가이드
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. 파이썬 파일 편집.

파일에 추가 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, 그 콘텐츠는 나중에 웹 페이지에 표시됩니다.

2c. HTML 파일 편집

파일로 index.html 다음 텍스트를 추가합니다.

Docker-Compose is magic!

이 텍스트는 고객에게 전송됩니다.

2d. Dockerfile 편집

이제 우리는 간단한 파일을 만들 것입니다 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

3b. 파이썬 파일 편집

파일에 추가 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()

이 코드 덕분에 클라이언트 애플리케이션은 서버에서 데이터를 다운로드하여 화면에 표시할 수 있습니다.

3c. Dockerfile 편집

서버의 경우와 마찬가지로 간단한 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 Compose 가이드

출처 : habr.com

코멘트를 추가