Tutorial: Membangun dan menyebarkan gambar kontainer di cloud dengan Tugas Azure Container Registry

Tugas ACR adalah serangkaian fitur dalam Azure Container Registry yang menyediakan build gambar kontainer Docker yang efisien dan efisien di Azure. Dalam artikel ini, Anda akan mempelajari cara menggunakan fitur tugas cepat Tugas ACR.

Siklus pengembangan "inner-loop" adalah proses berulang menulis kode, membangun, dan menguji aplikasi Anda sebelum berkomitmen pada kontrol sumber. Tugas cepat memperluas siklus internal Anda ke cloud, memberikan validasi sukses build dan pengiriman otomatis gambar yang berhasil dibuat ke registri kontainer Anda. Gambar Anda dibangun secara asli di cloud, dekat dengan registri Anda, memungkinkan penyebaran yang lebih cepat.

Semua keahlian Dockerfile Anda dapat ditransfer langsung ke Tugas ACR. Anda tidak perlu mengubah Dockerfiles untuk melakukan pembangunan di cloud dengan ACR Tasks, hanya perintah yang Anda jalankan.

Dalam tutorial ini, bagian satu dari seri:

  • Mendapatkan contoh kode sumber aplikasi
  • Membangun gambar kontainer di Azure
  • Menyebarkan kontainer ke Azure Container Instances

Dalam tutorial berikutnya, Anda belajar menggunakan Tugas ACR untuk membangun gambar kontainer secara otomatis pada komit kode dan pembaruan gambar dasar. ACR Tasks juga dapat menjalankan tugas multi-langkah, menggunakan file YAML untuk menentukan langkah-langkah dalam membangun, mendorong, dan secara opsional menguji beberapa kontainer.

Prasyarat

Akun GitHub

Buat akun https://github.com jika Anda belum memilikinya. Seri tutorial ini menggunakan repositori GitHub untuk menunjukkan build gambar otomatis dalam Tugas ACR.

Repositori sampel hasil fork

Selanjutnya, gunakan gitHub UI untuk fork repositori sampel ke akun GitHub Anda. Dalam tutorial ini, Anda membangun sebuah image kontainer dari sumber di repositori, dan dalam tutorial berikutnya, Anda mendorong sebuah commit ke fork dari repositori Anda untuk memulai tugas otomatis.

Fork repositori ini: https://github.com/Azure-Samples/acr-build-helloworld-node

Cuplikan layar tombol Fork (disorot) di GitHub

Kloning fork Anda

Setelah Anda melakukan fork pada repositori, lakukan kloning dari fork tersebut dan masuk ke direktori yang berisi hasil kloning lokal Anda.

Kloning repo dengan git, ganti <your-github-username> dengan nama pengguna GitHub Anda:

git clone https://github.com/<your-github-username>/acr-build-helloworld-node

Masukkan direktori yang berisi kode sumber:

cd acr-build-helloworld-node

Bash, sebuah shell

Perintah dalam seri tutorial ini diformat untuk shell Bash. Jika Anda lebih suka menggunakan PowerShell, Prompt Perintah, atau shell lain, Anda mungkin perlu menyesuaikan kelanjutan baris dan format variabel lingkungan yang sesuai.

Persiapkan lingkungan Anda untuk Azure CLI

Membangun di Azure dengan Tugas ACR

Sekarang setelah Anda menarik kode sumber ke komputer Anda, ikuti langkah-langkah ini untuk membuat registri kontainer dan membangun gambar kontainer dengan Tugas ACR.

Untuk mempermudah eksekusi perintah sampel, tutorial dalam seri ini menggunakan variabel lingkungan shell. Jalankan perintah berikut untuk mengatur ACR_NAME variabel. Ganti <nama> registri dengan nama unik untuk registri kontainer baru Anda. Nama registri harus unik dalam Azure, hanya berisi huruf kecil, dan berisi 5-50 karakter alfanumerik. Sumber daya lain yang Anda buat dalam tutorial didasarkan pada nama ini, jadi Anda harus memodifikasi variabel pertama ini saja.

ACR_NAME=<registry-name>

Dengan variabel lingkungan registri kontainer yang diisi, Anda sekarang harus dapat menyalin dan menempelkan sisa perintah dalam tutorial tanpa mengedit nilai apa pun. Jalankan perintah berikut untuk membuat grup sumber daya dan registri kontainer.

RES_GROUP=$ACR_NAME # Resource Group name

az group create --resource-group $RES_GROUP --location eastus
az acr create --resource-group $RES_GROUP --name $ACR_NAME --sku Standard --location eastus

Sekarang setelah Anda memiliki registri, gunakan Tugas ACR untuk membangun gambar kontainer dari kode sampel. Jalankan perintah az acr build untuk melakukan tugas cepat.

Nota

Dockerfile yang digunakan dalam contoh berikut bergantung pada gambar kontainer dasar publik dari Docker Hub. Untuk meningkatkan keandalan saat menggunakan konten publik, impor dan kelola gambar di registri kontainer Azure privat, dan perbarui Dockerfile Anda untuk menggunakan gambar dasar yang dikelola secara privat. Pelajari lebih lanjut cara menangani citra publik.

az acr build --registry $ACR_NAME --image helloacrtasks:v1 --file /path/to/Dockerfile /path/to/build/context.

Output dari perintah az acr build mirip dengan yang berikut ini. Anda dapat melihat unggahan kode sumber ("konteks") ke Azure, dan detail docker build operasi yang dijalankan tugas ACR di cloud. Karena Tugas ACR menggunakan docker build untuk membangun gambar Anda, Anda tidak perlu mengubah Dockerfile Anda agar dapat segera mulai menggunakan Tugas ACR.

Packing source code into tar file to upload...
Sending build context (4.813 KiB) to ACR...
Queued a build with build ID: da1
Waiting for build agent...
2023/11/18 18:31:42 Using acb_vol_01185991-be5f-42f0-9403-a36bb997ff35 as the home volume
2023/11/18 18:31:42 Setting up Docker configuration...
2023/11/18 18:31:43 Successfully set up Docker configuration
2023/11/18 18:31:43 Logging in to registry: myregistry.azurecr.io
2023/11/18 18:31:55 Successfully logged in
Sending build context to Docker daemon   21.5kB
Step 1/5 : FROM node:15-alpine
15-alpine: Pulling from library/node
Digest: sha256:8dafc0968fb4d62834d9b826d85a8feecc69bd72cd51723c62c7db67c6dec6fa
Status: Image is up to date for node:15-alpine
 ---> a56170f59699
Step 2/5 : COPY . /src
 ---> 88087d7e709a
Step 3/5 : RUN cd /src && npm install
 ---> Running in e80e1263ce9a
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN helloworld@1.0.0 No repository field.

up to date in 0.1s
Removing intermediate container e80e1263ce9a
 ---> 26aac291c02e
Step 4/5 : EXPOSE 80
 ---> Running in 318fb4c124ac
Removing intermediate container 318fb4c124ac
 ---> 113e157d0d5a
Step 5/5 : CMD ["node", "/src/server.js"]
 ---> Running in fe7027a11787
Removing intermediate container fe7027a11787
 ---> 20a27b90eb29
Successfully built 20a27b90eb29
Successfully tagged myregistry.azurecr.io/helloacrtasks:v1
2023/11/18 18:32:11 Pushing image: myregistry.azurecr.io/helloacrtasks:v1, attempt 1
The push refers to repository [myregistry.azurecr.io/helloacrtasks]
6428a18b7034: Preparing
c44b9827df52: Preparing
172ed8ca5e43: Preparing
8c9992f4e5dd: Preparing
8dfad2055603: Preparing
c44b9827df52: Pushed
172ed8ca5e43: Pushed
8dfad2055603: Pushed
6428a18b7034: Pushed
8c9992f4e5dd: Pushed
v1: digest: sha256:b038dcaa72b2889f56deaff7fa675f58c7c666041584f706c783a3958c4ac8d1 size: 1366
2023/11/18 18:32:43 Successfully pushed image: myregistry.azurecr.io/helloacrtasks:v1
2023/11/18 18:32:43 Step ID acb_step_0 marked as successful (elapsed time in seconds: 15.648945)
The following dependencies were found:
- image:
    registry: myregistry.azurecr.io
    repository: helloacrtasks
    tag: v1
    digest: sha256:b038dcaa72b2889f56deaff7fa675f58c7c666041584f706c783a3958c4ac8d1
  runtime-dependency:
    registry: registry.hub.docker.com
    repository: library/node
    tag: 15-alpine
    digest: sha256:8dafc0968fb4d62834d9b826d85a8feecc69bd72cd51723c62c7db67c6dec6fa
  git: {}

