Guía para principiantes de Docker Compose

O autor do artigo, cuxa tradución publicamos hoxe, di que está pensado para aqueles desenvolvedores que queiran aprender Docker Compose e están avanzando na creación da súa primeira aplicación cliente-servidor mediante Docker. Suponse que o lector deste material está familiarizado cos conceptos básicos de Docker. Se non é o caso, podes botarlle unha ollada isto serie de materiais sobre isto publicación que abarca os conceptos básicos de Docker xunto cos conceptos básicos de Kubernetes e isto artigo para principiantes.

Guía para principiantes de Docker Compose

Que é Docker Compose?

Docker Compose é unha ferramenta incluída con Docker. Está deseñado para resolver problemas relacionados coa implantación do proxecto.

Mentres aprendes os conceptos básicos de Docker, é posible que te atopes coa creación de aplicacións sinxelas que funcionan de forma autónoma e que non dependen, por exemplo, de fontes de datos externas ou de determinados servizos. Na práctica, tales aplicacións son raras. Os proxectos reais normalmente implican todo un conxunto de aplicacións que traballan en conxunto.

Como sabes se necesitas usar Docker Compose ao implementar un proxecto? En realidade é moi sinxelo. Se usas varios servizos para que este proxecto funcione, entón Docker Compose pode ser útil. Por exemplo, nunha situación na que crean un sitio web que precisa conectarse a unha base de datos para autenticar os usuarios. Tal proxecto pode consistir en dous servizos: o que garante o funcionamento do sitio e o que se encarga do mantemento da base de datos.

A tecnoloxía Docker Compose, para describila dun xeito simplificado, permítelle lanzar moitos servizos cun só comando.

Diferenza entre Docker e Docker Compose

Docker úsase para xestionar os contedores individuais (servizos) que compoñen unha aplicación.

Docker Compose úsase para xestionar simultaneamente varios contedores que compoñen unha aplicación. Esta ferramenta ofrece as mesmas capacidades que Docker, pero permíteche traballar con aplicacións máis complexas.

Guía para principiantes de Docker Compose
Docker (contedor único) e Docker Compose (contedores múltiples)

Caso de uso típico de Docker Compose

Docker Compose é, nas mans correctas, unha ferramenta moi poderosa que permite despregar moi rapidamente aplicacións con arquitecturas complexas. Agora veremos un exemplo de uso práctico de Docker Compose, cuxa análise permitirá avaliar os beneficios que lle dará o uso de Docker Compose.

Imaxina que es un desenvolvedor dun proxecto web. Este proxecto inclúe dous sitios web. O primeiro permite aos empresarios crear tendas en liña con só uns poucos clics. O segundo está dirixido ao servizo de atención ao cliente. Estes dous sitios interactúan coa mesma base de datos.

O teu proxecto é cada vez máis popular, e resulta que a potencia do servidor no que se executa xa non é suficiente. Como resultado, decide mover todo o proxecto a outra máquina.

Desafortunadamente, non usaches algo como Docker Compose. Polo tanto, terás que transferir e reconfigurar os servizos un a un, coa esperanza de que non esquezas nada no proceso.

Se usa Docker Compose, mover o proxecto a un novo servidor é un problema que se pode resolver executando algúns comandos. Para completar a transferencia do proxecto a unha nova localización, só tes que facer algúns axustes e cargar unha copia de seguridade da base de datos no novo servidor.

Desenvolvemento dunha aplicación cliente-servidor mediante Docker Compose

Agora que sabes para que imos usar Docker Compose, é hora de crear a túa primeira aplicación cliente-servidor usando esta ferramenta. É dicir, estamos a falar de desenvolver un pequeno sitio web (servidor) en Python que poida producir un ficheiro cun fragmento de texto. Este ficheiro é solicitado desde o servidor por un programa (cliente), tamén escrito en Python. Despois de recibir un ficheiro do servidor, o programa mostra na pantalla o texto almacenado nel.

Ten en conta que asumimos que tes un coñecemento básico de Docker e que xa tes a plataforma Docker instalada.

Comezamos a traballar no proxecto.

▍1. Creando un Proxecto

Para crear a súa primeira aplicación cliente-servidor, suxíroche que comece por crear un cartafol do proxecto. Debe conter os seguintes ficheiros e cartafoles:

  • arquivo docker-compose.yml. Este é un ficheiro de Docker Compose que conterá as instrucións necesarias para iniciar e configurar os servizos.
  • Dobrador server. Conterá os ficheiros necesarios para manter o servidor funcionando.
  • Dobrador client. Os ficheiros da aplicación cliente localizaranse aquí.

Como resultado, o contido do cartafol principal do teu proxecto debería verse así:

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

▍2. Creando un servidor

Aquí, no proceso de creación dun servidor, tocaremos algunhas cousas básicas sobre Docker.

2a. Creando ficheiros

