Guía Práctica de Dockerfile: Instrucciones y Configuración de Contenedores

  1. Preparación del Entorno y Construcción de Imágenes

Para comenzar, es fundamental trabajar con una imagen base oficial. Docker proporciona imágenes minimalistas que pueden requerir configuraciones adicionales para su uso completo.

  • Descargue una imagen base, como centos:8.4.2105, mediante docker pull centos:8.4.2105.
  • Estas imágenes suelen estar optimizadas y carecen de herramientas básicas o repositorios funcionales.
  • La solución consiste en personalizar la imagen mediante un archivo Dockerfile, ajustando repositorios e instalando paquetes necesarios.

Ejemplo de Construcción de Imagen Personalizada

A cotninuación, se muestra un Dockerfile para crear una imagen CentOS con repositorios de Aliyun y herramientas básicas:

# Archivo dockerfile_personalizado
FROM centos:8.4.2105
LABEL maintainer="ejemplo@dominio.com"
RUN VERSION_MINOR=8.4.2105 && \
    sed -e "s|^mirrorlist=|#mirrorlist=|g" \
        -e "s|^#baseurl=http://mirror.centos.org/\$contentdir/\$releasever|baseurl=https://mirrors.aliyun.com/centos-vault/$VERSION_MINOR|g" \
        -i.bak /etc/yum.repos.d/CentOS-*.repo
RUN yum -y install net-tools vim
CMD ["/bin/bash"]

Para construir la imagen, ejecute:

docker build -t mi_centos:v1.0 -f dockerfile_personalizado .

Consulte el historial de capas con:

docker history mi_centos:v1.0

  1. Instrucciones Clave en Dockerfile

2.1 Instrucción RUN

Permite ejecutar comandos durante la construcción de la imagen. Soporta dos formatos:

  • Formato Shell: RUN comando
  • Formato Exec: RUN ["ejecutable", "arg1", "arg2"]

2.2 Instrucción Build (docker build)

La construcción de imágenes se realiza con docker build. Use la opción -f para especificar archivos con nombres personalizados y -t para etiquetar la imagen. El contexto de construcción (directorios y archivos) se define por la ruta proporcionada.

# Ejemplo con archivo no estándar
docker build -f /ruta/personal/dockerfile_modificado -t nginx:custom /ruta/personal

Los archivos referenciados en COPY o ADD deben estar dentro del contexto de construcción.

2.3 Instrucción COPY

Copia archivos o directorios del host al contenedor. Formato: COPIA origen destino.

  • Si el destino no existe, se crea automáticamente.
  • El origen debe ser una ruta relativa dentro del contexto.

Ejemplo de Dockerfile para un servidor web:

FROM ubuntu:20.04
RUN apt-get update && apt-get install -y nginx
COPY sitio_web/ /var/www/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Notas: Si el origen es un directorio, su contenido se copia; si es un archivo y el destino es un archivo, se reemplaza directamente.

2.4 Instrucción ADD

Similar a COPY, pero con capacidades adicionales como descompresión automática de archivos tar.

FROM debian:latest
ADD archivos.tar.gz /opt/datos/

2.5 Instrucción ENV

Define variables de entorno que pueden usarse en etapas posteriores.

ENV CONTRASENA_SEGURA="valor123"

2.6 Instrucción USER

Especifica el usuario con el que se ejecutará el contenedor.

FROM alpine:latest
RUN adduser -D usuario1
USER usuario1

2.7 Instrucción VOLUME

Crea puntos de montaje para datos persistentes. Al iniciar el contenedor, puede usar -v para vincular directorios del host.

VOLUME /datos_aplicacion

Si no se especifica un volumen, Docker crea uno anónimo. Nota: No se pueden montar archivos individuales, solo directorios.

2.8 Instrucciones ENTRYPOINT y CMD

Definen el comando ejecutable por defecto del contenedor. Si se usan juntas, los parámetros de CMD se pasan como argumentos a ENTRYPOINT.

# Ejemplo de interacción
FROM alpine:latest
ENTRYPOINT ["echo", "Hola"]
CMD ["mundo"]

Al ejecutar docker run, el contenedor imprimirá "Hola mundo". Si se pasa un argumento adicional, reemplaza a CMD. Use --entrypoint para anular ENTRYPOINT completamente.

2.9 Instrucción EXPOSE

Documenta los puertos que el contenedor usará en tiempo de ejecución. Para mapear puertos, use -p o -P al crear el contenedor.

2.10 Instrucción WORKDIR

Establece el directorio de trabajo para instrucciones posteriores.

WORKDIR /aplicacion

  1. Experimentos Prácticos

3.1 Configuración de Imagen con SSH

Cree una imagen que permita acceso SSH con contraseña. Incluya instalación de paquetes, generación de claves y configuración de demonios.

# Dockerfile para SSH con contraseña
FROM centos:8
RUN yum -y install passwd openssh-clients openssh-server net-tools
RUN ssh-keygen -A
RUN echo "PermitRootLogin yes" >> /etc/ssh/sshd_config && \
    echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config && \
    sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN echo "clave123" | passwd --stdin root
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

Para acceso sin contraseña, copie claves públicas y ajuste configuraciones PAM:

# Dockerfile para SSH sin contraseña
FROM centos:8
RUN yum -y install openssh-server
RUN ssh-keygen -A
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed -i 's/^\(account\s\+required\s\+pam_nologin.so\)/# \1/' /etc/pam.d/sshd
COPY clave_publica.pub /root/.ssh/authorized_keys
RUN chmod 700 /root/.ssh && chmod 600 /root/.ssh/authorized_keys
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

El módulo pam_nologin puede bloquear inicios de sesión no root en entornos con inicialización incompleta; deshabilítelo o asegure la eliminación de archivos como /run/nologin.

3.2 Creación de Imagen Base con Herramientas Esenciales

Desarrolle una imagen base con repositorios actualizados y utilidades comunes.

FROM centos:8.4.2105
RUN MINOR_VERSION=8.5.2111 && \
    sed -e "s|^mirrorlist=|#mirrorlist=|g" \
        -e "s|^#baseurl=http://mirror.centos.org/\$contentdir/\$releasever|baseurl=https://mirrors.aliyun.com/centos-vault/$MINOR_VERSION|g" \
        -i.bak /etc/yum.repos.d/CentOS-*.repo
RUN yum -y clean all && yum makecache
RUN yum -y install net-tools vim epel-release
CMD ["/bin/bash"]

Preguntas Frecuentes

  • ¿El archivo Dockerfile debe tener ese nombre específico? No, use -f para especificar rutas alternativas.
  • ¿Cómo construir si el Dockerfile no está en el directorio actual? Proporcione la ruta absoluta al archivo con -f.

Etiquetas: dockerfile Docker contenedores linux centos

Publicado el 6-3 23:06