Run ID: da1 was successful after 1m9.970148252s

Di dekat akhir output, Tugas ACR menampilkan dependensi yang ditemukan untuk gambar Anda. Ini memungkinkan Tugas ACR untuk mengotomatiskan pembuatan citra pada pembaruan citra dasar, seperti ketika citra dasar diperbarui dengan tambalan OS atau patch framework. Anda akan mempelajari tentang dukungan Tugas ACR untuk pembaruan citra dasar nanti dalam seri tutorial ini.

Terapkan ke Azure Container Instances

Tugas ACR secara otomatis mendorong gambar yang berhasil dibangun ke registri Anda secara default, memungkinkan Anda untuk segera menyebarkannya dari registri Anda.

Di bagian ini, Anda membuat Azure Key Vault dan perwakilan layanan, lalu menyebarkan kontainer ke Azure Container Instances (ACI) menggunakan kredensial perwakilan layanan.

Mengonfigurasi autentikasi registri

Semua skenario produksi harus menggunakan prinsipal layanan untuk mengakses registri kontainer Azure. Prinsipal layanan memungkinkan Anda untuk memberikan kontrol akses berbasis peran ke citra kontainer Anda. Misalnya, Anda dapat mengonfigurasi perwakilan layanan dengan akses pull-only ke registri.

Buat penyimpanan kunci

Jika Anda belum memiliki vault di Azure Key Vault, buat vault dengan Azure CLI menggunakan perintah berikut.

AKV_NAME=$ACR_NAME-vault

az keyvault create --resource-group $RES_GROUP --name $AKV_NAME

Membuat prinsipal layanan dan menyimpan kredensial

Anda sekarang perlu membuat perwakilan layanan dan menyimpan kredensialnya di brankas kunci Anda.

Gunakan perintah az ad sp create-for-rbac untuk membuat perwakilan layanan, dan az keyvault secret set untuk menyimpan kata sandi perwakilan layanan di vault. Gunakan Azure CLI versi 2.25.0 atau yang lebih baru untuk perintah ini:

Peran yang benar untuk digunakan dalam penetapan peran tergantung pada apakah registri telah diaktifkan ABAC atau belum.

# Create service principal, store its password in AKV (the registry *password*)
ROLE="Container Registry Repository Reader" # For ABAC-enabled registries. For non-ABAC registries, use AcrPull.
az keyvault secret set \
  --vault-name $AKV_NAME \
  --name $ACR_NAME-pull-pwd \
  --value $(az ad sp create-for-rbac \
                --name $ACR_NAME-pull \
                --scopes $(az acr show --name $ACR_NAME --query id --output tsv) \
                --role "$ROLE" \
                --query password \
                --output tsv)

Argumen --role dalam perintah sebelumnya mengonfigurasi perwakilan layanan dengan peran bawaan untuk memberinya akses pull-only ke registri. Peran yang benar untuk digunakan dalam penetapan peran tergantung pada apakah registri diaktifkan ABAC atau tidak, dengan registri yang diaktifkan ABAC membutuhkan peran Container Registry Repository Reader dan registri non-ABAC membutuhkan peran AcrPull.

Untuk memberikan akses push dan pull, ubah argumen --role ke peran Container Registry Repository Writer untuk registri berbasis ABAC, atau peran AcrPush untuk registri yang tidak berbasis ABAC.

Untuk informasi selengkapnya tentang Microsoft Entra ABAC, lihat Izin repositori berbasis Microsoft Entra.

Selanjutnya, simpan appId perwakilan layanan di vault, yang merupakan nama pengguna yang Anda teruskan ke Azure Container Registry untuk autentikasi:

# Store service principal ID in AKV (the registry *username*)
az keyvault secret set \
    --vault-name $AKV_NAME \
    --name $ACR_NAME-pull-usr \
    --value $(az ad sp list --display-name $ACR_NAME-pull --query [].appId --output tsv)

