Tipos y Funciones de los Namespaces en Linux
Los namespaces en Linux son conceptos de bajo nivel implementados en el kernel, que proporcionan aislamiento de recursos. Docker utiliza estos namespaces para ejecutar múltiples contenedores en un solo host, compartiendo el kernel pero manteniendo entornos separados. Las tecnologías clave incluyen:
MNT Namespace: Aislamiento de Sistemas de Archivos
Cada contenedor posee un sistema de archivos raíz independiente y un espacio de usuario aislado, permitiendo ejecutar servicios como nginx en un entorno CentOS dentro de un host Ubuntu. Esto se logra mediante técnicas como chroot para restringir el acceso al directorio designado.
IPC Namespace: Aislamiento de Comunicación entre Procesos
Aísla los recursos de comunicación entre procesos, como memoria compartida. Los procesos dentro del mismo IPC Namespace pueden compartir recursos, pero están estrictamente separados de otros namespaces.
UTS Namespace: Aislamiento de Identidad del Sistema
Contiene información como hostname y domainname, permitiendo que cada contenedor tenga su propio identificador único, independiente del host.
PID Namespace: Aislmaiento de Procesos
Cada contenedor tiene un proceso padre con PID 1, que administra los procesos hijos. Los PIDs se repiten entre contenedores, manteniendo el aislamiento.
Net Namespace: Aislamiento de Red
Proporciona interfaces de red virtuales como vethX y direcciones IP únicas (por ejemplo, a través de docker0), emulando un entorno de red aislado similar a una máquina virtual.
User Namespace: Aislamiento de Usuarios
Permite crear usuarios con los mismos UID/GID en diferentes contenedores, pero limita su alcance al namespace correspondiente.
Control Group (cgroup) Namespace: Control de Recursos
Limita el uso de recursos como CPU, memoria, disco y ancho de banda para un grupo de procesos. Esto previene que un contenedor consuma todos los recursos del host debido a errores.
# Verificar soporte de cgroups en el kernel
grep -i cgroup /boot/config-$(uname -r) | grep -v "^#" | wc -l
# Ejemplo de configuración de memoria
grep -i mem /boot/config-$(uname -r) | grep CG | grep -v "^#"
Time Namespace: Aislamiento de Tiempo
Aísla el tiempo dentro del contenedor del tiempo del sistema host, útil para entornos que requieren temporizadores independientes.
Syslog Namespace: Aislamiento de Registro del Sistema
Propuesto originalmente para syslog, pero alternativas como systemd journal namespaces se usan en la práctica para aislar registros.
Instalación de Docker en Diferentes Sistemas
Instalación Online con apt/yum
Para instalar Docker en CentOS 7:
# Eliminar versiones anteriores de Docker
yum remove docker docker-client docker-common docker-engine
# Instalar utilidades y configurar repositorio
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sed -i 's+https://download.docker.com+https://mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Instalar Docker CE y plugins
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Habilitar e iniciar el servicio
systemctl enable --now docker.service
# Verificar versión
docker version
Para instalar en Ubuntu 20.04:
# Preparar herramientas del sistema
apt-get update
apt-get install -y apt-transport-https ca-certificates curl software-properties-common
# Añadir clave GPG y repositorio
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
apt-get update
# Instalar versión específica de Docker CE
apt-cache madison docker-ce
apt install -y docker-ce=5:20.10.24~3-0~ubuntu-focal docker-ce-cli=5:20.10.24~3-0~ubuntu-focal
# Verificar instalación
docker version
Instalación Offline con Paquetes RPM
Descargar paquetes desde repositorios oficiales o espejos, por ejemplo:
# Supongamos paquetes en /paquetes/docker
cd /paquetes/docker
rpm -ivh *.rpm
# Iniciar el servicio y verificar
systemctl enable --now docker
docker version
Instalación Binaria
Descargar binarios desde espejos y configurar manualmente:
# Descomprimir y copiar binarios
tar -xzf docker-20.10.24.tgz -C /usr/local/
cp /usr/local/docker/* /usr/bin/
# Configurar systemd
cp docker.service containerd.service /lib/systemd/system/
systemctl daemon-reload
systemctl start containerd docker
# Verificar
docker --version
Uso de Comandos Docker para Imágenes y Contenedores
Gestión de Imágenes
# Buscar imágenes
docker search httpd
# Listar imágenes locales
docker images
# Etiquetar una imagen
docker tag httpd:latest mi-httpd:custom
# Descargar una imagen
docker pull nginx
# Exportar/importar imágenes
docker save nginx -o /respaldos/nginx.tar
docker load -i /respaldos/nginx.tar
# Eliminar imágenes
docker image rm <IMAGE_ID>
docker image prune
Gestión de Contenedores
# Crear y ejecutar un contenedor
docker run -it -d --name servidor-web httpd
# Copiar archivos entre host y contenedor
docker cp servidor-web:/usr/local/apache2/conf/httpd.conf /local/
docker cp /local/config.conf servidor-web:/etc/
# Ejecutar comandos en un contenedor
docker exec -it servidor-web bash
# Ver estado de contenedores
docker ps -a
# Detener y eliminar contenedores
docker stop servidor-web
docker rm servidor-web
# Ver registros del contenedor
docker logs -f servidor-web
Motores de Almacenamiento en Docker
Docker utiliza diversos drivers de almacenamiento, como overlay2 (recomendado), devicemapper (para sistemas antiguos como CentOS), vfs (para pruebas) y ZFS/btrfs (menos comunes). La elección afecta el rendiimento y la eficiencia del copiar-en-escribir.
Uso de -v y -p para Volúmenes y Puertos
El flag -p mapea puertos entre host y contenedor, mientras que -v gestiona volúmenes de datos.
# Mapear puertos
docker run -d -p 8080:80 nginx
# Mapear múltiples puertos y protocolos
docker run -d -p 8081:80 -p 9090:443/tcp httpd
# Crear y montar un volumen
docker volume create datos-web
docker run -d -p 8082:80 -v datos-web:/var/www/html nginx
# Montar un directorio del host (con permisos de solo lectura)
docker run -d -p 8083:80 -v /ruta/host:/contenido:ro apache
Ejemplo: Contenedor MySQL con Persistencia de Datos
Crear un contenedor MySQL que guarde datos en el host.
# Crear directorio en el host
mkdir /var/mysql-data
# Ejecutar contenedor con volumen montado
docker run -d -p 3307:3306 -v /var/mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mypass123 mysql:8.0
# Verificar acceso y crear base de datos
mysql -uroot -pmypass123 -h 127.0.0.1 -P 3307 -e "CREATE DATABASE ejemplo; SHOW DATABASES;"
# Confirmar datos en el host
ls -l /var/mysql-data/ejemplo/