Sobrescribir los valores predeterminados del contenedor
Explicación
Cuando un contenedor de Docker se inicia, ejecuta una aplicación o comando. El contenedor obtiene este ejecutable (script o archivo) de la configuración de su imagen. Los contenedores vienen con configuraciones predeterminadas que normalmente funcionan bien, pero puedes cambiarlas si es necesario. Estos ajustes ayudan a que el programa del contenedor se ejecute exactamente como deseas.
Por ejemplo, si tienes un contenedor de base de datos existente que escucha en el puerto estándar y deseas ejecutar una nueva instancia del mismo contenedor de base de datos, es posible que desees cambiar la configuración del puerto en el que escucha el nuevo contenedor para que no entre en conflicto con el contenedor existente. A veces, es posible que desees aumentar la memoria disponible para el contenedor si el programa necesita más recursos para manejar una carga de trabajo pesada, o establecer las variables de entorno para proporcionar detalles de configuración específicos que el programa necesita para funcionar correctamente.
El comando docker run ofrece una forma potente de sobrescribir estos valores predeterminados y adaptar el comportamiento del contenedor a tu gusto. El comando ofrece varias banderas (flags) que te permiten personalizar el comportamiento del contenedor sobre la marcha.
Aquí tienes algunas formas de lograrlo.
Sobrescribir los puertos de red
A veces, es posible que desees utilizar instancias de base de datos independientes para fines de desarrollo y pruebas. Ejecutar estas instancias de base de datos en el mismo puerto podría causar conflictos. Puedes usar la opción -p en docker run para asignar puertos del contenedor a puertos del host, lo que te permite ejecutar múltiples instancias del contenedor sin ningún conflicto.
$ docker run -d -p HOST_PORT:CONTAINER_PORT postgres
Configurar variables de entorno
Esta opción establece una variable de entorno foo dentro del contenedor con el valor bar.
$ docker run -e foo=bar postgres env
Verás una salida como la siguiente:
HOSTNAME=2042f2e6ebe4
foo=bar
TipEl archivo
.envactúa como una forma conveniente de configurar variables de entorno para tus contenedores de Docker sin saturar tu línea de comandos con numerosas banderas-e. Para usar un archivo.env, puedes pasar la opción--env-filecon el comandodocker run.$ docker run --env-file .env postgres env
Restringir los recursos que el contenedor puede consumir
Puedes usar las banderas --memory y --cpus con el comando docker run para restringir la cantidad de CPU y memoria que puede utilizar un contenedor. Por ejemplo, puedes establecer un límite de memoria para el contenedor de la API de Python, evitando que consuma recursos excesivos en tu host. Aquí está el comando:
$ docker run -e POSTGRES_PASSWORD=secret --memory="512m" --cpus="0.5" postgres
Este comando limita el uso de memoria del contenedor a 512 MB y define una cuota de CPU de 0.5 para la mitad de un núcleo.
Monitorear el uso de recursos en tiempo real
Puedes usar el comando
docker statspara monitorear el uso de recursos en tiempo real de los contenedores en ejecución. Esto te ayuda a comprender si los recursos asignados son suficientes o si necesitan ajustes.
Al utilizar eficazmente estas banderas de docker run, puedes adaptar el comportamiento de tu aplicación contenedorizada para que se ajuste a tus requisitos específicos.
Pruébalo
En esta guía práctica, verás cómo utilizar el comando docker run para sobrescribir los valores predeterminados del contenedor.
- Descarga e instala Docker Desktop.
Ejecutar múltiples instancias de la base de datos Postgres
Inicia un contenedor utilizando la imagen de Postgres con el siguiente comando:
$ docker run -d -e POSTGRES_PASSWORD=secret -p 5432:5432 postgresEsto iniciará la base de datos Postgres en segundo plano, escuchando en el puerto estándar del contenedor
5432y asignado al puerto5432en la máquina host.Inicia un segundo contenedor de Postgres asignado a un puerto diferente.
$ docker run -d -e POSTGRES_PASSWORD=secret -p 5433:5432 postgresEsto iniciará otro contenedor de Postgres en segundo plano, escuchando en el puerto estándar de Postgres
5432en el contenedor, pero asignado al puerto5433en la máquina host. Sobrescribes el puerto del host solo para asegurarte de que este nuevo contenedor no entre en conflicto con el contenedor en ejecución existente.Verifica que ambos contenedores estén funcionando yendo a la vista de Containers en el Panel de Docker Desktop.

