Tutorial: Menyusun dan menyebarkan gambar kontainer di cloud dengan Azure Container Registry Tasks

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

Siklus pengembangan "inner-loop" adalah proses berulang dari penulisan kode, membangun, dan menguji aplikasi Anda sebelum berkomitmen pada kontrol sumber. Tugas cepat memperluas lingkaran dalam Anda ke cloud, memberi Anda validasi keberhasilan build dan dorongan otomatis dari gambar yang berhasil dibuat ke registri kontainer Anda. Gambar Anda dibuat secara asli di cloud, dekat dengan registri Anda, sehingga memungkinkan penyebaran yang lebih cepat.

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

Dalam tutorial ini, bagian pertama dari seri:

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

Dalam tutorial berikutnya, Anda belajar menggunakan ACR Tasks untuk build gambar kontainer otomatis pada penerapan 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

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

Repositori sampel fork

Selanjutnya, gunakan GitHub UI untuk fork sampel ke akun GitHub Anda. Dalam tutorial ini, Anda menyusun gambar kontainer dari sumber di repo, dan dalam tutorial berikutnya, Anda mendorong penerapan ke garpu repo Anda untuk memulai tugas otomatis.

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

Cuplikan layar tombol Fork (disorot) di GitHub

Mengkloning fork Anda

Setelah Anda membuat repo, kloning fork Anda dan masukkan direktori yang berisi klon lokal Anda.

Kloning repo dengan git, ganti <nama-pengguna-github-Anda> 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 shell

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

Persiapkan lingkungan Anda untuk Azure CLI

Menyusun di Azure dengan ACR Tasks

Sekarang setelah Anda menarik kode sumber ke mesin Anda, ikuti langkah-langkah ini untuk membuat registri kontainer dan menyusun gambar kontainer dengan ACR Tasks.

Untuk mempermudah menjalankan perintah sampel, tutorial dalam seri ini menggunakan variabel lingkungan shell. Jalankan perintah berikut untuk mengatur variabel ACR_NAME. 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 hanya variabel pertama ini.

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 ACR Tasks untuk membuat gambar kontainer dari kode sampel. Jalankan perintah az acr build untuk melakukan tugas cepat.

Catatan

Dockerfile yang digunakan dalam contoh berikut bergantung pada gambar kontainer dasar publik dari Docker Hub. Untuk meningkatkan keandalan saat menggunakan konten publik, impor, dan mengelola gambar dalam registri kontainer Azure pribadi, serta memperbarui Dockerfile Anda untuk menggunakan gambar dasar yang dikelola secara pribadi. Pelajari selengkapnya tentang bekerja dengan gambar 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 contoh berikut. Anda dapat melihat pengunggahan kode sumber ("konteks") ke Azure, dan detail operasi docker build yang dijalankan tugas ACR di cloud. Karena tugas ACR menggunakan docker build untuk membangun gambar Anda, tidak ada perubahan pada Dockerfiles Anda yang diperlukan untuk segera mulai menggunakan ACR Tasks.

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...
2020/11/18 18:31:42 Using acb_vol_01185991-be5f-42f0-9403-a36bb997ff35 as the home volume
2020/11/18 18:31:42 Setting up Docker configuration...
2020/11/18 18:31:43 Successfully set up Docker configuration
2020/11/18 18:31:43 Logging in to registry: myregistry.azurecr.io
2020/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
2020/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
2020/11/18 18:32:43 Successfully pushed image: myregistry.azurecr.io/helloacrtasks:v1
2020/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

Mendekati akhir output, ACR Tasks menampilkan dependensi yang ditemukan untuk gambar Anda. Ini memungkinkan ACR Tasks mengotomatiskan build gambar pada pembaruan gambar dasar, seperti saat gambar dasar diperbarui dengan OS atau patch kerangka kerja. Anda mempelajari tentang dukungan ACR Tasks untuk pembaruan gambar dasar nanti dalam seri tutorial ini.

Terapkan ke Azure Container Instances

ACR Tasks secara otomatis mendorong gambar yang berhasil dibuat ke registri Anda secara default, sehingga Anda dapat segera menyebarkannya dari registri Anda.

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

Konfigurasikan autentikasi registri

Semua skenario produksi harus menggunakan perwakilan layanan untuk mengakses registri kontainer Azure. Perwakilan layanan memungkinkan Anda untuk memberikan kontrol akses berbasis peran ke gambar kontainer Anda. Misalnya, Anda dapat mengonfigurasi perwakilan layanan dengan akses hanya tarik ke registri.

Membuat brankas kunci

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

AKV_NAME=$ACR_NAME-vault

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

Membuat perwakilan 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 berikut:

# Create service principal, store its password in AKV (the registry *password*)
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 acrpull \
                --query password \
                --output tsv)

Argumen --role dalam perintah sebelumnya mengonfigurasi perwakilan layanan dengan peran acrpull, yang memberinya akses hanya tarik ke registri. Untuk memberikan akses push dan pull, ubah --role argumen ke acrpush.

Selanjutnya, simpan appId perwakilan layanan di brankas, yaitu nama pengguna yang Anda berikan 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 dengan nama ketika Anda atau aplikasi dan layanan Anda menarik gambar dari registri.

Meyebarkan kontainer dengan Azure CLI

Sekarang setelah kredensial utama layanan disimpan sebagai rahasia Azure Key Vault, aplikasi dan layanan Anda dapat menggunakannya untuk mengakses registri pribadi 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.

Memverifikasi 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 pertama-tama menampilkan status kontainer saat menarik gambar dan memulai, lalu mengikat STDOUT dan STDERR konsol lokal Anda ke kontainer.

Container 'acr-tasks' is in state 'Running'...
(count: 1) (last timestamp: 2020-11-18 18:39:10+00:00) pulling image "myregistry.azurecr.io/helloacrtasks:v1"
(count: 1) (last timestamp: 2020-11-18 18:39:15+00:00) Successfully pulled image "myregistry.azurecr.io/helloacrtasks:v1"
(count: 1) (last timestamp: 2020-11-18 18:39:17+00:00) Created container
(count: 1) (last timestamp: 2020-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, navigasi ke FQDN kontainer di browser Anda untuk melihat aplikasi yang sedang berjalan. FQDN seharusnya ditampilkan dalam output 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.

Bersihkan 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. Namun sumber daya ini digunakan dalam tutorial berikutnya dalam seri, jadi Anda mungkin ingin menyimpannya jika melanjutkan langsung ke tutorial berikutnya.

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

Langkah berikutnya

Sekarang setelah Anda menguji perulangan dalam dengan tugas cepat, konfigurasikan tugas build untuk memicu build gambar kontainer saat Anda menerapkan kode sumber ke repositori Git: