Guía de Docker Compose para principiantes

El autor del artículo cuya traducción publicamos hoy dice que está destinado a aquellos desarrolladores que desean aprender Docker Compose y están en camino de crear su primera aplicación cliente-servidor utilizando Docker. Se supone que el lector de este material está familiarizado con los fundamentos de Docker. Si no es así, puede echar un vistazo a esto la serie de materiales en esto la publicación donde se abordan los fundamentos de Docker junto con los de Kubernetes, y a esto un artículo para principiantes.

Guía de Docker Compose para principiantes

¿Qué es Docker Compose?

Docker Compose es una herramienta que forma parte de Docker. Está diseñada para abordar tareas relacionadas con el despliegue de proyectos.

Al aprender los fundamentos de Docker, es posible que te hayas encontrado con la creación de aplicaciones simples que funcionan de forma independiente, sin depender, por ejemplo, de fuentes de datos externas o de ciertos servicios. Sin embargo, en la práctica, este tipo de aplicaciones es raro. Los proyectos reales suelen incluir un conjunto de aplicaciones que trabajan juntas.

¿Cómo saber si necesitas utilizar Docker Compose al desplegar un proyecto? En realidad, es muy sencillo. Si para el funcionamiento de este proyecto se utilizan varios servicios, entonces Docker Compose puede serte útil. Por ejemplo, en una situación en la que se crea un sitio web que necesita conectarse a una base de datos para realizar la autenticación de usuarios. Dicho proyecto puede constar de dos servicios: uno que asegura el funcionamiento del sitio y otro que se encarga de mantener la base de datos.

La tecnología Docker Compose, en términos simples, permite lanzar múltiples servicios con un solo comando.

La diferencia entre Docker y Docker Compose

Docker se utiliza para gestionar contenedores individuales (servicios) de los cuales consta una aplicación.

Docker Compose se utiliza para gestionar simultáneamente varios contenedores que forman parte de una aplicación. Esta herramienta ofrece las mismas capacidades que Docker, pero permite trabajar con aplicaciones más complejas.

Guía de Docker Compose para principiantes
Docker (contenedor individual) y Docker Compose (varios contenedores)

Escenario típico de uso de Docker Compose

Docker Compose es, en manos hábiles, una herramienta muy poderosa que permite desplegar aplicaciones con arquitecturas complejas de forma muy rápida. Ahora vamos a ver un ejemplo práctico de uso de Docker Compose, cuyo desglose te permitirá apreciar las ventajas que ofrece utilizar Docker Compose.

Imagina que eres el desarrollador de un proyecto web. Este proyecto incluye dos sitios web. El primero permite a los empresarios crear, con solo unos clics, tiendas en línea. El segundo está destinado al soporte al cliente. Estos dos sitios interactúan con una misma base de datos.

Tu proyecto se vuelve cada vez más popular y resulta que la capacidad del servidor en el que se ejecuta ya no es suficiente. Como resultado, decides trasladar todo el proyecto a otra máquina.

Desafortunadamente, no has utilizado algo como Docker Compose. Por lo tanto, tendrás que trasladar y reconfigurar los servicios uno por uno, esperando no olvidar nada en el proceso.

Si utilizas Docker Compose, trasladar tu proyecto a un nuevo servidor es simplemente una cuestión que se resuelve ejecutando unos pocos comandos. Para finalizar la migración del proyecto a su nuevo lugar, solo necesitas realizar algunas configuraciones y cargar en el nuevo servidor una copia de seguridad de la base de datos.

Desarrollo de una aplicación cliente-servidor utilizando Docker Compose

Ahora que sabes para qué vamos a utilizar Docker Compose, es hora de crear tu primera aplicación cliente-servidor utilizando esta herramienta. En concreto, se trata de desarrollar un pequeño sitio web (servidor) en Python que pueda entregar un archivo con un fragmento de texto. Este archivo es solicitado por un programa (cliente), también escrito en Python. Después de recibir el archivo del servidor, el programa muestra el texto que contiene en la pantalla.

Ten en cuenta que asumimos que posees los conocimientos básicos de Docker y que ya tienes instalada la plataforma Docker.

Comencemos a trabajar en el proyecto.

▍1. Creación del proyecto

Para construir tu primera aplicación cliente-servidor, te propongo comenzar creando la carpeta del proyecto. Debe contener los siguientes archivos y carpetas:

  • Archivo docker-compose.ymlEste es un archivo Docker Compose que contendrá las instrucciones necesarias para iniciar y configurar los servicios.
  • Carpeta servidorContendrá los archivos necesarios para el funcionamiento del servidor.
  • Carpeta clientAquí estarán los archivos de la aplicación cliente.

Como resultado, el contenido de la carpeta principal de tu proyecto debe verse así:

.
├── client/
├── docker-compose.yml
└── server/
2 directorios, 1 archivo

▍2. Creación del servidor

Aquí, en el proceso de creación del servidor, tocamos algunas cosas básicas relacionadas con Docker.

2a. Creación de archivos

