Menyiapkan Docker Registry di Rocky Linux 8/AlmaLinux 8


Registry Docker adalah sistem penyimpanan dan pengiriman konten yang menyimpan gambar Docker bernama, tersedia dalam berbagai versi yang diberi tag. Pengguna yang menggunakan Docker berinteraksi dengan registry menggunakan perintah docker push dan docker pull. Terkadang lebih masuk akal untuk menyimpan gambar Docker di registry lokal daripada mendorongnya ke Docker hub. Dalam panduan ini, kami akan menyiapkan Registry Docker Pribadi di Rocky/AlmaLinux 8 yang diamankan dengan Sertifikat SSL Let’s Encrypt.

Anda akan menghemat banyak bandwidth untuk tim besar dan menjaga gambar yang tidak ingin Anda publikasikan tetap aman. Membuat registry Docker lokal hanyalah masalah mengikuti beberapa langkah. Untuk instalasi Docker pada distribusi yang berbeda, lihat Cara menginstal Docker CE di Sistem Linux.

Pasang Docker Engine

Kita membutuhkan Docker Engine untuk menjalankan layanan registry. Perbarui sistem Anda sebelum menginstalnya.

sudo yum -y update

Jalankan perintah di bawah ini untuk menginstal Docker CE.

sudo curl -o /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo 

Kemudian pasang paket Docker CE dan plugin Compose.

sudo yum -y install docker-ce docker-ce-cli containerd.io

Jika Anda ingin menggunakan Docker sebagai pengguna non-root, Anda sekarang sebaiknya mempertimbangkan untuk menambahkan pengguna Anda ke grup docker:

sudo usermod -aG docker $USER
newgrp docker

Jalankan perintah di bawah ini untuk melihat versi docker yang terpasang.

$ docker --version
Docker version 26.1.3, build b72abbb

Mulai dan aktifkan layanan docker:

sudo systemctl enable --now docker

Status harus berjalan:

 $ systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2024-07-13 19:53:19 UTC; 4s ago
     Docs: https://docs.docker.com
 Main PID: 17832 (dockerd)
    Tasks: 7
   Memory: 30.4M
   CGroup: /system.slice/docker.service
           └─17832 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Jul 13 19:53:19 rocky8.cloudspinx.com systemd[1]: Starting Docker Application Container Engine...
Jul 13 19:53:19 rocky8.cloudspinx.com dockerd[17832]: time="2024-07-13T19:53:19.316260221Z" level=info msg="Starting up"
Jul 13 19:53:19 rocky8.cloudspinx.com dockerd[17832]: time="2024-07-13T19:53:19.340012039Z" level=info msg="Loading containers: start."
Jul 13 19:53:19 rocky8.cloudspinx.com dockerd[17832]: time="2024-07-13T19:53:19.621507107Z" level=info msg="Loading containers: done."
Jul 13 19:53:19 rocky8.cloudspinx.com dockerd[17832]: time="2024-07-13T19:53:19.644692641Z" level=info msg="Docker daemon" commit=8e96db1 containerd-snapshotter=false storage-driver=overlay2 versio>
Jul 13 19:53:19 rocky8.cloudspinx.com dockerd[17832]: time="2024-07-13T19:53:19.644783862Z" level=info msg="Daemon has completed initialization"
Jul 13 19:53:19 rocky8.cloudspinx.com dockerd[17832]: time="2024-07-13T19:53:19.671038318Z" level=info msg="API listen on /run/docker.sock"
Jul 13 19:53:19 rocky8.cloudspinx.com systemd[1]: Started Docker Application Container Engine.
[root@rocky8 ~]#

Hasilkan Sertifikat SSL Let’s Encrypt

Seperti yang dijanjikan sebelumnya, kita akan menggunakan Sertifikat SSL Let’s Encrypt untuk mengamankan pengaturan Docker Registry kita yang berjalan di Rocky/AlmaLinux.

Instal alat certbot yang akan digunakan untuk meminta sertifikat Let’s Encrypt.

sudo yum -y install epel-release
sudo yum -y install certbot

Permintaan sertifikat SSL:

export DOMAIN="registry.domain.com"
export EMAIL="[email "
certbot certonly --standalone -d $DOMAIN --preferred-challenges http --agree-tos -n -m $EMAIL --keep-until-expiring

Output yang diharapkan dari pembuatan sertifikat:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for registry.computingforgeeks.com
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/registry.computingforgeeks.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/registry.computingforgeeks.com/privkey.pem
   Your cert will expire on 2021-07-28. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Sertifikat Anda akan disimpan di bawah /etc/letsencrypt/live/

/etc/letsencrypt/live/registry.domain.com/fullchain.pem
/etc/letsencrypt/live/registry.domain.com/privkey.pem

Di mana :

  • fullchain.pem ⇒ file gabungan cert.pem dan chain.pem
  • chain.pem ⇒ sertifikat menengah
  • cert.pem ⇒ Sertifikat Server SSL (termasuk kunci publik)
  • privkey.pem ⇒ file kunci pribadi

Jalankan registry Docker di Rocky Linux/AlmaLinux 8

Anda bisa menjalankan registri Docker dengan SSL atau tanpa SSL. Kami akan menunjukkan bagaimana Anda bisa menjalankan registri Docker dengan salah satu metode tersebut.

Tapi pertama, buat direktori yang akan menyimpan image registry Docker:

sudo mkdir /var/lib/docker/registry

Menjalankan registry Docker lokal tanpa SSL

docker run -d -p 5000:5000 \
--name docker-registry \
--restart=always \
-v /var/lib/docker/registry:/var/lib/registry \
registry:2

Menjalankan registry Docker lokal dengan SSL

Buat direktori dan letakkan sertifikat di host:

