Guía de composición de Docker para principiantes

El autor del artículo, que publicamos hoy, dice que está dirigido a aquellos desarrolladores que quieren aprender Docker Compose y están en camino de crear su primera aplicación cliente-servidor usando Docker. Se supone que el lector de este material está familiarizado con los conceptos básicos de Docker. Si no es así, puedes echar un vistazo a este serie de materiales este una publicación que cubre los conceptos básicos de Docker junto con los conceptos básicos de Kubernetes, y este artículo para principiantes.

Guía de composición de Docker para principiantes

¿Qué es Docker Compose?

Docker Compose es una herramienta incluida con Docker. Está diseñado para resolver problemas relacionados con el despliegue de proyectos.

Mientras aprende los conceptos básicos de Docker, es posible que se haya topado con la creación de aplicaciones simples que funcionan de forma autónoma, sin depender, por ejemplo, de fuentes de datos externas o de ciertos servicios. En la práctica, tales aplicaciones son raras. Los proyectos reales suelen implicar un conjunto completo de aplicaciones colaborativas.

¿Cómo sabe si necesita usar Docker Compose al implementar un proyecto? En realidad, es muy simple. Si está utilizando varios servicios para ejecutar este proyecto, entonces Docker Compose podría ser útil. Por ejemplo, en una situación en la que crea un sitio web que, para realizar la autenticación de usuario, necesita conectarse a una base de datos. Dicho proyecto puede constar de dos servicios: uno que garantiza el funcionamiento del sitio y otro que es responsable de respaldar la base de datos.

La tecnología Docker Compose, si la describe de manera simplificada, le permite iniciar muchos servicios con un solo comando.

Diferencia entre Docker y Docker Compose

Docker se utiliza para administrar los contenedores individuales (servicios) que componen una aplicación.

Docker Compose se utiliza para administrar varios contenedores que forman parte de una aplicación al mismo tiempo. Esta herramienta ofrece las mismas funciones que Docker, pero te permite trabajar con aplicaciones más complejas.

Guía de composición de Docker para principiantes
Docker (contenedor único) y Docker Compose (múltiples contenedores)

Caso de uso típico de Docker Compose

Docker Compose es, en las manos adecuadas, una herramienta muy poderosa que le permite implementar rápidamente aplicaciones con arquitecturas complejas. Ahora veremos un ejemplo del uso práctico de Docker Compose, cuyo análisis te permitirá evaluar los beneficios que te dará el uso de 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 unos pocos clics, tiendas online. El segundo está dirigido a la atención al cliente. Estos dos sitios interactúan con la misma base de datos.

Tu proyecto es cada vez más popular y resulta que la capacidad del servidor en el que trabaja ya no es suficiente. Como resultado, decide transferir todo el proyecto a otra máquina.

Desafortunadamente, no has usado algo como Docker Compose. Por lo tanto, deberá migrar y reconfigurar los servicios uno a la vez, con la esperanza de no olvidar nada en el proceso de este trabajo.

Si está utilizando Docker Compose, migrar su proyecto a un nuevo servidor es un problema que puede resolverse ejecutando algunos comandos. Para completar la transferencia del proyecto a una nueva ubicación, solo necesita realizar algunos ajustes y cargar una copia de seguridad de la base de datos en el nuevo servidor.

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

Ahora que sabe para qué vamos a usar Docker Compose, es hora de crear su primera aplicación cliente/servidor con esta herramienta. Es decir, estamos hablando del desarrollo de un pequeño sitio web (servidor) en Python, que puede producir un archivo con un fragmento de texto. Este archivo es solicitado al servidor por un programa (cliente), también escrito en Python. Después de recibir el archivo del servidor, el programa muestra el texto almacenado en él en la pantalla.

Tenga en cuenta que asumimos que tiene los conceptos básicos de Docker y que ya tiene instalada la plataforma Docker.

Empecemos a trabajar en el proyecto.

▍1. crear un proyecto

Para construir su primera aplicación cliente/servidor, le sugiero que comience creando una carpeta de proyecto. Debe contener los siguientes archivos y carpetas:

  • Expediente docker-compose.yml. Este es un archivo de Docker Compose que contendrá las instrucciones necesarias para iniciar y configurar los servicios.
  • Carpeta server. Contendrá los archivos necesarios para que el servidor funcione.
  • Carpeta client. Aquí es donde se ubicarán los archivos de la aplicación del cliente.

Como resultado, el contenido de la carpeta principal de su proyecto debería verse así:

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

▍2. Creación del servidor

