GNU/Linux >> Tutoriales Linux >  >> Panels >> Docker

Todo lo que necesita saber sobre el uso de Docker Compose

Si se pregunta cómo crear contenedores Docker reproducibles con Docker Compose, ha venido al lugar correcto. En este tutorial paso a paso de Docker Compose, aprenderá cómo crear contenedores simples, asignar puertos con Docker Compose hasta escenarios complejos de varios contenedores.

¿Estás listo? ¡Vamos a profundizar!

Requisitos

Si desea seguir paso a paso, en este tutorial, asegúrese de tener lo siguiente:

  1. Una instalación nueva de Ubuntu Server LTS con SSH habilitado . Esta guía utilizará Ubuntu Server LTS 20.04.1 como máquina host de Docker.
  2. Una computadora con VS Code instalado (opcional). Esta guía usará Visual Studio Code 1.52.1 para SSH al host de Docker y ejecutará comandos.
  3. La extensión SSH oficial de VS Code instalada y conectado al host Docker. (opcional)

¿Qué es Docker Compose?

Los comandos individuales pueden ser muy largos en Docker. Tome el siguiente como ejemplo. Este ejemplo crea un contenedor para una aplicación de software llamada pila de libros.

docker create \
   --name=bookstack \
   -e PUID # UID of user to take ownership of application/files \
   -e PGID # GID of user to take ownership of application/files \
   -e DB_USER # The database user \
   -e DB_PASS # The database password \
   -e DB_HOST # The database host \
   -e DB_DATABASE # The database to be used \
   -e APP_URL # The url your application will be accessed on (required for correct operation of reverse proxy) \
   -v /host/path/to/config:/config # Location of any uploaded data \
   -p 80:80/tcp # Web UI port \
   --restart unless-stopped \
   linuxserver/bookstack:version-v0.31.4

A medida que aumenta la complejidad de un entorno docker, también aumenta la cantidad de indicadores y condiciones necesarios para la configuración de un contenedor en funcionamiento. La línea de comandos de Docker comienza a volverse engorrosa y difícil de solucionar; especialmente una vez que las configuraciones de múltiples contenedores comienzan a entrar en la mezcla.

Docker Compose es una forma de crear contenedores Docker reproducibles usando un archivo de configuración en lugar de comandos Docker extremadamente largos. Al usar un archivo de configuración estructurado, los errores son más fáciles de detectar y las interacciones del contenedor son más fáciles de definir.

Docker Compose rápidamente se vuelve invaluable cuando se trata de dependencias de contenedores o entornos de múltiples contenedores.

Docker Compose es una forma fantástica de ingresar a la infraestructura como código sin la complejidad de los sistemas distribuidos como Kubernetes.

Docker Compose usa una estructura de archivo de configuración llamada YAML . YAML es similar a JSON o HTML en que YAML es un lenguaje estructurado y legible por máquina. YAML se enfoca específicamente en ser lo más legible posible para los humanos mientras mantiene ese poder estructurado.

YAML tiene un inconveniente en el que las pestañas y otros espacios en blanco son significativos y deben formatearse correctamente. VS Code hace gran parte de este arduo trabajo por usted y también es la razón por la que verá muchos de los ejemplos que se realizan en VS Code.

Instalación de Docker Compose

Empecemos ahora a ensuciarse las manos. Suponiendo que esté conectado a su host Docker, es hora de instalar Docker Compose.

Docker Compose es un paquete separado del tiempo de ejecución de Docker. Pero instalar Docker Compose también instalará el tiempo de ejecución de Docker, ¡así que matará dos pájaros de un tiro!

Para instalar Docker Compose y el tiempo de ejecución de Docker, ejecute los siguientes dos comandos.

# update the software list (known as a repository) and then install docker compose
# with any needed dependencies. the -y flag is used to skip confirmation
sudo apt update -y
sudo apt install docker-compose -y