export DOMAIN="registry.domain.com"
mkdir /certs
sudo cp /etc/letsencrypt/live/$DOMAIN/fullchain.pem /certs/fullchain.pem
sudo cp /etc/letsencrypt/live/$DOMAIN/privkey.pem /certs/privkey.pem
sudo cp /etc/letsencrypt/live/$DOMAIN/cert.pem /certs/cert.pem

Buat sebuah kontainer Docker Registry:

docker run -d --name docker-registry --restart=always \
-p 5000:5000 \
-e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/fullchain.pem  \
-e REGISTRY_HTTP_TLS_KEY=/certs/privkey.pem \
-v /certs:/certs \
-v /var/lib/docker/registry:/var/lib/registry \
registry:2

Ganti registry.domain.com dengan nama subdomain registry Anda.

Ini akan mengunduh image docker registry:2 jika belum ada dan membuat sebuah kontainer

Unable to find image 'registry:2' locally
2: Pulling from library/registry
ddad3d7c1e96: Pull complete
6eda6749503f: Pull complete
363ab70c2143: Pull complete
5b94580856e6: Pull complete
12008541203a: Pull complete
Digest: sha256:bac2d7050dc4826516650267fe7dc6627e9e11ad653daca0641437abdf18df27
Status: Downloaded newer image for registry:2
ed960bd27529be26e7ef728027844a62b0731b08bafdbbf63dea328dac46e024

Periksa status kontainer:

# docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS          PORTS                                       NAMES
ed960bd27529   registry:2   "/entrypoint.sh /etc…"   28 seconds ago   Up 27 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   docker-registry

Untuk mendorong gambar ke server Registry Container, atur seperti berikut:

$ curl https://$DOMAIN:5000/v2/_catalog
{"repositories":[]}

Jika Anda mengaktifkan SELinux, Anda mungkin mengalami masalah saat menggunakan port 5000, pertimbangkan untuk menonaktifkan SELinux atau mengubahnya ke mode permissive jika Anda mengalami masalah.

Jika firewalld diaktifkan dan berjalan, izinkan port pada firewall.

sudo firewall-cmd --add-port=5000/tcp --permanent
sudo firewall-cmd --reload

Tambahkan Registry Tidak Aman ke Docker Engine

Secara default, Docker menggunakan https untuk terhubung ke registry Docker. Namun, ada kasus penggunaan untuk menggunakan registry yang tidak aman, terutama jika Anda berada di jaringan yang terpercaya. Ini menghilangkan kebutuhan akan sertifikat yang ditandatangani CA untuk penggunaan internal atau untuk mempercayai sertifikat yang ditandatangani sendiri di semua node Docker. Berikut adalah langkah-langkah untuk menambahkan Registry Tidak Aman ke Docker Engine.

Untuk Ubuntu Xenial, edit /etc/docker/daemon.json dan perbarui kunci “insecure-registries”. misalnya.

{
 "insecure-registries" : ["registry.domain.com:5000"]
 }

Edit file /etc/docker/daemon.json, misalnya.

{
 "insecure-registries" : ["registry.domain.com:5000"]
 }

Untuk Ubuntu trusty, edit file /etc/default/docker dan perbarui DOCKER_OPTS, misalnya

DOCKER_OPTS='--insecure-registry registry.domain.com:5000'

Lalu restart mesin Docker

sudo systemctl restart docker

Mendorong gambar Docker ke registri lokal

Sekarang registry sudah siap, Anda dapat mulai mengirimkan image docker ke dalamnya. Jika Anda tidak memiliki server DNS aktif, gunakan file /etc/hosts untuk memetakan hostname ke alamat IP.

$ sudo vim /etc/hosts
192.168.1.23 registry.domain.com

Saya akan mengunduh ubuntu image Docker terbaru dari Docker Hub dan mendorongnya ke registry Docker lokal saya.

$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
345e3491a907: Pull complete
57671312ef6f: Pull complete
5e9250ddb7d0: Pull complete
Digest: sha256:cf31af331f38d1d7158470e095b132acd126a7180a54f263d386da88eb681d93
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

Tag gambar sebagai registry.domain.com:5000/ubuntu. Ini membuat tag tambahan untuk gambar yang sudah ada. Ketika bagian pertama dari tag adalah nama host dan port, Docker menganggap ini sebagai lokasi registry saat melakukan push.

docker tag ubuntu $DOMAIN:5000/ubuntu

Dorong gambar ke registry lokal yang berjalan di registry.domain.com:5000/ubuntu

$ docker push $DOMAIN:5000/ubuntu
Using default tag: latest
The push refers to repository [registry.domain.com:5000/ubuntu]
2f140462f3bc: Pushed
63c99163f472: Pushed
ccdbb80308cc: Pushed
latest: digest: sha256:86ac87f73641c920fb42cc9612d4fb57b5626b56ea2a19b894d0673fd5b4f2e9 size: 943

Jika unggahan gambar berhasil, Anda seharusnya mendapatkan sha256 hash di akhir. Gambar yang diunggah disimpan di bawah direktori /var/lib/registry/docker/registry/v2/repositories.

$ ls /var/lib/docker/registry/docker/registry/v2/repositories/
ubuntu

Ini adalah metode yang sama yang akan Anda gunakan untuk mendorong image docker kustom. Untuk mengunduh image docker di registry lokal, gunakan perintah:

$ docker pull registry-hostname:500/image:tag
#E.g
$ docker pull registry.domain.com:5000/ubuntu

Di panduan saya berikutnya, saya akan menjelaskan cara mengonfigurasi proxy nginx untuk mengakses repositori melalui https.

Anda juga bisa melihat Instal Manajer UI Docker – Portainer