Anda telah membuat Azure Key Vault dan menyimpan dua rahasia di dalamnya:

  • $ACR_NAME-pull-usr: ID perwakilan layanan, untuk digunakan sebagai nama pengguna registri kontainer.
  • $ACR_NAME-pull-pwd: Kata sandi perwakilan layanan, untuk digunakan sebagai kata sandi registri kontainer.

Anda sekarang dapat mereferensikan rahasia ini berdasarkan nama saat Anda atau aplikasi dan layanan Anda menarik gambar dari registri.

Menyebarkan kontainer dengan Azure CLI

Sekarang setelah kredensial perwakilan layanan disimpan sebagai rahasia Azure Key Vault, aplikasi dan layanan Anda dapat menggunakannya untuk mengakses registri privat Anda.

Jalankan perintah az container create berikut untuk menyebarkan instans kontainer. Perintah ini menggunakan kredensial perwakilan layanan yang disimpan di Azure Key Vault untuk mengautentikasi ke registri kontainer Anda.

az container create \
    --resource-group $RES_GROUP \
    --name acr-tasks \
    --image $ACR_NAME.azurecr.io/helloacrtasks:v1 \
    --registry-login-server $ACR_NAME.azurecr.io \
    --registry-username $(az keyvault secret show --vault-name $AKV_NAME --name $ACR_NAME-pull-usr --query value -o tsv) \
    --registry-password $(az keyvault secret show --vault-name $AKV_NAME --name $ACR_NAME-pull-pwd --query value -o tsv) \
    --dns-name-label acr-tasks-$ACR_NAME \
    --query "{FQDN:ipAddress.fqdn}" \
    --output table

Nilai --dns-name-label harus unik dalam Azure, sehingga perintah sebelumnya menambahkan nama registri kontainer Anda ke label nama DNS kontainer. Output dari perintah menampilkan nama domain kontainer yang sepenuhnya memenuhi syarat (FQDN), misalnya:

FQDN
----------------------------------------------
acr-tasks-myregistry.eastus.azurecontainer.io

Perhatikan FQDN kontainer, Anda akan menggunakannya di bagian berikutnya.

Verifikasi proses penyebaran

Untuk menonton proses startup kontainer, gunakan perintah az container attach :

az container attach --resource-group $RES_GROUP --name acr-tasks

Output az container attach mula-mula memperlihatkan status kontainer saat mengunduh image dan menjalankannya, lalu menghubungkan STDOUT dan STDERR konsol lokal Anda ke milik kontainer tersebut.

Container 'acr-tasks' is in state 'Running'...
(count: 1) (last timestamp: 2023-11-18 18:39:10+00:00) pulling image "myregistry.azurecr.io/helloacrtasks:v1"
(count: 1) (last timestamp: 2023-11-18 18:39:15+00:00) Successfully pulled image "myregistry.azurecr.io/helloacrtasks:v1"
(count: 1) (last timestamp: 2023-11-18 18:39:17+00:00) Created container
(count: 1) (last timestamp: 2023-11-18 18:39:17+00:00) Started container

Start streaming logs:
Server running at http://localhost:80

Saat Server running at http://localhost:80 muncul, navigasikan ke FQDN kontainer di browser Anda untuk melihat aplikasi yang sedang berjalan. FQDN seharusnya telah ditampilkan pada output dari perintah az container create yang Anda jalankan di bagian sebelumnya.

Contoh aplikasi yang berjalan di browser

Untuk melepaskan konsol Anda dari kontainer, tekan Control+C.

Membersihkan sumber daya

Hentikan instans kontainer dengan perintah az container delete:

az container delete --resource-group $RES_GROUP --name acr-tasks

Untuk menghapus semua sumber daya yang telah Anda buat dalam tutorial ini, termasuk registri kontainer, brankas kunci, dan perwakilan layanan, terbitkan perintah berikut. Sumber daya ini digunakan dalam tutorial berikutnya dalam seri, bagaimanapun, jadi Anda mungkin ingin menyimpannya jika Anda melanjutkan langsung ke tutorial berikutnya.

az group delete --resource-group $RES_GROUP
az ad sp delete --id http://$ACR_NAME-pull

Langkah selanjutnya

Sekarang setelah Anda menguji inner loop dengan tugas cepat, konfigurasikan tugas build untuk memicu build image kontainer saat Anda meng-commit kode sumber ke repositori Git: