Configuración de Registros Privados para Docker

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

Etiquetas: Docker registros-privados Harbor alibaba-cloud gestión-de-recursos

Publicado el 7-24 14:23