Una vez instalado, ahora debe crear una estructura de carpetas para almacenar contenedores.

Creación de una estructura de carpetas para Docker Compose

Antes de poder crear un contenedor con Docker Compose, primero debe crear una carpeta para almacenar contenedores. No solo debe crear una estructura de carpetas para almacenar contenedores, sino que encontrará que varios comandos de Docker son sensibles a la ubicación de varios archivos de configuración; Docker Compose no es diferente.

El componente más importante de Docker Compose es su archivo de configuración llamado docker-compose.yaml . Este archivo de configuración, como se explicó anteriormente, dicta cómo el tiempo de ejecución de Docker debe construir un contenedor.

Cuando ejecuta Docker Compose, el comando buscará su archivo de configuración en la misma carpeta donde se ejecuta el comando. Debido a este requisito, siempre es mejor crear una carpeta separada cuando se ejecuta Docker Compose.

Solo puede haber un archivo de configuración de Docker Compose por carpeta.

Para demostrar la creación de un contenedor Docker con Docker Compose, primero cree una estructura de carpetas para almacenar el futuro contenedor y su archivo de configuración usando un pequeño servidor de archivos llamado Caddy.

Caddie es un servidor de archivos, similar a apache httpd o nginx , pero escrito en el idioma Go. Caddy está diseñado específicamente para facilitar su uso (y generará o entregará automáticamente un archivo index.html) sin necesidad de configuración. Esta combinación hace que el caddie sea una buena opción para los principiantes.

Suponiendo que haya iniciado sesión en su host Docker, cree la estructura de carpetas de la siguiente manera:

  1. En su directorio de inicio, cree una carpeta llamada contenedores . Esta carpeta será un buen marcador de posición para este y otros contenedores.
  2. Dentro de los contenedores carpeta, cree una subcarpeta llamada caddy . Esta carpeta contendrá el archivo de configuración de Docker Compose y el propio contenedor Caddy.
  3. Finalmente, dentro de la carpeta del contenedor, caddy, cree un archivo de texto en blanco llamado docker-compose.yaml que se convertirá en el archivo de configuración de Docker Compose.

Con la estructura de carpetas y el archivo de configuración de Docker Compose creados, ahora puede comenzar a completar ese archivo de configuración con una configuración de Docker Compose.

Creación de un archivo de configuración de Docker Compose

En su forma más básica, un docker-compose.yaml El archivo para el contenedor de caddy tiene el siguiente aspecto. En su editor de texto Linux favorito o con VS Code, copie y pegue el siguiente código en el archivo de configuración de Docker Compose creado anteriormente.

version: "3.7"
services:
  caddy:
    container_name: "caddy"
    image: "caddy:latest"
    ports:
      - "80:80"

Repasemos cada una de las opciones que se muestran:

  • version especifica la versión del archivo docker-compose. Cada nueva definición de Docker Compose incluye cambios importantes en la especificación. Por lo tanto, la versión es importante para que Docker Compose pueda saber qué características necesita usar. La versión 3.7 es la última versión compatible con Ubuntu 20.04.1 LTS.

La especificación completa de Docker Compose 3.x se puede encontrar aquí. La documentación vinculada menciona todas las opciones que puede usar dentro de Docker Compose

  • services contienen las especificaciones para los contenedores reales. Puede definir varios contenedores en esta sección.
  • caddy es el nombre del primer contenedor (esto es puramente como referencia).
  • container_name define el nombre real dado al contenedor por Docker y debe ser único.
  • image es el nombre de la imagen. En este caso, caddie desde el Docker Hub se define. El nombre o número después de la etiqueta separados por dos puntos es la versión.

Asignación de puertos

Esa última opción en particular requiere una mención especial:

ports:
  - "80:80"

En Docker Compose, los ports La directiva le permite establecer una o más asignaciones desde el host al contenedor. Por ejemplo, arriba ha mapeado el puerto 80 en el host al puerto 80 en el contenedor Sin embargo, no es necesario que coincida con el número de puerto. El siguiente ejemplo asigna el puerto 8800 en el host al puerto 80 en el contenedor.

ports:
  - "8800:80"

También puede definir múltiples puertos como se muestra a continuación.

ports:
  - "80:80"
  - "443:443"

Al hacerlo, se asignarían ambos puertos 80 y 443 al host (una configuración común para servidores web, para servir tanto HTTP como HTTPS).

El creador de imágenes de Docker define los puertos disponibles en el momento de la creación. Asegúrese de consultar la documentación de la imagen con la que está trabajando en Docker Hub o en el sitio web del mantenedor para conocer los puertos asignables. ¡No tiene sentido mapear un puerto si el puerto no está en uso!

Con eso en mente, echemos un vistazo a la ejecución real del contenedor.

Ejecución del contenedor

A estas alturas ya deberías tener docker-compose.yaml archivo dentro de su ~\containers\caddy carpeta. Ahora es el momento de crear e iniciar el contenedor Caddy.

En su terminal, ejecute el siguiente comando que mostrará los contenedores Docker definidos en docker-compose.yaml archivo.

# This command must be run in the same folder as the file. The -d flag runs
# the command *detached*, which will bring up the container in the background
sudo docker-compose up -d

Puede notar que no tuvo que especificar la ubicación del archivo docker-compose.yaml al ejecutar sudo docker-compose up -d . Docker Compose espera que ejecute todos los comandos dentro de la carpeta que contiene el archivo docker-compose.yaml, ya que muchos comandos están relacionados con esa carpeta.

Ahora verifique que el contenedor esté funcionando navegando a http:// . Esta guía utiliza http://homelab-docker como referencia.

Puede ver que este procesamiento ocurre en VS Code mientras se conecta mediante SSH al host de Docker en la siguiente animación:

¡Éxito! Ahora ha utilizado con éxito Docker Compose para iniciar un contenedor desde un archivo de configuración. Con ese primer paso importante dado, veamos cómo administra el estado de su contenedor.

Comandos para administrar contenedores separados

En la sección anterior, comenzaste el contenedor de caddy usando -d bandera. Al hacerlo, se ejecutó un contenedor en un separado Expresar. Cuando un contenedor está en un estado separado, el contenedor continuará ejecutándose en segundo plano. Pero esto plantea un problema:¿cómo gestionas ese contenedor si ya no tienes el control directo?

Para resolver este problema, Docker Compose tiene una serie de comandos que administrarán los contenedores iniciados con un docker-compose.yaml archivo:

  • docker-compose restart se utiliza para reiniciar un contenedor que se está ejecutando actualmente. Hacerlo es diferente de volver a ejecutar docker-compose up -d . El comando de reinicio simplemente reiniciará un contenedor existente, vuelva a ejecutar docker-compose up -d y vuelva a crear el contenedor desde cero (si se ha cambiado el archivo de configuración).
  • docker-compose stop detendrá un contenedor en ejecución sin destruir el contenedor. Del mismo modo, docker-compose start iniciará el contenedor de nuevo.
  • docker-compose down detendrá los contenedores en ejecución y también los destruirá . Aquí es donde entra en juego la vinculación de montajes de volúmenes (lea más a continuación).
  • docker-compose pull extraerá la versión actual de la imagen (o imágenes) de la ventana acoplable del repositorio. Si usa el latest puede seguir con docker-compose down && sudo docker-compose up -d para reemplazar el contenedor con la última versión. Usando docker-compose pull es una forma conveniente de actualizar los contenedores rápidamente con un tiempo de inactividad mínimo.
  • docker-compose logs mostrará los registros del contenedor en ejecución (o detenido). También puede abordar contenedores individuales (si hay varios contenedores definidos en el archivo de composición) con docker-compose logs <container name> .

Se puede ver una lista completa de comandos de docker-compose ejecutando docker-compose sin argumentos adicionales o referenciados aquí en la documentación.