Ir ao cartafol server e crea nela os seguintes ficheiros:

  • arquivo server.py. Conterá o código do servidor.
  • arquivo index.html. Este ficheiro conterá un fragmento de texto que a aplicación cliente debería emitir.
  • arquivo Dockerfile. Este é un ficheiro Docker que conterá as instrucións necesarias para crear o ambiente do servidor.

Así debería ser o contido do teu cartafol server/:

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

2b. Editando un ficheiro Python.

Engadir ao ficheiro server.py o seguinte código:

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

Este código permítelle crear un servidor web sinxelo. Dará aos clientes o ficheiro index.html, cuxo contido se mostrará posteriormente na páxina web.

2c. Editando un ficheiro HTML

Para arquivar index.html engade o seguinte texto:

Docker-Compose is magic!

Este texto será enviado ao cliente.

2d. Editando o ficheiro Docker

Agora imos crear un ficheiro sinxelo Dockerfile, que será o responsable de organizar o ambiente de execución do servidor Python. Como base para a imaxe creada, utilizaremos de forma oficial, deseñado para executar programas escritos en Python. Aquí está o contido do 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/

Agora imos comezar a traballar no cliente.

▍3. Creando un cliente

Mentres creamos o lado cliente do noso proxecto, lembraremos algúns conceptos básicos de Docker ao longo do camiño.

3a. Creando ficheiros

Vai ao cartafol do teu proxecto client e crea nela os seguintes ficheiros:

  • arquivo client.py. O código do cliente estará aquí.
  • arquivo Dockerfile. Este ficheiro desempeña o mesmo papel que un ficheiro similar no cartafol do servidor. É dicir, contén instrucións que describen como crear un ambiente para executar código de cliente.

Como resultado, o teu cartafol client/ nesta fase de traballo debería verse así:

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

3b. Editando un ficheiro Python

Engadir ao ficheiro client.py o seguinte código:

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

Con este código, a aplicación cliente pode descargar datos do servidor e mostralos na pantalla.

3c. Editando o ficheiro Docker

Como no caso do servidor, creamos un sinxelo Dockerfile, responsable de crear o ambiente no que se executará a aplicación cliente de Python. Aquí está o código do cliente Dockerfile:

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

FROM python:latest

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

ADD client.py /client/

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

WORKDIR /client/

▍4. Docker Compose

Como xa verás, creamos dous proxectos diferentes: un servidor e un cliente. Cada un deles ten o seu propio arquivo Dockerfile. Ata agora, todo o que pasou non foi máis aló dos conceptos básicos de traballar con Docker. Agora comezamos con Docker Compose. Para iso, imos ao ficheiro docker-compose.yml, situado no cartafol raíz do proxecto.

Teña en conta que aquí non intentamos cubrir absolutamente todos os comandos que se poden usar docker-compose.yml. O noso obxectivo principal é percorrer un exemplo práctico que che proporcionará os coñecementos básicos de Docker Compose.

Aquí está o código para poñer no ficheiro 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. Construíndo o proxecto

Despois en docker-compose.yml Introducíronse todas as instrucións necesarias, o proxecto debe ser montado. Este paso do noso traballo é semellante ao uso do comando docker build, pero o comando correspondente é relevante para varios servizos:

$ docker-compose build

▍6. Posta en marcha do proxecto

Agora que o proxecto está montado, é o momento de poñelo en marcha. Este paso do noso traballo corresponde ao paso no que, cando se traballa con contedores individuais, se executa o comando docker run:

$ docker-compose up

Despois de executar este comando, o texto descargado polo cliente do servidor debería aparecer no terminal: Docker-Compose is magic!.

Como xa se mencionou, o servidor usa o porto do ordenador 1234 para atender as solicitudes dos clientes. Polo tanto, se vai ao enderezo no seu navegador http://localhost:1234/, mostrará unha páxina con texto Docker-Compose is magic!.

Comandos útiles

Vexamos algúns comandos que poden resultar útiles ao traballar con Docker Compose.

Este comando permítelle deter e eliminar contedores e outros recursos creados polo comando docker-compose up:

$ docker-compose down

Este comando imprime os rexistros de servizo:

$ docker-compose logs -f [service name]

Por exemplo, no noso proxecto pódese usar desta forma: $ docker-compose logs -f [service name].

Usando este comando pode mostrar unha lista de contedores:

$ docker-compose ps

Este comando permítelle executar un comando nun contedor en execución:

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

Por exemplo, pode verse así: docker-compose exec server ls.

Este comando permítelle mostrar unha lista de imaxes:

$ docker-compose images

Resultados de

Analizamos os conceptos básicos para traballar coa tecnoloxía Docker Compose, cuxo coñecemento permitirá utilizar esta tecnoloxía e, se o desexa, comezar a estudala máis en profundidade. Aquí un repositorio co código do proxecto que miramos aquí.

Queridos lectores! Usas Docker Compose nos teus proxectos?

Guía para principiantes de Docker Compose

Fonte: www.habr.com

Engadir un comentario