Aquí, en el proceso de creación de un servidor, tocaremos algunas cosas básicas con respecto a Docker.

2a. Creación de archivos

Ir a la carpeta server y crea los siguientes archivos en él:

  • Expediente server.py. Contendrá el código del servidor.
  • Expediente index.html. Este archivo contendrá un fragmento de texto que la aplicación cliente debería mostrar.
  • Expediente Dockerfile. Este es el archivo Docker que contendrá las instrucciones necesarias para crear el entorno del servidor.

Así es como debería verse el contenido de su carpeta server/:

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

2b. Edición de un archivo Python.

Agregar 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 le permite crear un servidor web simple. Él le dará a los clientes un archivo. index.html, cuyo contenido se mostrará posteriormente en la página web.

2c. Edición de un archivo HTML

Archivar index.html agrega el siguiente texto:

Docker-Compose is magic!

Este texto será enviado al cliente.

2d. Edición del Dockerfile

Ahora vamos a crear un archivo simple Dockerfile, que será responsable de organizar el entorno de tiempo de ejecución para el servidor de Python. Como base de la imagen creada, usaremos de manera oficial, diseñado para ejecutar programas escritos en Python. Aquí está 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 trabajemos en el cliente.

▍3. crear un cliente

Mientras creamos el lado del cliente de nuestro proyecto, recordaremos algunos conceptos básicos de Docker en el camino.

3a. Creación de archivos

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

  • Expediente client.py. Aquí es donde estará el código del cliente.
  • Expediente Dockerfile. Este archivo juega el mismo papel que un archivo similar en la carpeta del servidor. Es decir, contiene una declaración que describe cómo crear un entorno para ejecutar el código del cliente.

Como resultado, su carpeta client/ En esta etapa debería verse así:

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

3b. Edición de un archivo de Python

Agregar 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 descargar datos del servidor y mostrarlos en la pantalla.

3c. Edición del Dockerfile

Como en el caso del servidor, creamos para el cliente un simple Dockerfile, responsable de dar forma al entorno en el que se ejecutará la aplicación cliente de Python. Aquí está el código de cliente Dockerfile:

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

FROM python:latest

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

ADD client.py /client/

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

WORKDIR /client/

▍4. Componer ventana acoplable

Como puede ver, hemos creado dos proyectos diferentes: servidor y cliente. Cada uno de ellos tiene su propio archivo. Dockerfile. Hasta ahora, todo lo que sucede no va más allá de lo básico de trabajar con Docker. Ahora nos ponemos a trabajar con Docker Compose. Para ello, consulte el archivo docker-compose.ymlubicado en la carpeta raíz del proyecto.

Tenga en cuenta que aquí no pretendemos cubrir absolutamente todos los comandos que se pueden usar en docker-compose.yml. Nuestro objetivo principal es desglosar un ejemplo práctico que le brinde un conocimiento básico de Docker Compose.

Aquí está el código para poner 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

después de en docker-compose.yml se han hecho todas las instrucciones necesarias, el proyecto necesita ser ensamblado. Este paso de nuestro trabajo se parece al uso del comando docker build, pero el comando correspondiente está relacionado con varios servicios:

$ docker-compose build

▍6. Lanzamiento del proyecto

Ahora que el proyecto está construido, es hora de ejecutarlo. Este paso de nuestro trabajo corresponde al paso en el que, cuando se trabaja 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 is magic!.

Como ya se mencionó, el servidor usa el puerto de la computadora 1234 para atender las solicitudes de los clientes. Por lo tanto, si vas en el navegador a la dirección http://localhost:1234/, mostrará una página con texto Docker-Compose is magic!.

Comandos útiles

Echemos un vistazo a algunos de los comandos que pueden resultarle útiles cuando trabaje con Docker Compose.

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

$ docker-compose down

Este comando imprime los registros del servicio:

$ docker-compose logs -f [service name]

Por ejemplo, en nuestro proyecto se puede utilizar de esta forma: $ docker-compose logs -f [service name].

Con este comando, puede mostrar una lista de contenedores:

$ docker-compose ps

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

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

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

Este comando le permite mostrar una lista de imágenes:

$ docker-compose images

resultados

Hemos cubierto los conceptos básicos del trabajo con la tecnología Docker Compose, cuyo conocimiento le permitirá utilizar esta tecnología y, si lo desea, comenzar a estudiarla con mayor profundidad. aquí está repositorio con el código del proyecto, que consideramos aquí.

Estimados lectores! ¿Usas Docker Compose en tus proyectos?

Guía de composición de Docker para principiantes

Fuente: habr.com

Añadir un comentario