Ahora que tiene un contenedor en ejecución, veamos cómo usar el contenido guardado localmente en su máquina.

Creación de montajes de enlace en Docker Compose

Atar monturas son cómo Docker asigna datos de usuario importantes al almacenamiento local en su servidor. Para comenzar, genere algo de contenido para que el contenedor lo aloje:

  1. En el host de Docker, dentro del ~/containers/caddy carpeta cree una nueva carpeta llamada archivos .

2. Cree un nuevo archivo llamado index.html dentro del ~/containers/caddy carpeta que se ve a continuación. Esta será la página principal que servirá el servidor web Caddy.

<body><h2>hello world!</h2></body>

3. Modifique su archivo de configuración de Docker Compose para que se vea como se muestra a continuación. El archivo de ejemplo a continuación agrega los volumes sección y apuntando un montaje de enlace a los archivos carpeta recién creada para que esté disponible para el contenedor.

version: "3.7" services: caddy: container_name: "caddy" image: "caddy:latest" ports: - "80:80" volumes: #the ./ refers a folder relative to the docker-compose file - "./files:/usr/share/caddy"

4. Ejecute docker-compose up -d otra vez. Docker Compose ahora reconocerá que el archivo ha sido modificado y volverá a crear su contenedor.

5. Navegue a la página del contenedor con un navegador y ahora debería ver que está sirviendo el mensaje "¡Hola mundo!" página.

Puede ver lo siguiente en la siguiente animación:

¡Ahora está alojando contenido almacenado localmente en su máquina! Sin embargo, ¿qué sucede si su contenido está en una fuente externa como un recurso compartido de red?

Uso de Docker Compose con Docker Volumes

Una vez que cree un contenedor simple con Docker Compose, probablemente necesitará ese contenedor para acceder a los archivos en otro lugar, tal vez en un recurso compartido de red. Si es así, puede configurar el contenedor para usar volúmenes de Docker directamente en su archivo de configuración de Docker Compose.

Para fines de demostración, esta guía creará un servidor Network File Share (NFS) en el host Docker. Servir contenido local como un montaje NFS no tiene ningún propósito práctico fuera de la demostración. Si tuviera que montar un volumen NFS, generalmente será de una fuente externa como un NAS o un servidor remoto.

Configurar un recurso compartido NFS

Si aún no tiene configurado un recurso compartido NFS, cree uno ahora en el host de Docker para este tutorial. Para hacerlo:

  1. Instalar el servidor NFS paquete ejecutando apt install nfs-kernel-server -y .

2. Agregue el contenedor como una exportación NFS (similar a un recurso compartido CIFS de Windows) ejecutando lo siguiente.

# Add a line to the /etc/exports config file to create a NFS share for # /home/homelab/containers. This share is only exposed to localhost (to # prevent other computers from having access) echo '/home/homelab/containers localhost(rw,sync,no_root_squash,no_subtree_check)' | sudo tee -a /etc/exports # Restart the NFS server with the new config sudo systemctl restart nfs-kernel-server

3. Ahora verifique que el host exponga el recurso compartido NFS ejecutando showmount -e localhost . Este comando mostrará los recursos compartidos de NFS actualmente expuestos y quién tiene acceso.

En la siguiente captura de pantalla, puede ver /home/homelab/containers está expuesto, pero solo a la computadora host local (que es el mismo servidor que ejecuta el host Docker).

Si ve la carpeta /home//containers en la salida, se configura el recurso compartido NFS.

Definir un volumen con nombre de Docker

Una vez que haya creado el recurso compartido NFS, ahora debe decirle a Docker cómo acceder a ese recurso compartido. Con Docker Compose, puede hacerlo definiendo un volumen con nombre en el archivo de configuración de Docker Compose.

