Configuración de Registros Privados para Docker
Registros Privados
Los desarrolladores pueden establecer su propio registro de contenedores, permitiendo cargar o extraer imágenes personalmente. Este artículo utilizará como ejemplo el registro de contenedores de Alibaba Cloud.
Para utilizar este servicio, es necesario activar la versión personal, crear un espacio de nombres y establecer un registro de contenedores. Este servicio funciona como un registro público ya configurado por Alibaba Cloud, permitiendo operaciones de carga y extracción de imágenes directamente. Además, mejora la velocidad de descarga de imágenes desde Docker Hub.
Caso de Estudio: Registro de Alibaba Cloud
Autenticación
docker login --username=nombre_del_registro registry.cn-hangzhou.aliyuncs.com
# Ingrese la contraseña cuando se solicite
Carga de Imágenes al Registro
Primero, es necesario etiquetar la imagen local:
# Formato
docker tag nombre_imagen url/espacio_de_nombres/registro_contenedor:etiqueta_imagen
docker tag ubuntu:latest registry.cn-hangzhou.aliyuncs.com/miempresa/ubuntu:v1.0
Luego, enviar la imagen al registro de contenedores de Alibaba Cloud:
[root@servidor ~]# docker push registry.cn-hangzhou.aliyuncs.com/miempresa/ubuntu:v1.0
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/miempresa/ubuntu]
a5a1e4a3f2b8: Layer already exists
v1.0: digest: sha256:7a9b3e8c1d2f3e4b5a6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8 size: 527
Extracción de Imágenes del Registro
Cualquiera puede extraer imágenes sin necesidad de autenticación:
# Formato
docker pull url/espacio_de_nombres/registro_contenedor/imagen:etiqueta
[root@servidor ~]# docker pull registry.cn-hangzhou.aliyuncs.com/miempresa/ubuntu:v1.0
v1.0: Pulling from miempresa/ubuntu
Digest: sha256:7a9b3e8c1d2f3e4b5a6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8
Status: Downloaded newer image for registry.cn-hangzhou.aliyuncs.com/miempresa/ubuntu:v1.0
registry.cn-hangzhou.aliyuncs.com/miempresa/ubuntu:v1.0
Construcción de un Registro Empresarial con Harbor
Para implementar un registro de contenedores a nivel empresarial, se puede utilizar Harbor. Descargue el paquete offline desde el sitio oficial de Harbor:
https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz
# Descomprima el paquete
[root@servidor harbor]# tar -xzvf harbor-offline-v2.10.0.tgz
harbor/harbor.v2.10.0.tar.gz
harbor/prepare
harbor/LICENSE
harbor/install.sh
harbor/common.sh
harbor/harbor.yml.tmpl
Configuración del Archivo YAML
[root@servidor harbor]# cp harbor.yml.tmpl harbor.yml
# Edite el archivo yaml
hostname: 192.168.100.20
http:
# puerto para http, por defecto es 80. Si https está habilitado, este puerto redirigirá al puerto https
port: 5000
# Comente la sección https si no es necesaria
# Contraseña de administrador del registro harbor
harbor_admin_password: MiContraseñaSegura123
Modificación de docker.service
Para evitar errores de HTTPS al ejecutar el archivo yml, modifique docker.service:
[root@servidor system]# pwd
/usr/lib/systemd/system
[root@servidor system]# vim docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry=192.168.100.20:5000
# Reinicie el servicio docker
Importación de Imágenes Requeridas por Harbor
[root@servidor harbor]# docker load -i harbor.v2.10.0.tar.gz
Ejecución del Script prepare
[root@servidor harbor]# ./prepare
prepare base dir is set to /root/harbor-2.10/harbor
WARNING:root:WARNING: HTTP protocol is insecure. Harbor will deprecate http protocol in the future. Please make sure to upgrade to https
Generated configuration file: /config/portal/nginx.conf
Generated configuration file: /config/log/logrotate.conf
Generated configuration file: /config/log/rsyslog_docker.conf
Generated configuration file: /config/nginx/nginx.conf
Generated configuration file: /config/core/env
Generated configuration file: /config/core/app.conf
Generated configuration file: /config/registry/config.yml
Generated configuration file: /config/registryctl/env
Generated configuration file: /config/registryctl/config.yml
Generated configuration file: /config/db/env
Generated configuration file: /config/jobservice/env
Generated configuration file: /config/jobservice/config.yml
Generated and saved secret to file: /data/secret/keys/secretkey
Successfully called func: create_root_cert
Generated configuration file: /compose_location/docker-compose.yml
Clean up the input dir
Corrección de Scripts para Docker Compose
Los scripts common.sh e install.sh generarán errores si docker-compose no está instalado. Además, utilizan el comando docker-compose version (versión 7), que debe cambiarse a docker compose version:
# Modificar línea 119
119 elif [[ $(docker compose --version) =~ (([0-9]+)\.([0-9]+)([\.0-9]*)) ]]
# Modificar install.sh
26 DOCKER_COMPOSE="docker compose"
Ejecución del Script de Instalación
[root@servidor harbor]# ./install.sh
[Step 0]: checking if docker is installed ...
Note: docker version: 26.1.3
[Step 1]: checking docker-compose is installed ...
Note: Docker Compose version v2.27.0
[Step 2]: loading Harbor images ...
Loaded image: goharbor/notary-signer-photon:v2.10.0
Loaded image: goharbor/notary-server-photon:v2.10.0
Loaded image: goharbor/prepare:v2.10.0
Loaded image: goharbor/harbor-portal:v2.10.0
Loaded image: goharbor/harbor-db:v2.10.0
Loaded image: goharbor/harbor-jobservice:v2.10.0
Loaded image: goharbor/harbor-exporter:v2.10.0
Loaded image: goharbor/nginx-photon:v2.10.0
Loaded image: goharbor/registry-photon:v2.10.0
Loaded image: goharbor/trivy-adapter-photon:v2.10.0
Loaded image: goharbor/chartmuseum-photon:v2.10.0
Loaded image: goharbor/harbor-core:v2.10.0
Loaded image: goharbor/harbor-log:v2.10.0
Loaded image: goharbor/harbor-registryctl:v2.10.0
Loaded image: goharbor/redis-photon:v2.10.0
[Step 3]: preparing environment ...
[Step 4]: preparing harbor configs ...
prepare base dir is set to /root/harbor-2.10/harbor
WARNING:root:WARNING: HTTP protocol is insecure. Harbor will deprecate http protocol in the future. Please make sure to upgrade to https
Clearing the configuration file: /config/portal/nginx.conf
Clearing the configuration file: /config/log/logrotate.conf
Clearing the configuration file: /config/log/rsyslog_docker.conf
Clearing the configuration file: /config/nginx/nginx.conf
Clearing the configuration file: /config/core/env
Clearing the configuration file: /config/core/app.conf
Clearing the configuration file: /config/registry/passwd
Clearing the configuration file: /config/registry/config.yml
Clearing the configuration file: /config/registryctl/env
Clearing the configuration file: /config/registryctl/config.yml
Clearing the configuration file: /config/db/env
Clearing the configuration file: /config/jobservice/env
Clearing the configuration file: /config/jobservice/config.yml
Generated configuration file: /config/portal/nginx.conf
Generated configuration file: /config/log/logrotate.conf
Generated configuration file: /config/log/rsyslog_docker.conf
Generated configuration file: /config/nginx/nginx.conf
Generated configuration file: /config/core/env
Generated configuration file: /config/core/app.conf
Generated configuration file: /config/registry/config.yml
Generated configuration file: /config/registryctl/env
Generated configuration file: /config/registryctl/config.yml
Generated configuration file: /config/db/env
Generated configuration file: /config/jobservice/env
Generated configuration file: /config/jobservice/config.yml
loaded secret from file: /data/secret/keys/secretkey
Generated configuration file: /compose_location/docker-compose.yml
Clean up the input dir
Note: stopping existing Harbor instance ...
WARN[0000] /root/harbor-2.10/harbor/docker-compose.yml: `version` is obsolete
[Step 5]: starting Harbor ...
WARN[0000] /root/harbor-2.10/harbor/docker-compose.yml: `version` is obsolete
[+] Running 10/10
✔ Network harbor_harbor Created 0.1s
✔ Container harbor-log Started 0.7s
✔ Container registryctl Started 2.4s
✔ Container redis Started 2.3s
✔ Container registry Started 2.6s
✔ Container harbor-db Started 2.0s
✔ Container harbor-portal Started 2.1s
✔ Container harbor-core Started 3.5s
✔ Container nginx Started 4.5s
✔ Container harbor-jobservice Started 4.8s
✔ ----Harbor has been installed and started successfully.----
Verificación de Contenedores
[root@servidor harbor]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b739f8134567 goharbor/nginx-photon:v2.10.0 "nginx -g 'daemon of…" About a minute ago Up About a minute (healthy) 0.0.0.0:5000->8080/tcp, :::5000->8080/tcp nginx
1a2b3c4d5e6f goharbor/harbor-jobservice:v2.10.0 "/harbor/entrypoint.…" About a minute ago Up About a minute (healthy) harbor-jobservice
7g8h9i0j1k2l goharbor/harbor-core:v2.10.0 "/harbor/entrypoint.…" About a minute ago Up About a minute (healthy) harbor-core
3m4n5o6p7q8r goharbor/harbor-db:v2.10.1 "/docker-entrypoint.…" About a minute ago Up About a minute (healthy) harbor-db
9s0t1u2v3w4x goharbor/registry-photon:v2.10.0 "/home/harbor/entryp…" About a minute ago Up About a minute (healthy) registry
5y6z7a8b9c0d goharbor/redis-photon:v2.10.0 "redis-server /etc/r…" About a minute ago Up About a minute (healthy) redis
2e3f4g5h6i7j goharbor/harbor-registryctl:v2.10.0 "/home/harbor/start.…" About a minute ago Up About a minute (healthy) registryctl
8k9l0m1n2o3p goharbor/harbor-portal:v2.10.0 "nginx -g 'daemon of…" About a minute ago Up About a minute (healthy) harbor-portal
4q5r6s7t8u9v goharbor/harbor-log:v2.10.0 "/bin/sh -c /usr/loc…" About a minute ago Up About a minute (healthy) 127.0.0.1:1514->10514/tcp harbor-log
Acceso a la Interfaz Web de Harbor
Acceda a través del navegador en http://192.168.100.20:5000. El nombre de usuario es admin y la contraseña es MiContraseñaSegura123.
Carga de Imágenes al Registro Harbor
# Inicie sesión en el registro harbor
[root@servidor harbor]# docker login 192.168.100.20:5000
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
Extracción de Imágenes desde Harbor
[root@servidor harbor]# docker pull 192.168.100.20:5000/proyecto/debian:v11
v11: Pulling from proyecto/debian
fe07684b16b8: Pull complete
Digest: sha256:7a9b3e8c1d2f3e4b5a6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8
Status: Downloaded newer image for 192.168.100.20:5000/proyecto/debian:v11
192.168.100.20:5000/proyecto/debian:v11
Limitación de Recursos de Contenedores
¿Por qué Limitar Recursos?
Los contenedores se crean en Linux y consumen recursos del sistema. Sin límites, teóricamente podrían utilizar todos los recursos del host físico, afectando el rendimiento de otros servicios.
Operaciones de Limitación
Visualización del Uso de Recursos
[root@servidor ~]# docker stats --no-stream
CONTAINER ID NOMBRE CPU % USO MEM / LIMITE MEM % NET I/O I/O BLOQUEO PIDS
44a0083dd80d app1 0.00% 5.328MiB / 3.799GiB 0.14% 1.11kB / 0B 23.3MB / 0B 1
Establecimiento de Límites de Memoria
Utilice el parámetro -m para limitar la memoria:
[root@sevridor ~]# docker run -tid --name app2 -m 512m debian:11
03d2ebd41aadd44de118ce99ee1c6d46c9fecae5b9b08aa02db2cec955b6c83d
[root@servidor ~]# docker stats --no-stream
CONTAINER ID NOMBRE CPU % USO MEM / LIMITE MEM % NET I/O I/O BLOQUEO PIDS
03d2ebd41aad app2 0.00% 1.551MiB / 512MiB 0.30% 586B / 0B 0B / 0B 1
44a0083dd80d app1 0.00% 6.172MiB / 3.799GiB 0.16% 1.39kB / 0B 23.3MB / 0B 1
Establecimiento de Límites de CPU
Puede asignar un contenedor a CPU específicos:
# Ver el número de CPU disponibles
[root@servidor ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0,1,2,3
# Crear un contenedor con los procesos asignados al CPU 0 y 1
[root@servidor ~]# docker run -tid --name app3 --cpuset-cpus "0,1" debian:11
07e5f3e76959bf3f966e0022646415ec8ebedfa7f573e7c19b668b154f05741b
[root@07e5f3e76959 /]# cat /dev/zero > /dev/null &
[1] 32
[root@07e5f3e76959 /]# exit
exit
[root@servidor ~]# ps mo pid,comm,psr $(pgrep cat)
PID COMMAND PSR
2793 cat -
- - 0