Ejecutar el contenedor de Postgres en una red controlada
De forma predeterminada, los contenedores se conectan automáticamente a una red especial llamada red tipo bridge (puente) cuando los ejecutas. Esta red bridge actúa como un puente virtual, permitiendo que los contenedores en el mismo host se comuniquen entre sí mientras los mantiene aislados del mundo exterior y de otros hosts. Es un punto de partida conveniente para la mayoría de las interacciones de contenedores. Sin embargo, para escenarios específicos, es posible que desees un mayor control sobre la configuración de la red.
Aquí es donde entra en juego la red personalizada. Creas una red personalizada pasando la bandera --network con el comando docker run. Todos los contenedores sin una bandera --network se conectan a la red bridge predeterminada.
Sigue los pasos para ver cómo conectar un contenedor de Postgres a una red personalizada.
Crea una nueva red personalizada utilizando el siguiente comando:
$ docker network create mynetworkVerifica la red ejecutando el siguiente comando:
$ docker network lsEste comando enumera todas las redes, incluida la recién creada "mynetwork".
Conecta Postgres a la red personalizada utilizando el siguiente comando:
$ docker run -d -e POSTGRES_PASSWORD=secret -p 5434:5432 --network mynetwork postgresEsto iniciará el contenedor de Postgres en segundo plano, asignado al puerto del host 5434 y conectado a la red
mynetwork. Pasaste el parámetro--networkpara sobrescribir el valor predeterminado del contenedor conectándolo a una red personalizada de Docker para un mejor aislamiento y comunicación con otros contenedores. Puedes usar el comandodocker network inspectpara ver si el contenedor está vinculado a esta nueva red bridge.Diferencias clave entre la red bridge predeterminada y las redes personalizadas
- Resolución DNS: De forma predeterminada, los contenedores conectados a la red bridge predeterminada pueden comunicarse entre sí, pero solo por dirección IP (a menos que utilices la opción
--link, que se considera heredada). No se recomienda para uso en producción debido a varias deficiencias técnicas. En una red personalizada, los contenedores pueden resolverse entre sí por nombre o alias. - Aislamiento: Todos los contenedores sin una red
--networkespecificada se conectan a la red bridge predeterminada, lo que puede ser un riesgo, ya que los contenedores no relacionados pueden comunicarse entre sí. El uso de una red personalizada proporciona una red de ámbito cerrado en la que solo los contenedores conectados a esa red pueden comunicarse, proporcionando así un mejor aislamiento.
- Resolución DNS: De forma predeterminada, los contenedores conectados a la red bridge predeterminada pueden comunicarse entre sí, pero solo por dirección IP (a menos que utilices la opción
Gestionar los recursos
De forma predeterminada, los contenedores no están limitados en su uso de recursos. Sin embargo, en sistemas compartidos, es crucial gestionar los recursos de manera efectiva. Es importante no permitir que un contenedor en ejecución consuma demasiada memoria de la máquina host.
Aquí es donde el comando docker run brilla de nuevo. Ofrece banderas como --memory y --cpus para restringir la cantidad de CPU y memoria que puede utilizar un contenedor.
$ docker run -d -e POSTGRES_PASSWORD=secret --memory="512m" --cpus=".5" postgres
La bandera --cpus especifica la cuota de CPU para el contenedor. Aquí se establece en la mitad de un núcleo de CPU (0.5), mientras que la bandera --memory especifica el límite de memoria para el contenedor. En este caso se establece en 512 MB.
Sobrescribir los valores predeterminados de CMD y ENTRYPOINT en Docker Compose
A veces, es posible que necesites sobrescribir los comandos predeterminados (CMD) o puntos de entrada (ENTRYPOINT) definidos en una imagen de Docker, especialmente al utilizar Docker Compose.
Crea un archivo
compose.ymlcon el siguiente contenido:services: postgres: image: postgres:18 entrypoint: ["docker-entrypoint.sh", "postgres"] command: ["-h", "localhost", "-p", "5432"] environment: POSTGRES_PASSWORD: secretEl archivo Compose define un servicio llamado
postgresque utiliza la imagen oficial de Postgres, establece un script de punto de entrada e inicia el contenedor con autenticación por contraseña.Inicia el servicio ejecutando el siguiente comando:
$ docker compose up -dEste comando inicia el servicio Postgres definido en el archivo Docker Compose.
Verifica la autenticación con el Panel de Docker Desktop.
Abre el Panel de Docker Desktop, selecciona el contenedor Postgres y selecciona Exec para ingresar a la terminal del contenedor. Puedes escribir el siguiente comando para conectarte a la base de datos Postgres:
# psql -U postgres
NoteLa imagen de PostgreSQL configura la autenticación de confianza localmente, por lo que notarás que no se requiere contraseña al conectarse desde localhost (dentro del mismo contenedor). Sin embargo, se requerirá una contraseña si se conecta desde un host o contenedor diferente.
Sobrescribir los valores predeterminados de CMD y ENTRYPOINT con docker run
También puedes sobrescribir los valores predeterminados directamente utilizando el comando docker run con el siguiente comando:
$ docker run -e POSTGRES_PASSWORD=secret postgres docker-entrypoint.sh -h localhost -p 5432
Este comando ejecuta un contenedor Postgres, establece una variable de entorno para la autenticación por contraseña, sobrescribe los comandos de inicio predeterminados y configura el nombre de host y la asignación de puertos.
Recursos adicionales
Siguientes pasos
Ahora que has aprendido sobre cómo sobrescribir los valores predeterminados del contenedor, es hora de aprender cómo persistir los datos del contenedor.
Persistir datos del contenedor