Un volumen con nombre es una forma en que Docker abstrae recursos compartidos de archivos basados ​​en la red. El uso compartido de archivos de red viene en todo tipo de formas y tamaños en estos días:recursos compartidos de CIFS (Windows), recursos compartidos de NFS (Linux), cubos de AWS S3 y más. Al crear un Volumen con nombre, Docker hace la parte difícil de descubrir cómo comunicarse con el recurso compartido de red y permite que el contenedor trate el recurso compartido como si fuera un almacenamiento local.

Para crear un volumen con nombre:

  1. Abra el archivo de configuración de Docker Compose (docker-compose.yaml ). Si lo sigue, el archivo debe estar ubicado en ~/containers/caddy carpeta.

2. Dentro del archivo de configuración de Docker Compose, agregue un volumes sección después de services sección. Su archivo de configuración debería ser como el siguiente. Los volumes crea un volumen con nombre llamado MyWebsite . Dentro de ese volumen con nombre, se especifican los parámetros necesarios (como IP, configuración de NFS y ruta). Los volumes parámetro dentro de los services La sección también se modifica para señalar el nombre del volumen en lugar de una carpeta local.

version: "3.7"
 services:
   caddy:
     container_name: "caddy"
     image: "caddy:latest"
     ports:
       - "80:80"
     volumes:
       - "MyWebsite:/usr/share/caddy"
 volumes:
   MyWebsite:
     driver_opts:
       type: "nfs"
       o: "addr=localhost,nolock,soft,rw"
       device: ":/home/homelab/containers/caddy/files"

3. Una vez que haya definido el volumen con nombre que apunta al recurso compartido NFS en el archivo de configuración de Docker Compose, ejecute docker-compose up -d para crear e iniciar el contenedor. Si todo va bien, el contenedor y el sitio web deberían volver a funcionar.

4. Navegue a la página del contenedor nuevamente. El index.html el contenido debe aparecer como si el archivo se estuviera montando localmente. Sin embargo, ese archivo se monta a través del servidor NFS configurado en la red.

Dado que ahora puede montar volúmenes Docker externos en Docker Compose, ahora puede traer todo tipo de almacenamiento de red a sus contenedores. Sin embargo, Docker Compose puede hacer más que simplemente definir contenedores o volúmenes individuales. Profundicemos en escenarios más complejos de varios contenedores.

Este tutorial ya no usará el contenedor caddy, por lo que puede eliminar el contenedor usando docker-compose down .

Definir varios contenedores en Docker Compose

La mayoría de los contenedores Docker no funcionan dentro de una aspiradora. Los contenedores de Docker suelen tener dependencias de servicio como bases de datos o servicios web separados que se comunican a través de una API.

Con Docker Compose, puede agrupar contenedores definidos en un solo archivo. Al definir varios contenedores en un solo archivo, los contenedores pueden comunicarse entre servicios dependientes y simplificar la organización de diseños de contenedores complejos.

Para demostrar tal escenario, configuremos una aplicación wiki popular llamada BookStack .

BookStack es un popular software wiki conocido por su facilidad de uso y diseño jerárquico (a diferencia de un diseño plano, como mediawiki).

BookStack, como muchas aplicaciones web, requiere una base de datos independiente para funcionar correctamente, así como la información necesaria para comunicarse con la base de datos. Configurar tal situación es donde Docker Compose sobresale.

Crear el archivo de configuración de Docker Compose

BookStack no tiene una imagen de Docker mantenida internamente, sin embargo, linuxserver.io mantiene una imagen de Docker Hub respetable en nombre de BookStack. Si bien la documentación en el sitio de docker hub tiene un archivo de configuración de Docker Compose recomendado, este tutorial creará un nuevo archivo de configuración mientras explica los conceptos.

En el host de Docker:

  1. Primero, cree una carpeta para BookStack. Si siguió los tutoriales de la sección anterior, debería tener un ~/containers carpeta. Crea una carpeta llamada bookstack allí.

