Jika Anda bekerja untuk sebuah organisasi dan ingin menyimpan gambar buruh pelabuhan Anda di rumah untuk penyebaran cepat, maka hosting repositori Docker pribadi sangat cocok. Memiliki registri buruh pelabuhan pribadi memungkinkan Anda untuk memiliki saluran distribusi gambar dan memiliki kontrol yang lebih ketat atas penyimpanan dan distribusi gambar. Anda dapat mengintegrasikan registri Anda dengan sistem CI/CD untuk meningkatkan alur kerja Anda.
Tutorial ini akan mengajari Anda cara menyiapkan dan menggunakan registri Docker pribadi di server berbasis Rocky Linux 8 menggunakan Amazon S3 sebagai lokasi penyimpanan.
Prasyarat
- Dua server Linux dengan Rocky Linux 8. Satu server akan bertindak sebagai host registri, sementara yang lain akan digunakan sebagai klien untuk mengirim permintaan dan menerima gambar dari host.
- Nama domain terdaftar yang menunjuk ke server host. Kami akan menggunakan
registry.example.com
untuk tutorial kami. - Pengguna non-root dengan hak sudo di kedua mesin.
Langkah 1 - Konfigurasi Firewall
Langkah pertama adalah mengkonfigurasi firewall. Rocky Linux menggunakan Firewalld Firewall. Periksa status firewall.
$ sudo firewall-cmd --staterunning
Firewall bekerja dengan zona yang berbeda, dan zona publik adalah zona default yang akan kita gunakan. Buat daftar semua layanan dan port yang aktif di firewall.
$ sudo firewall-cmd --permanent --list-services
Ini akan menunjukkan output berikut.
kokpit dhcpv6-client ssh
Izinkan port HTTP dan HTTPS.
$ sudo firewall-cmd --permanent --add-service=http$ sudo firewall-cmd --permanent --add-service=https
Periksa kembali status firewall.
$ sudo firewall-cmd --permanent --list-services
Anda akan melihat keluaran serupa.
kokpit dhcpv6-klien http https ssh
Muat ulang firewall untuk mengaktifkan perubahan.
$ sudo firewall-cmd --reload
Langkah 2 - Instal Penulisan Docker dan Docker
Langkah ini diperlukan pada server dan mesin klien.
Instal repositori Docker resmi.
$ sudo dnf install yum-utils$ sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
Instal Docker.
$ sudo dnf install docker-ce docker-ce-cli containerd.io
Aktifkan dan jalankan daemon Docker.
$ sudo systemctl aktifkan buruh pelabuhan --now
Tambahkan pengguna sistem Anda ke grup Docker untuk menghindari penggunaan sudo
untuk menjalankan perintah Docker.
$ sudo usermod -aG docker $(whoami)
Login kembali ke server Anda setelah logout untuk mengaktifkan perubahan.
Unduh dan instal rilis stabil Docker Compose terbaru.
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o / usr/local/bin/docker-compose
Terapkan izin yang dapat dieksekusi ke file biner yang diunduh.
$ sudo chmod +x /usr/local/bin/docker-compose
Instal skrip Penyelesaian Bash komposisi Docker.
$ sudo curl \ -L https://raw.githubusercontent.com/docker/compose/1.29.2/contrib/completion/bash/docker-compose \ -o /etc/bash_completion.d/docker-composeMuat ulang pengaturan profil Anda untuk membuat penyelesaian bash berfungsi.
$ source ~/.bashrcLangkah 3 - Konfigurasi Registri Docker
Buat direktori pengguna
Buat direktori untuk konfigurasi registri.
$ mkdir ~/docker-registryBeralih ke
docker-registry
direktori.$ cd ~/docker-registryBuat direktori untuk menyimpan kata sandi otentikasi HTTP, file konfigurasi Nginx, dan sertifikat SSL.
$ mkdir authBuat direktori lain untuk menyimpan log Nginx.
$ mkdir logBuat Bucket Amazon S3
Anda dapat menyimpan data registri dan gambar di server Anda atau menggunakan layanan cloud hosting. Untuk tutorial kami, kami akan menggunakan layanan cloud Amazon S3.
Langkah selanjutnya adalah mengatur file konfigurasi dengan beberapa pengaturan penting. Pengaturan ini juga dapat ditentukan di
docker-compose.yml
file, tetapi memiliki file terpisah jauh lebih baik.Buat ember dengan pengaturan berikut.
- ACL harus dinonaktifkan.
- Akses publik ke bucket harus dinonaktifkan.
- Versi bucket harus dinonaktifkan.
- Aktifkan enkripsi Bucket menggunakan kunci terkelola Amazon S3. (SSE-S3)
- Kunci objek harus dinonaktifkan.
Buat pengguna IAM dengan kebijakan berikut.
{ "Versi":"2012-10-17", "Pernyataan":[ { "Effect":"Izinkan", "Tindakan":[ "s3:ListBucket", "s3:GetBucketLocation", "s3:ListBucketMultipartUploads" ], "Resource":"arn:aws:s3:::S3_BUCKET_NAME" }, { "Effect":"Allow", "Action":[ "s3:PutObject", "s3:GetObject", "s3:DeleteObject", "s3:ListMultipartUploadParts", "s3:AbortMultipartUpload" ], "Resource":"arn:aws:s3:::S3_BUCKET_NAME/*" } ]}
Ganti S3_BUCKET_NAME
dengan nama ember S3 Anda.
Catat kunci rahasia, nilai rahasia, dan wilayah ember ember Anda untuk digunakan nanti.
Buat File Tulis Docker
Buat docker-compose.yml
file dan buka untuk diedit.
$ nano docker-compose.yml
Tempelkan kode berikut di dalamnya.
versi:'3.3'services:registry:image:registry:2 restart:always environment:- REGISTRY_STORAGE=s3 - REGISTRY_STORAGE_S3_REGION=us-west-2 - REGISTRY_STORAGE_S3_BUCKET=hf-docker-registry - REGISTRY_STORAGE_Stru_ENKSIZE_S3_en - REGISTRY_STORAGE_S3_SECURE =true - REGISTRY_STORAGE_S3_ACCESSKEY =AKIA3FIG4NVFCJ6STMUA - REGISTRY_STORAGE_S3_SECRETKEY =j9sA / fw6EE9TVj5KRDhm / 7deye + aYDPXttkGbdaX - REGISTRY_STORAGE_S3_V4AUTH =true - REGISTRY_STORAGE_S3_ROOTDIRECTORY =/ image-registry - REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR =inmemory - REGISTRY_HEALTH_STORAGEDRIVER_ENABLED =nginx palsu:image:"nginx:alpine" port:- 443 :443 tautan:- registri:volume registri:- ./auth:/etc/nginx/conf.d - ./auth/nginx.conf:/etc/nginx/nginx.conf:ro - ./logs:/var/ log/nginx - /etc/letsencrypt:/etc/letsencrypt
Simpan file dengan menekan Ctrl + X dan memasukkan Y saat diminta.
Mari kita lihat apa yang telah kita siapkan di file penulisan kita.
-
Langkah pertama adalah mengambil gambar terbaru dari versi 2 dari registri Docker dari hub. Kami tidak menggunakan tag terbaru karena dapat menyebabkan masalah dalam hal peningkatan versi utama. Menyetelnya ke 2 memungkinkan Anda untuk mengambil semua pembaruan 2.x sambil mencegah peningkatan otomatis ke versi utama berikutnya, yang dapat menyebabkan perubahan yang melanggar.
-
Wadah registri disetel untuk selalu memulai ulang jika terjadi kegagalan atau penghentian yang tidak terduga.
-
Kami telah menetapkan berbagai variabel lingkungan untuk penyimpanan Amazon S3. Mari kita selesaikan dengan cepat.
- REGISTRY_STORAGE mengatur jenis penyimpanan. Kami telah memilih s3 karena kami menggunakan Amazon S3.
- REGISTRY_STORAGE_S3_REGION menyetel wilayah bucket S3 Anda.
- REGISTRY_STORAGE_S3_BUCKET menyetel nama bucket S3 Anda.
- REGISTRY_STORAGE_S3_ENCRYPT - setel ke true jika Anda telah mengaktifkan enkripsi Bucket.
- REGISTRY_STORAGE_S3_CHUNKSIZE mengatur ukuran potongan unggahan. Harus lebih besar dari 5 MB (5 * 1024 * 1024).
- REGISTRY_STORAGE_S3_SECURE - setel ke true jika Anda akan menggunakan HTTPS.
- REGISTRY_STORAGE_S3_ACCESSKEY dan REGISTRY_STORAGE_S3_SECRETKEY - Kredensial pengguna yang Anda ambil setelah membuat pengguna IAM Anda.
- REGISTRY_STORAGE_S3_V4AUTH - setel ke true jika Anda menggunakan autentikasi AWS v4. Jika Anda mendapatkan kesalahan terkait login S3, setel ke false.
- REGISTRY_STORAGE_S3_ROOTDIRECTORY - menyetel direktori root di keranjang tempat data registri Anda akan disimpan.
- REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR - mengatur lokasi untuk Cache. Dalam kasus kami, kami menyimpannya dalam memori. Anda juga dapat menyetelnya untuk menggunakan Redis.
- REGISTRY_HEALTH_STORAGEDRIVER_ENABLED - Setel ke false untuk menonaktifkan layanan pemeriksaan kesehatan penyimpanan Registry. Ada bug dengan Registry yang dapat menyebabkan masalah jika Anda tidak menyetelnya ke false.
-
Registri Docker berkomunikasi melalui port 5000, yang telah kami buka di server kami ke docker.
-
./auth:/etc/nginx/conf.d
pemetaan memastikan bahwa semua pengaturan Nginx tersedia di penampung. -
./auth/nginx.conf:/etc/nginx/nginx.conf:ro
memetakan file pengaturan Nginx dari sistem ke satu di wadah dalam mode hanya-baca. -
./logs:/var/log/nginx
memungkinkan akses ke log Nginx pada sistem dengan memetakan ke direktori log Nginx dalam wadah. -
Pengaturan registri Docker disimpan di
/etc/docker/registry/config.yml
file dalam wadah, dan kami telah memetakannya keconfig.yml
file di direktori saat ini, yang akan kita buat di langkah berikutnya.
Menyiapkan Otentikasi
Untuk menyiapkan otentikasi HTTP, Anda perlu menginstal httpd-tools
paket.
$ sudo dnf install httpd-tools
Buat file kata sandi di ~/docker-registry/auth
direktori.
$ htpasswd -Bc ~/docker-registry/auth/nginx.htpasswd user1Kata sandi baru:Ketik ulang kata sandi baru:Menambahkan kata sandi untuk pengguna pengguna1
-c
flag menginstruksikan perintah untuk membuat file baru, dan -B
flag adalah menggunakan algoritma bcrypt yang didukung oleh Docker. Ganti user1
dengan nama pengguna pilihan Anda.
Jika Anda ingin menambahkan lebih banyak pengguna, jalankan perintah lagi, tetapi tanpa -c
bendera.
$ htpasswd -B ~/docker-registry/auth/registry.password user2
Sekarang, file akan dipetakan ke wadah registri untuk otentikasi.
Langkah 4 - Instal SSL
Untuk menginstal sertifikat SSL menggunakan Let's Encrypt, kita perlu mengunduh alat Certbot, yang tersedia dari repositori Epel.
Instal repositori EPEL dan Certbot.
$ sudo dnf install epel-release $ sudo dnf install certbot
Buat sertifikat SSL.
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d registry.example.com
Perintah di atas akan mengunduh sertifikat ke /etc/letsencrypt/live/registry.example.com
direktori di server Anda.
Buat grup Diffie-Hellman sertifikat.
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096
Uji perpanjangan sertifikat.
$ sudo certbot perbarui --dry-run
Jika dry run berhasil, itu berarti sertifikat Anda akan diperpanjang secara otomatis.
Salin file Dhparam ke wadah
Salin grup Diffie-Hellman sertifikat ke ~/docker-registry/auth
direktori, yang akan dipetakan ke wadah.
$ sudo cp /etc/ssl/certs/dhparam.pem ~/docker-registry/auth
Langkah 5 - Konfigurasi Nginx
Langkah selanjutnya melibatkan mengonfigurasi server Nginx sebagai proxy front-end untuk server registri Docker. Registri Docker dilengkapi dengan server built-in yang beroperasi pada port 5000. Kami akan meletakkannya di belakang Nginx.
Buat dan buka file ~/docker-registry/auth/nginx.conf
untuk diedit.
$ sudo nano ~/docker-registry/auth/nginx.conf
Tempelkan kode berikut di dalamnya.
acara { worker_connections 1024;}http { upstream docker-registry { server registry:5000; } ## Tetapkan variabel untuk membantu kami memutuskan apakah kami perlu menambahkan header ## 'Docker-Distribution-Api-Version'. ## Registri selalu menyetel header ini. ## Dalam kasus nginx melakukan autentikasi, header tidak disetel ## karena nginx melakukan autentikasi sebelum melakukan proxy. peta $upstream_http_docker_distribution_api_version $docker_distribution_api_version { '' 'registry/2.0'; } server { dengarkan 443 ssl http2; server_name registry.example.com; # SSL ssl_certificate /etc/letsencrypt/live/registry.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/registry.example.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/registry.example.com/chain.pem; access_log /var/log/nginx/registry.access.log; error_log /var/log/nginx/registry.error.log; # Rekomendasi dari https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDALY -RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers aktif; ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1; ssl_session_cache dibagikan:SSL:10m; ssl_dhparam /etc/nginx.d/conf.d/dhparam.pem; penyelesai 8.8.8.8; # nonaktifkan batasan apa pun untuk menghindari HTTP 413 untuk unggahan gambar besar client_max_body_size 0; # diperlukan untuk menghindari HTTP 411:lihat Edisi #1486 (https://github.com/moby/moby/issues/1486) chunked_transfer_encoding aktif; lokasi /v2/ { # Jangan izinkan koneksi dari buruh pelabuhan 1.5 dan sebelumnya # buruh pelabuhan pra-1.6.0 tidak mengatur agen pengguna dengan benar pada ping, tangkap agen pengguna "Go *" if ($http_user_agent ~ "^(docker\/ 1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" ) { return 404; } # Untuk menambahkan otentikasi dasar ke v2, gunakan pengaturan auth_basic. auth_basic "Registry realm"; auth_basic_user_file /etc/nginx/conf.d/nginx.htpasswd; ## Jika $docker_distribution_api_version kosong, header tidak ditambahkan. ## Lihat direktif peta di atas di mana variabel ini didefinisikan. add_header 'Docker-Distribution-Api-Version' $docker_distribution_api_version selalu; proxy_pass http://docker-registry; proxy_set_header Host $http_host; # diperlukan untuk kepentingan klien buruh pelabuhan proxy_set_header X-Real-IP $remote_addr; # meneruskan IP klien nyata proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $skema; proxy_read_timeout 900; } }}
Simpan file dengan menekan Ctrl + X dan memasukkan Y ketika diminta setelah selesai.
Konfigurasikan SELinux untuk mengizinkan koneksi jaringan untuk Private Docker Registry.
$ sudo setsebool -P httpd_can_network_connect on
Langkah 6 - Luncurkan Registri Docker
Beralih ke direktori Docker Registry.
$ cd ~/docker-registry
Luncurkan wadah buruh pelabuhan.
$ docker-compose up -d
Periksa status kontainer.
$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES88d6addc1687 nginx:alpine "/docker-entrypoint...." 5 menit yang lalu Naik 5 menit 80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp docker-registry_nginx_12b112edc1c72 registry:2 "/entrypoint.sh /etc..." 5 menit yang lalu Naik 5 menit 5000/tcp docker-registry_registry_1
Masuk ke registri Docker.
$ login buruh pelabuhan -u=testuser -p=testpassword https://registry.example.com
Anda juga dapat membuka URL https://registry.example.com/v2/
di browser Anda, dan itu akan meminta nama pengguna dan kata sandi. Anda akan melihat halaman kosong dengan {} di atasnya.
Anda dapat memeriksa URL di terminal menggunakan curl
.
$ curl -u testuser -X DAPATKAN https://registry.nspeaks.xyz/v2/Masukkan sandi host untuk pengguna 'testuser':{}
Unduh image buruh pelabuhan Ubuntu terbaru.
$ docker tarik ubuntu:terbaru
Tandai gambar ini untuk registri pribadi.
$ tag buruh pelabuhan ubuntu:registri terbaru.example.com/ubuntu2004
Dorong gambar ke registri.
$ docker push registry.example.com/ubuntu2004
Uji apakah push telah berhasil.
$ curl -u testuser -X DAPATKAN https://registry.nspeaks.xyz/v2/_catalogMasukkan kata sandi host untuk pengguna 'testuser':{"repositories":["ubuntu2004"]}
Masukkan kata sandi otentikasi Nginx Anda saat diminta, dan Anda akan melihat daftar repositori yang tersedia melalui registri.
Periksa daftar gambar Docker yang saat ini tersedia untuk digunakan.
$ docker imagesREPOSITORY TAG ID GAMBAR UKURAN YANG DIBUATregistry 2 d3241e050fc9 5 hari yang lalu 24.2MBnginx alpine 53722defe627 5 hari yang lalu 23.4MBhttpd 2 118b6abfbf55 5 hari yang lalu 144MBubuntu ff0fea8310f3 terbaru 10fea8310f3 2 minggu lalu 72.8MBregistry terakhir 72.8MB MB
Langkah 7 - Akses dan Gunakan registri Docker dari Mesin Klien
Masuk ke server klien Anda. Pada langkah 1, kami menginstal Docker di mesin klien.
Masuk ke registri Docker pribadi dari mesin klien.
$ login buruh pelabuhan -u=testuser -p=testpassword https://registry.example.com
Tarik gambar Ubuntu dari registri.
$ docker pull registry.example.com/ubuntu2004
Buat daftar semua gambar di mesin klien Anda.
$ docker imagesREPOSITORY TAG ID GAMBAR UKURAN DIBUATregistry.nspeaks.xyz/ubuntu2004 ff0fea8310f3 terbaru 2 minggu lalu 72.8MB
Buat dan luncurkan wadah menggunakan gambar yang diunduh.
$ docker run -it registry.example.com/ubuntu2004 /bin/bash
Anda akan masuk ke Shell di dalam wadah Ubuntu.
[dilindungi email]:
Jalankan perintah berikut untuk memeriksa versi Linux.
[email protected]$ cat /etc/os-releaseNAME="Ubuntu"VERSION="20.04.4 LTS (Focal Fossa)"ID=ubuntuID_LIKE=debianPRETTY_NAME="Ubuntu 20.04.4 LTS"VERSION_ID="20.04"HOME_URL ="https://www.ubuntu.com/"SUPPORT_URL="https://help.ubuntu.com/"BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"PRIVACY_POLICY_URL="https:// www.ubuntu.com/legal/terms-and-policies/privacy-policy"VERSION_CODENAME=focalUBUNTU_CODENAME=focal
Sekarang, Anda dapat mulai menggunakan registri Docker dari mesin klien Anda.
Kesimpulan
Ini mengakhiri tutorial kami tentang menyiapkan registri Docker pribadi di server berbasis Rocky Linux 8 yang menggunakan Amazon S3 sebagai penyimpanan. Jika Anda memiliki pertanyaan, kirimkan di komentar di bawah.