plumberをAzure Container Instancesで動かす
はじめに
前回Azure Container Instancesを試した際、イメージは公式のサンプルを使いました。
今回は自分でBuildしたDockerコンテナを動かしてみました。題材として以前AWSの方で使っていたplumberを使います。
概要
自作のコンテナをAzure Container Instancesで動かすために、以下の事を行いました。
- コンテナレジストリの作成
- ベースイメージのimport
- イメージのBuild
-
az acr build
だと、レジストリへのPUSHも一緒に行うようです
-
- コンテナインスタンスからコンテナレジストリにアクセスするための認証の設定
- コンテナインスタンスの作成
環境はAzure Cloud Shellを使用しています。
また、Azure Cloud Shellにはdockerコマンドが無かったため、az acr
コマンドで行っています。
参考
やってみた
コード記述
まずはAzure Cloud Shellを実行します。Bashでストレージなし環境を使います。
コードを書いていきます。3つのファイルのコードは以下を使います。
# プロジェクトのディレクトリ作成
mkdir test-plumber && cd test-plumber
# 必要なファイルを作成
touch Dockerfile
touch plumber.R
touch sample.R
# コードを編集します。Azure Cloud Shellがクラシックに切り替わります。
code ./
FROM r-base
COPY sample.R /usr/local/src/
COPY plumber.R /usr/local/src/
WORKDIR /usr/local/src/
# install the linux libraries needed for plumber
RUN apt-get update -qq && apt-get install -y \
libsodium-dev \
libcurl4-gnutls-dev
RUN R -e 'install.packages("plumber")'
EXPOSE 80
ENTRYPOINT ["Rscript", "plumber.R"]
library(plumber)
api <- plumber::plumb("sample.R")
api$run(host = "0.0.0.0", port=80)
#* @get /hello
hw <- function() {
return("Hello, world!")
}
#* @get /hello/<name>/<age:int>
hw <- function(name, age) {
return(paste("Hello", name, "You're", age, "years old", seq=" "))
}
#* @get /fn
hw <- function(x) {
x <- as.numeric(x)
y <- 2 * x + 1
return(y)
}
#irisを読み込み
df <- iris
#* @get /plot
#* @png
hw <- function() {
p <- plot(df$Sepal.Length, df$Sepal.Width,
main="Sample plot", xlab="Sepal.Length", ylab="Sepal.Width")
print(p)
}
レジストリにPUSH
次にリソースグループとコンテナレジストリを作ります。コンテナレジストリは作成時点で料金が発生します。一番安いBasicで作ります。
RES_GROUP=rg-for-plumber
ACR_NAME=forplumber
az group create --resource-group $RES_GROUP --location japaneast
az acr create --resource-group $RES_GROUP --name $ACR_NAME --sku Basic --location japaneast
次にベースとなるイメージであるr-baseを取得します。docker pullの代わりに、az acr importを使います。
# イメージプル。imageオプションを指定しないと library/r-base で作られます
az acr import -n $ACR_NAME --source docker.io/library/r-base --image r-base:latest
# リポジトリ一覧から、r-baseがあることを確認します。
az acr repository list -n $ACR_NAME -o table
sample-plumberという名前でBuildします。
az acr build --image sample-plumber:v1 \
--registry $ACR_NAME \
--file ./Dockerfile .
認証
コンテナレジストリにアクセスする際は認証が必要になります。方法は複数あります。
今回のコンテナインスタンスでは以下を使ってみました。
サービスプリンシパルを作成して、ユーザIDとパスワードを変数に格納します。
SERVICE_PRINCIPAL_NAME=acr-service-principal
ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query id --output tsv)
PASSWORD=$(az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME --scopes $ACR_REGISTRY_ID --role acrpull --query "password" --output tsv)
USER_NAME=$(az ad sp list --display-name $SERVICE_PRINCIPAL_NAME --query "[].appId" --output tsv)
コンテナ作成
その後、コンテナインスタンスを作成します。一部変数で扱っていないものもありますので、そこは適宜変更してください。
az container create \
--resource-group $RES_GROUP \
--name mycontainer \
--image forplumber.azurecr.io/sample-plumber:v1 \
--registry-login-server $(az acr show --name $ACR_NAME --query loginServer --output tsv) \
--registry-username $USER_NAME \
--registry-password $PASSWORD \
--dns-name-label plumber-demo-k7K6feI6H7 --ports 80
コンソールからFQDNの文字列を確認し、http://[FQDNの文字列]/hello
でアクセスできました。
その他、/hello/jiro/21
の場合。
/fn?x=2
の場合。
/plot
の場合。
削除
色々作りましたので、リソースグループごと削除します。
az group delete --name $RES_GROUP
おわりに
今回はplumberをコンテナにしてコンテナレジストリにPUSHして、Azure Container Instancesで動かしてみました。
Dokcerコマンドを使わないでできると聞いてやってみたのですが、不慣れなためか若干使いにくかったです。
この記事がどなたかのお役に立てれば幸いです。
Discussion