2. Luego, cree un archivo de configuración de Docker Compose en blanco llamado docker-compose.yaml dentro de la pila de libros carpeta.

3. Ahora abra el archivo de configuración de Docker Compose y defina dos contenedores:el bookstack contenedor y el bookstack_db (mariadb) contenedor.

version: "3.7"
 services:
   bookstack:
     container_name: "bookstack"
     image: "ghcr.io/linuxserver/bookstack"
     ports:
       - "8080:80"
     volumes:
       - "./files:/usr/share/caddy"
     depends_on:
       - "bookstack_db"
   bookstack_db:
     container_name: "bookstack_db"
     image: "mariadb"
     volumes:
       - "./db:/var/lib/mysql"

Hasta ahora, este docker-compose.yaml El archivo utiliza principalmente conceptos ya introducidos:tiene dos servicios (bookstack y bookstack_db ), tanto con imágenes como con montajes de enlace. El contenedor de la pila de libros tiene una asignación de puertos desde el puerto de host 8080 hasta el puerto interno 80.

Dada la sobrecarga extremadamente baja de los contenedores Docker, es una práctica común definir un contenedor de base de datos independiente para cada aplicación web. Si lo hace, permite una mayor separación de funciones. Esto es claramente diferente de las configuraciones de bases de datos tradicionales, donde una sola instalación de base de datos puede servir a cientos de aplicaciones web.

Una nueva opción que puede ver en el archivo anterior es depends_on dominio. Este comando le dice a Docker el orden en que deben comenzar los contenedores. Definición de depends_on El comando le dice a Docker que bookstack_db contenedor debe empezar primero.

Configuración de la comunicación del contenedor con variables de entorno

Este archivo de configuración creado en la última sección aún no está completo. Si bien ha definido dos servicios (contenedores), ¡no se comunican entre sí! La bookstack contenedor no tiene idea de cómo comunicarse con el bookstack_db envase. Resolvamos eso usando variables de entorno.

Las variables de entorno son la forma más común de proporcionar variables a los contenedores de Docker. Estas son variables dadas en tiempo de ejecución (o definidas en docker-compose.yaml archivo de configuración) para proporcionar información sobre lo que debe hacer el contenedor.

Las variables de entorno las define la persona que crea la imagen de Docker. Serán diferentes según la imagen de Docker que esté utilizando, y debe consultar la documentación del creador con respecto a qué variables de entorno usar.

Hay dos métodos para definir variables de entorno; directamente en docker-compose.yaml archivo en sí mismo o como un archivo separado.

Un archivo separado es, por lo general, el método recomendado, especialmente si las variables contienen datos confidenciales, como contraseñas. Un docker-compose.yaml El archivo está diseñado para compartirse o incluso cargarse en un repositorio público de GitHub. Tener un archivo separado para datos confidenciales reduce la posibilidad de una violación de seguridad accidental.

En el host de Docker, ahora cree dos variables de entorno; uno para la pila de libros contenedor y uno para el bookstack_db contenedor.

  1. Cree un archivo nuevo en ~/containers/bookstack carpeta llamada bookstack.env con el siguiente contenido:
APP_URL is the IP address or hostname of your server. This article is using homelab-docker
 APP_URL=http://homelab-docker:8080
 DB_HOST is the container name you gave your container
 DB_HOST=bookstack_db
 DB_USER is defined in the bookstack_DB environment file
 DB_USER=bookstack_user
 DB_PASS is also defined in the bookstack_DB environment file
 DB_PASS=MySecurePassword
 DB_DATABASE is the name of the database within mariadb
 DB_DATABASE=bookstack

2. Cree un nuevo archivo en ~/containers/bookstack carpeta llamada bookstack_db.env e incluir el siguiente contenido:

The root password for our database, keep it secret, keep it safe
 MYSQL_ROOT_PASSWORD=MySecureRootPassword
 The database bookstack will be using
 MYSQL_DATABASE=bookstack
 the user bookstack will be using
 MYSQL_USER=bookstack_user
 the password bookstack will be using
 MYSQL_PASSWORD=MySecurePassword

3. Como práctica recomendada, ahora asegúrese de que env otros usuarios no pueden leer los archivos.

chmod 600 bookstack.env bookstack_db.env

Debe cambiar el acceso de lectura porque los archivos bookstack.env y bookstack_db.env contienen datos confidenciales.

4. Actualice ~/containers/bookstack/docker-compose.yaml Docker Compose para hacer referencia a estos dos archivos de entorno que se muestran a continuación.

version: "3.7"
 services:
   bookstack:
     container_name: "bookstack"
     image: "ghcr.io/linuxserver/bookstack"
     ports:
       - "8080:80"
     volumes:
       - "./files:/usr/share/caddy"
     depends_on:
       - "bookstack_db"
     env_file:
       - "./bookstack.env"
   bookstack_db:
     container_name: "bookstack_db"
     image: "mariadb"
     volumes:
       - "./db:/var/lib/mysql"
     env_file:
       - "./bookstack_db.env"

5. Ahora inicie la pila de libros y bookstack_db contenedores usando Docker Compose.

sudo docker-compose up -d

Puede ver cada uno de los pasos mencionados en esta sección realizados en VS Code a continuación.

Supervisión de registros de Docker Compose

El motor de Docker funciona con Docker Compose para realizar muchas tareas diferentes en segundo plano. Es útil poder monitorear lo que sucede, especialmente cuando se trabaja con varios contenedores a la vez.

Para monitorear el contenedor de la pila de libros, por ejemplo, use los logs dominio. En este tutorial, una vez que vea los registros, muestre [services.d] done , puede ir a la URL de la pila de libros.

sudo docker-compose logs bookstack

En esta etapa, debe tener un wiki completamente funcional ejecutándose dentro de su propio contenedor, con su propia base de datos, ¡completamente dentro de Docker!

Siempre que tenga las carpetas bookstack y bookstack_db, puede recrear su entorno de libros desde cero.

Docker Compose y Redes

Hasta este punto, no ha aprendido demasiado sobre el aspecto de comunicación y redes de cómo los contenedores funcionan juntos. Cambiemos eso.

Cuando crea varios contenedores dentro de un solo docker-compose.yaml como lo ha hecho en las secciones anteriores, todos están asignados a la misma red (generalmente llamada nombre-de-la-carpeta-principal_predeterminada ).

Puede ver la red creada para los contenedores cuando ejecuta docker-compose up -d como se muestra a continuación.

Cuando todos los contenedores se asignan dentro de la misma red, Docker crea entradas DNS para ellos internamente. Es por eso que en el ejemplo anterior, se refirió a su base de datos como bookstack_db en las variables de entorno. Ese bookstack_db El nombre es en realidad una entrada de DNS que apunta a la dirección IP del contenedor de la base de datos.

Tampoco tiene que depender de Docker Compose para generar automáticamente redes por usted. Puede definir manualmente redes internas o externas. La definición manual de redes es excelente cuando tiene un contenedor que necesita comunicarse con otro contenedor en un docker-compose.yaml separado. expediente. ¡Puede exponer los puertos o puede crear una red a la que ambos puedan unirse!

Tenga en cuenta que cuando comienza a definir redes explícitamente, también debe definir explícitamente la red predeterminada. Docker Compose dejará de crear esa red automáticamente una vez que comience a definir las redes

Ahora modifique la pila de libros docker-compose.yaml para incluir una red creada externamente.

  1. Cree la red externa con docker network create my_external_network .

2. Defina la red externa en docker-compose.yaml :

version: "3.7"
 services:
   bookstack:
     container_name: "bookstack"
     image: "ghcr.io/linuxserver/bookstack"
     ports:
       - "8080:80"
     volumes:
       - "./files:/usr/share/caddy"
     depends_on:
       - "bookstack_db"
     env_file:
       - "./bookstack.env"
     networks:
       - "my_external_network"
       - "bookstack_default"
   bookstack_db:
     container_name: "bookstack_db"
     image: "mariadb"
     volumes:
       - "./db:/var/lib/mysql"
     env_file:
       - "./bookstack_db.env"
     networks:
       - "bookstack_default"
 networks:
   bookstack_default:
   my_external_network:
     external: true

3. Ejecute docker-compose up -d para recrear los contenedores. Sus dos contenedores ahora están unidos a dos redes como se muestra a continuación.

El contenedor de la pila de libros ahora es también unido a una red definida externamente. Esto le permite crear otro contenedor que convierte el tráfico HTTP de la pila de libros en HTTPS antes de que abandone Docker (denominado proxy inverso). ).

Configuración de un usuario específico para ejecutar un contenedor

De forma predeterminada, todos los contenedores de Docker se ejecutan como un usuario raíz en espacio aislado. Esto es equivalente a ejecutar una máquina virtual iniciada como usuario administrador predeterminado. Si bien esto generalmente no es un problema, existen problemas de seguridad si el espacio aislado se ve comprometido.

El otro problema con la ejecución como root son los permisos de archivo. Puede notar que si intenta eliminar el db carpeta dentro de la pila de libros carpeta, en realidad no puedes; los contenidos son propiedad de root.

Si bien la mayoría de las imágenes no aprecian la ejecución como usuario no root, linuxserver.io Las imágenes en particular ofrecen una variable de entorno para configurar el usuario que se ejecuta dentro del contenedor. Puede hacerlo agregando UID=1000 y GID=1000 dentro de bookstack.env configuración.

1000:1000 is the default user ID and group for the first user in ubuntu (which you may not be). You can read more about User IDs and Group IDs at Related:A Windows Guy in a Linux World:Users and File Permissions )

You can also force a UID and GID using the user parameter in docker-compose, but this is not recommended as most containers do not behave well when forced to a different user

Setting the Restart Policy

If you’d like containers built with Docker Compose to restart on failure, use the restart policy by adding a restart: <option> parameter under the container settings in docker-compose.yaml .

restart: "no"
restart: always
restart: on-failure
restart: unless-stopped

Adding this parameter will cause containers to automatically restart on failure to help maintain uptime in the event of unexpected power issues.

Manually setting DNS entries for Containers

Just like with Windows and Linux, Docker also has a “hosts file”. By using the extra_hosts parameter in a config file, you can force a host to resolve to a specific IP. This can be useful when you have DNS constraints, such as split DNS or a test server you want to interact with temporarily.

extra_hosts:
  - "somehost:x.x.x.x"
  - "otherhost:x.x.x.x"

Running Commands

Once the container is started, you can run commands inside of the container using the docker-compose run . For example, maybe you’d like to start up a Bash terminal inside of your bookstack envase. To do that, you’d run the command below.

docker-compose run web bash

Conclusion

At this stage, you should have enough information to follow along with the majority of docker-compose tutorials out on the web. Having this knowledge can vastly expand your ability to move into the world of Docker, and the building of web apps in Infrastructure as Code.


Docker
  1. Podman vs Docker:Todo lo que necesitas saber

  2. Todo lo que querías saber sobre Zorin OS 12

  3. Todo lo que necesita saber sobre Ubuntu 13.04

  4. Todo lo que necesita saber sobre CentOS Stream

  5. ¿Qué es una VPN? Todo lo que necesita saber sobre las VPN

Todo lo que necesita saber sobre el sistema operativo Peppermint Linux

Todo lo que necesita saber sobre Black Lab Linux

Todo lo que necesita saber sobre la distribución Linux Mint

Todo lo que necesita saber sobre los inodos en Linux

Todo lo importante que necesita saber sobre Hard Link en Linux

Todo lo importante que necesita saber sobre UID en Linux