Cómo personalizar las imágenes de Docker con DockerFiles

Cómo personalizar las imágenes de Docker con DockerFiles

Este artículo muestra cómo personalizar las imágenes de Docker utilizando un archivo de descripción llamado Dockfile. Verá cómo extender las imágenes existentes, personalizarlas a sus necesidades y también cómo publicar la imagen resultante en Docker Hub.

En este tutorial aprenderás:

  • Cómo personalizar una imagen con un Dockerfile.
  • Cómo publicar la imagen resultante en Docker Hub.
HTTPS está habilitado.

Requisitos y convenciones de software utilizados

Requisitos de software y convenciones de línea de comandos de Linux
Categoría Requisitos, convenciones o versión de software utilizada
Sistema Ubuntu 18.04 Beaver Bionic
Software Estibador
Otro Acceso privilegiado a su sistema Linux como root o a través del sudo dominio.
Convenciones # - requiere que los comandos de Linux dados se ejecuten con privilegios raíz directamente como un usuario raíz o mediante el uso de sudo dominio
ps - Requiere que los comandos de Linux dados se ejecuten como un usuario regular no privilegiado

Introducción



Los artículos anteriores presentaron conceptos Docker y algunos comandos básicos de Docker. En este artículo, verá cómo personalizar y extender una imagen de Docker existente, describiendo las modificaciones en un DockerFile y publicar la imagen a un registro.

El Dockerfile

En el artículo anterior, ha realizado modificaciones en un contenedor en ejecución y cometió los cambios en el caché de imagen local. Aunque es un recurso útil para situaciones específicas, se recomienda que las personalizaciones se realicen de una manera más documentada, para que la imagen pueda implementarse en otros hosts. La forma recomendada es escribir un Dockerfile.

DockerFile es un archivo YAML, que es un archivo de texto con alguna sintaxis: las relaciones se expresan utilizando la sangría (espacios) y cada línea se compone de pares de clave y valor.

Comencemos con un DockerFile simple que instala el paquete accesorios (contiene comandos htop y PD) a una imagen de Debian.

Cree un nuevo directorio, ingrese y guarde el archivo a continuación con el nombre Dockfile (Capital D):

Desde Debian Run Apt-Get Update && \ apt-Get -y Install Procps 
Copiar

Este dockerfile afirma que la imagen base se llama Debian (DE cláusula). Si no existe localmente, se descargará desde Docker Hub. El CORRER comando ejecuta apt-get dos veces. Observe el uso de una barra insegura (\) para romper una línea y el uso de -Y para omitir la solicitud de confirmación de instalación de apt-get.

El siguiente paso es construir la imagen con Docker Build.



$ Docker Build -t Mydebian . Enviar contexto de compilación a Docker Daemon 2.048kb Paso 1/2: De Debian ---> be2868beba Paso 2/2: Ejecutar apt-get update && apt-get -y install procps ---> Ejecutando en 52A16b346afc ... Eliminación de contenedores intermedios 52A16B346AFC ---> F21A05A5966 SECRETURAD F21A05A59966 Etiquetado con éxito Mydebian: Último 
Copiar

La bandera -t mydebian está nombrando la nueva imagen. El punto (.) le dice a Docker que use el directorio actual para buscar un DockerFile. Observe que se crean y eliminan nuevas capas a medida que se interpretan las líneas del Dockerfile.

Debe haber una nueva imagen en el caché local.

$ Docker Images Repositorio de etiqueta ID de imagen de tamaño creado Mydebian Último F21A05A59966 Hace 8 minutos 119MB Debian Último BE2868BEBABA 7 semanas hace 101MB 
Copiar

Se puede crear un contenedor de esta imagen.

$ Docker Run -it - -Name mydebian_container mydebian root@ef9eb174874a:/# ps -ef uid pid ppid c stime tty tiempo cmd root 1 0 02:43 pts/0 00:00:00 Bash raíz 9 1 0 02:43 PTS/0 00:00:00 PS -EF 
Copiar

De ahora en adelante puedes crear contenedores que ejecutan Debian con el procps paquete y los comandos htop y PD ya estará instalado.

Ahora creemos un DockerFile para que Apache y PHP estén instalados en la hora de compilación de la imagen, para lograr los mismos objetivos del artículo anterior, cuando los comandos se ejecutaron dentro del contenedor.

Desde debian run apt-get update && \ apt-get -y instalación procps libapache2-mod-php servicio cmd service apache2 iniciar 
Copiar

Hemos agregado libapache2-mod-php en la línea 3 y un CMD Comando en la línea 4 para iniciar Apache. Cuando se inicia el contenedor, el CMD se ejecuta el comando. Puede existir solo uno CMD comando por dockerfile. Cuando el CMD se especifica el comando, reemplaza el CMD comando de la imagen que está extendiendo. Si el CMD Se omite el comando, la de la imagen base se ejecutará (si corresponde). Como habrás adivinado, el Dockerfile de la imagen base de Debian tiene una CMD comandar para ejecutar bash. Puede verificar esto en el Docker Hub.



$ Docker Run -d - -Name mydebian_container2 -d -p 8000: 80 -v "$ pwd":/var/www/html mydebian ad325685b738464c49bff40b65c6824160105ab5c285282efbc4ddeec20ba Nombres de puertos AD325685B738 Mydebian "/bin/sh -c 'Servicio ..." Hace 11 segundos hasta 5 segundos 0.0.0.0: 8000-> 80/tcp mydebian_container2 
Copiar

Esta vez comenzamos el contenedor usando el -d cambiar porque queremos que se separe del terminal.

Comandos importantes de Dockerfile

El Dockerfile tiene otros comandos más allá DE, CORRER, y CMD.

Dominio Envidia se usa para establecer variables de entorno en la imagen, como http_proxy, Por ejemplo. Muchas imágenes usan variables de entorno para pasar parámetros al nuevo contenedor. Para ejemplos, consulte las imágenes de bases de datos como MySQL y PostgreSQL en Docker Hub.

Dominio COPIAR Copia archivos y directorios del host a la imagen a la hora de compilación. La ruta fuente (primer argumento) es relativa al directorio actual.

Dominio AGREGAR es parecido a COPIAR, Con la diferencia de que, si la fuente es un archivo de alquitrán comprimido, se descomprimirá automáticamente en el directorio de destino dentro de la imagen. Excepto por ese uso, Docker recomienda el uso de COPIAR comando siempre que sea posible.

Dominio EXPONER indica qué puertos de la imagen pueden ser expuestos por Docker. Durante la creación de contenedores, esos puertos se pueden asignar a puertos de host, si lo desea.

Dominio Huella de trabajo Establece el directorio que Docker usará cuando los comandos se ejecutan dentro del contenedor con Docker Exec.

Creación de una imagen con https habilitado

Ahora ampliaremos la imagen oficial de PHP Apache para activar SSL con un certificado generado automático para exemplyfy cómo usar los comandos mencionados. En un nuevo directorio, cree el siguiente DockerFile.



Desde PHP: 7 -apache Ejecutar OpenSSL Req -x509 -nodes -days 365 -Newkey RSA: 2048 -Keyout/etc/ssl/private/ssl -cert -snakeOil.Key -Out/Etc/SSL/Certs/SSL-Cert-SnakeOil.PEM -SubJ "/C = BR/ST = Rio Grande do Sul/L = Porto Alegre/O = Security/OU = Desarrollo/CN = Ejemplo.com "Ejecutar A2enMod Rewrite Ejecutar A2ensite Default-SSL Ejecutar A2enMod SSL Expose 443 Copy ./html/var/www/html workdir/var/www/html 
Copiar

En la línea 3 creamos un certificado. Líneas 5 - 7 Habilitar mod_rewrite y SSL. La línea 9 Expone el puerto 443 (el puerto 80 ya está expuesto por la imagen aguas arriba). La línea 11 agrega el directorio de aplicación al contenedor. Finalmente, la línea 13 establece el directorio de trabajo como el directorio de trabajo Apache. Todos los comandos ejecutados por Docker Exec usará este directorio como base por defecto.

Ahora, cree un directorio llamado html y un archivo llamado phpinfo.php con este contenido.

 
Copiar

Ahora construamos y ejecutemos el contenedor.

Docker Build -T App_image . Docker Run -d - -RM -P 80:80 -P 443: 443 - -Name App_Container App_image 
Copiar

Ahora puedes acceder phpinfo.php Script a través de ambos, http y https.

http: // localhost/phpinfo.php https: // localhost/phpinfo.php 
Copiar HTTPS está habilitado.

En https, el navegador se quejará de la seguridad del certificado ya que esto es autofirmado, pero la advertencia puede ignorarse.

Publicar imágenes en el Docker Hub



Las imágenes creadas existen solo localmente, en el caché local de Docker. Es posible que desee compartirlos con otros anfitriones de Docker, o con compañeros de equipo, o incluso hacerlos públicos al mundo. En cualquier caso, desea publicar sus imágenes en un registro de Docker. Se pueden publicar en un registro basado en la nube, como el Docker Hub, que, por cierto, es el valor predeterminado si no especifica explícitamente el registro. Primero cree una ID de Docker gratuita, luego inicie sesión:

$ Docker Iniciar sesión Iniciar sesión con su ID de Docker para empujar y extraer imágenes de Docker Hub. Si no tiene una ID de Docker, diríjase a https: // Hub.estibador.com para crear uno. Nombre de usuario: Contraseña de Infroger: Iniciar sesión 
Copiar

A continuación, etiquete la imagen con el nombre del repositorio (infroger), el nombre de la imagen y la etiqueta (versión de la imagen).

$ Docker etiqueta app_image infroger/app_image: 1 $ Docker Images Repositorio etiqueta ID de imagen Tamaño creado Infroger/APP_IMAGE 1 C093151FC68F Hace 14 horas 381MB App3_image Último C09315151FC68F 14 horas hace 381MB 
Copiar

Luego presione la imagen al repositorio.

$ Docker Push Infroger/App_image: 1 El empuje se refiere al repositorio [Docker.io/infroger/app_image] 27f7f2b01c49: Pushed 81b08cd5fe07: Pushed d1c23d198f84: Pushed e66392ad9b85: Pushed a71f63e3a00f: Pushed 9c58778f21dd: Pushed 973719bed9b7: Pushed 8f5090ef2ac0: Pushed fbdafdbe3319: Pushed a5c4801ecf39: Pushed e9ba112d38b9: Pushed 25ba5230dadf: Pushed f2907ce42b47: Pushed e31bf34cfab9: Pushed 9066d03e98e0: Presionado 96db4ce698ad: presionado ABAE6A338E5C: PUSADO 4572A80A7A5E: PUSHADO EF68F6734AA4: PUSADO 1: DIGEST: SHA256: 2E7E53FCDF800AD0C4837CD70014170CC869D36D36DE5 
Copiar

Ahora ve a Docker Hub y verifique que la imagen esté ahí:



https: // centro.estibador.com/r/infroger/app_image 

En Docker Hub con registro gratuito, puede tener un repositorio privado, con repositorios públicos ilimitados. De lo contrario, es posible que desee ejecutar su propio registro de Docker, que se puede hacer con un comando:

Docker Run -D -P 5000: 5000 - -Restart = Always -Nombre Registro Registro: 2 

La ventaja de tener un registro privado es la privacidad. Pero tiene la carga de gestionar la seguridad, la alta disponibilidad, los requisitos de almacenamiento, el control de acceso, etc.

Conclusión

En este artículo, hemos cubierto cómo extender las imágenes existentes y personalizarlas a sus necesidades utilizando un DockerFile. También hemos visto cómo publicar las imágenes en un registro de Docker. Puedes hacer mucho hasta ahora, pero estamos rascando el mundo de Docker. En el siguiente artículo, veremos una forma muy simple de orquestación de contenedores locales con Docker Compose.

Más en esta serie de artículos de Docker

  • Una introducción práctica a los contenedores de Docker
  • Cómo interactuar con los contenedores Docker

Tutoriales de Linux relacionados:

  • Cosas para instalar en Ubuntu 20.04
  • Cosas que hacer después de instalar Ubuntu 20.04 fossa focal Linux
  • Una introducción a la automatización, herramientas y técnicas de Linux
  • Cosas que hacer después de instalar Ubuntu 22.04 Jellyfish de Jammy ..
  • Archivos de configuración de Linux: los 30 principales más importantes
  • Cosas para instalar en Ubuntu 22.04
  • Mint 20: Mejor que Ubuntu y Microsoft Windows?
  • Cómo montar la imagen ISO en Linux
  • Cómo arrancar dual Kali Linux y Windows 10
  • Ubuntu 20.04 Guía