y ejecuta la aplicación con el siguiente comando: servidor y crea los siguientes archivos en él:

  • Archivo server.pyEn él estará el código del servidor.
  • Archivo index.htmlEn este archivo habrá un fragmento de texto que debe ser mostrado por la aplicación cliente.
  • Archivo DockerfileEste es un archivo Docker que contendrá las instrucciones necesarias para crear el entorno del servidor.

Así debe verse el contenido de tu carpeta server/:

.
├── Dockerfile
├── index.html
└── server.py
0 directorios, 3 archivos

2b. Edición del archivo Python.

Agregaremos al archivo server.py el siguiente 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 permite crear un servidor web simple. Devolverá a los clientes el archivo index.html, cuyo contenido posteriormente se mostrará en la página web.

2c. Edición del archivo HTML

Al archivo index.html agregamos el siguiente texto:

¡Docker-Compose es magia!

Este texto será enviado al cliente.

2d. Edición del archivo Dockerfile

Ahora crearemos un archivo simple Dockerfile, que se encargará de organizar el entorno de ejecución para el servidor Python. Usaremos como base la imagen oficial, diseñada para ejecutar programas escritos en Python. Este es el contenido del 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/

Ahora nos ocuparemos del trabajo en el cliente.

▍3. Creación del cliente

Al crear la parte del cliente de nuestro proyecto, recordaremos algunas bases de Docker.

3a. Creación de archivos

Ve a la carpeta de tu proyecto client y crea los siguientes archivos en él:

  • Archivo client.py. Aquí estará el código del cliente.
  • Archivo Dockerfile. Este archivo cumple la misma función que el archivo correspondiente en la carpeta del servidor. Es decir, contiene la instrucción que describe la creación del entorno para ejecutar el código del cliente.

Como resultado, tu carpeta client/ en esta etapa de trabajo debe verse así:

.
├── client.py
└── Dockerfile
0 directorios, 2 archivos

3b. Edición del archivo Python

Agregaremos al archivo client.py el siguiente 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()

Gracias a este código, la aplicación cliente puede cargar datos del servidor y mostrarlos en pantalla.

3c. Edición del archivo Dockerfile

Al igual que con el servidor, estamos creando un archivo simple para el cliente. Dockerfile, responsable de crear el entorno en el que funcionará la aplicación cliente de Python. Aquí está el código del cliente. Dockerfile:

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

FROM python:latest

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

ADD client.py /client/

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

WORKDIR /client/

▍4. Docker Compose

Como habrás notado, hemos creado dos proyectos diferentes: el servidor y el cliente. Cada uno de ellos tiene su propio archivo Dockerfile. Hasta ahora, todo lo que hemos hecho no ha salido del ámbito de las funciones básicas de Docker. Ahora comenzamos a trabajar con Docker Compose. Para esto, consultaremos el archivo docker-compose.yml, ubicado en la carpeta raíz del proyecto.

Ten en cuenta que no intentamos revisar todos los comandos que se pueden usar en docker-compose.yml. Nuestro objetivo principal es desglosar un ejemplo práctico que te brinde conocimientos básicos sobre Docker Compose.

Aquí está el código que debes colocar en el archivo 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. Construcción del proyecto

Una vez que se hayan ingresado todas las instrucciones necesarias en docker-compose.yml , el proyecto debe ser construido. Este paso en nuestro trabajo es similar al uso del comando docker build, pero el comando correspondiente se refiere a varios servicios:

$ docker-compose build

▍6. Ejecución del proyecto

Ahora que el proyecto está construido, es hora de ejecutarlo. Este paso en nuestro trabajo corresponde al paso en el que, al trabajar con contenedores individuales, se ejecuta el comando docker run:

$ docker-compose up

Después de ejecutar este comando, el texto cargado por el cliente desde el servidor debería aparecer en la terminal: ¡Docker-Compose es magia!.

Como ya se mencionó, el servidor utiliza el puerto de la computadora 1234 para atender las solicitudes del cliente. Por lo tanto, si accedes en el navegador a la dirección http://localhost:1234/, se mostrará una página con el texto ¡Docker-Compose es magia!.

Comandos útiles

Veamos algunos comandos que pueden resultarte útiles al trabajar con Docker Compose.

Este comando permite detener y eliminar contenedores y otros recursos creados por el comando docker-compose up:

$ docker-compose down

Este comando muestra los registros de los servicios:

$ docker-compose logs -f [nombre del servicio]

Por ejemplo, en nuestro proyecto, se puede usar de la siguiente manera: $ docker-compose logs -f [nombre del servicio].

Con este comando, puedes mostrar una lista de contenedores:

$ docker-compose ps

Este comando permite ejecutar un comando en un contenedor en ejecución:

$ docker-compose exec [nombre del servicio] [comando]

Por ejemplo, podría verse así: docker-compose exec server ls.

Este comando permite mostrar una lista de imágenes:

$ docker-compose images

Resultados

Hemos cubierto los fundamentos del uso de la tecnología Docker Compose, cuyo conocimiento te permitirá utilizar esta tecnología y, si lo deseas, comenzar un estudio más profundo de ella. Aquí repositorio con el código del proyecto que hemos estado considerando aquí.

¡Estimados lectores! ¿Usas Docker Compose en tus proyectos?

Guía de Docker Compose para principiantes

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster