- 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, mediantedocker 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
- 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
- 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
-fpara especificar rutas alternativas. - ¿Cómo construir si el Dockerfile no está en el directorio actual? Proporcione la ruta absoluta al archivo con
-f.