Contenu connexe Similaire à 半日でわかる コンテナー技術 (入門編) (20) 半日でわかる コンテナー技術 (入門編)2. 自己紹介
{
“名前” : “真壁 徹(まかべ とおる)”,
“所属” : “日本マイクロソフト株式会社”,
“役割” : “クラウド ソリューションアーキテクト”,
“経歴” : “大和総研 → HP Enterprise”,
“特技” : “クラウド & オープンソース”,
“資格” : “CNCF Certified Kubernetes Admin.”,
“Twitter” : “@tmak_tw”
}
18. Dockerとは
ハードウェア
ハイパーバイザー (e.g. Hyper-V)
仮想マシン
OSカーネル
コンテナー コンテナー
ランタイム/
ライブラリー
ランタイム/
ライブラリー
アプリ アプリ
+周辺ツール
• UNIX、BSD、Linuxの世界でコンテナー
技術は昔からあった
• OSの各種リソース管理機能を活用して
リソースを分離する
• dotCloud(現Docker)社が自社PaaS向け
に作ったコンテナーの仕組みをOSSにし
てブレイク
• 従来のコンテナー技術より、アプリ開
発者視点でうれしい機能、周辺ツール
に力を入れている
• イメージ作成、配布の仕組み
• 差分イメージ形式
• 標準化の勢いでDockerの影響力は弱ま
りつつあるが、広く普及している
コンテナーイメージ
24. $ cd clouddrive
$ git clone https://github.com/ToruMakabe/conteriner-handson.git
$ cd conteriner-handson/primer/ch01/
演習用リポジトリを取得し、移動
$HOME/clouddrive 以下はAzure
Filesのファイルシェアとして参照で
きるため、作業ディレクトリとして
おすすめ (必須ではありません)
32. $ ./create_nginx_container_on_aci.sh
Name ResourceGroup Status Image IP:ports Network CPU/Memory
OsType Location
----------------------- ----------------- -------- ------- --------------- --------- --------------- -
------- ----------
tomakabe-cho-ch01-nginx tomakabe-cho-ch01 Running nginx 52.183.37.59:80 Public 1.0 core/1.5 gb
Linux westus2
スクリプトを実行
37. $ cat ./create_wc_container_on_aci.sh
#!/bin/bash
az container create ¥
-g $RG_CH01 ¥
-n ${RG_CH01}-wordcount ¥
--image microsoft/aci-wordcount:latest ¥
--restart-policy OnFailure
(続く)
スクリプトの確認 (1/2)
Docker Hubにあるaci-
wordcountイメージを取
得(後ほど説明)
コンテナーの再起動を失敗時
に限定 (=アプリケーション
正常終了とともに停止)
39. FROM python:3.6.2-slim
COPY * /
RUN pip install html2text && pip install urllib3 && pip install sh
ENV NumWords=10 MinLength=0
CMD python wordcount.py http://shakespeare.mit.edu/hamlet/full.html
どんなコンテナーか
https://github.com/seanmck/aci-wordcount
読み込んだ文章の単語数をカウ
ントするPythonプログラム。
シェイクスピアのハムレットを
読むよう指定している
このファイルはDockerfileといい、
コンテナーイメージの作成に使いま
す (第2章で解説)
41. (続き)
az container show ¥
-g $RG_CH01 ¥
-n ${RG_CH01}-wordcount ¥
--query containers[0].instanceView.currentState.state
az container logs ¥
-g $RG_CH01 ¥
-n ${RG_CH01}-wordcount
スクリプトの確認 (2/2)
コンテナーの状態を取得
コンテナーの実行ログを取得
42. $ ./create_wc_container_on_aci.sh
Name ResourceGroup Status Image CPU/Memory
OsType Location
--------------------------- ----------------- --------- ------------------------------ --------------- -
------- ----------
tomakabe-cho-ch01-wordcount tomakabe-cho-ch01 Succeeded microsoft/aci-wordcount:latest 1.0 core/1.5 gb
Linux westus2
Result
----------
Terminated
[('the', 990), ('and', 702), ('of', 628), ('to', 610), ('I', 544), ('you', 495), ('a', 453), ('my', 441),
('in', 399), ('HAMLET', 386)]
スクリプトを実行
実行後にコンテナーは削除
ログに実行結果が残っている
47. .
├── Dockerfile
├── README.md
└── wordcount.py
0 directories, 3 files
aci-wordcountイメージはどう作られたか
https://github.com/seanmck/aci-wordcount
このディレクトリでコンテナーをビルドすると、
Dockerfileに書かれた手順に従ってコンテナー
イメージが出来上がります
48. FROM python:3.6.2-slim
COPY * /
RUN pip install html2text && pip install urllib3 && pip install sh
ENV NumWords=10 MinLength=0
CMD python wordcount.py http://shakespeare.mit.edu/hamlet/full.html
Dockerfile
https://github.com/seanmck/aci-wordcount
ベースイメージはpython:3.6.2-slim
Pyhton:3.6.2-slim
(Base Image)
wordcount.py
(User Application)
html2text, urllib3, sh
(Python Package)
49. #
# NOTE: THIS DOCKERFILE IS GENERATED VIA "update.sh"
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#
FROM debian:stretch-slim
# ensure local python is preferred over distribution python
ENV PATH /usr/local/bin:$PATH
(以下略)
ベースイメージの中身も確認
https://github.com/docker-
library/python/blob/88812635c8ad7ff06a8a3755616a1040df222f3c/3.6/stretch/slim/Dockerfile
Pyhton:3.6.2-slim
(Base Image)
wordcount.py
(User Application)
html2text, urllib3, sh
(Python Package)
debian:stretch-slim
(Base of Base Image)
51. $ docker pull microsoft/aci-wordcount
Using default tag: latest
latest: Pulling from microsoft/aci-wordcount
aa18ad1a0d33: Pull complete
1b1ad4542c99: Pull complete
f55f6bdb976a: Pull complete
c91d00a04662: Pull complete
37de53ca9f34: Pull complete
905557d139be: Pull complete
c13204906a3a: Pull complete
Digest: sha256:c6b8a2641ef27bcc29bd465131ba5b80d5965dba42ddf1be6a2fe25ba331349c
Status: Downloaded newer image for microsoft/aci-wordcount:latest
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
microsoft/aci-wordcount latest cb6dd82ba7c6 11 months ago 212MB
レイヤーは確認できる (1/2)
1度取得したレイヤーは次から
ダウンロードされない
(注) Azure Cloud Shellではdocker pullするのに
別途Dockerサーバーを用意する必要があります
52. $ docker history cb6dd82ba7c6
IMAGE CREATED CREATED BY SIZE COMMENT
cb6dd82ba7c6 11 months ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "pyth… 0B
<missing> 11 months ago /bin/sh -c #(nop) ENV NumWords=10 MinLength… 0B
<missing> 11 months ago /bin/sh -c pip install html2text && pip inst… 6.76MB
<missing> 11 months ago /bin/sh -c #(nop) COPY multi:5344d46158ade6b… 26.1kB
<missing> 13 months ago /bin/sh -c #(nop) CMD ["python3"] 0B
<missing> 13 months ago /bin/sh -c set -ex; apt-get update; apt-g… 6.51MB
<missing> 13 months ago /bin/sh -c #(nop) ENV PYTHON_PIP_VERSION=9.… 0B
<missing> 13 months ago /bin/sh -c cd /usr/local/bin && ln -s idle3… 32B
<missing> 13 months ago /bin/sh -c set -ex && buildDeps=" dpkg-de… 67.5MB
<missing> 13 months ago /bin/sh -c #(nop) ENV PYTHON_VERSION=3.6.2 0B
<missing> 13 months ago /bin/sh -c #(nop) ENV GPG_KEY=0D96DF4D4110E… 0B
<missing> 13 months ago /bin/sh -c apt-get update && apt-get install… 8.11MB
<missing> 13 months ago /bin/sh -c #(nop) ENV LANG=C.UTF-8 0B
<missing> 13 months ago /bin/sh -c #(nop) ENV PATH=/usr/local/bin:/… 0B
<missing> 13 months ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 13 months ago /bin/sh -c #(nop) ADD file:d7333b3e0bc6479d2… 123MB
レイヤーは確認できる (2/2)
(注) Azure Cloud Shellではdocker historyするのに
別途Dockerサーバーを用意する必要があります
59. $ cat ./create_acr.sh
#!/bin/bash
az group create -n $RG_RGST -l japaneast
az acr create ¥
-g $RG_RGST ¥
-n $ACR ¥
--sku Standard ¥
--admin-enabled true
$ ./create_acr.sh
リソースグループ(ACR向け)とACRを作成
ACRを作成
61. $ cat main.go
(中略)
func handler(w http.ResponseWriter, r *http.Request) {
hostname, err := os.Hostname()
if err != nil {
panic(err)
}
fmt.Fprintln(w, "[Hostname]")
fmt.Fprintln(w, hostname)
fmt.Fprintln(w)
fmt.Fprintln(w, "[Messages]")
fmt.Fprintln(w, "Hello World!")
}
(以下略)
演習用アプリケーションの確認
ホスト名を取得
ホスト名を表示
メッセージを表示
コンテナーを実行するホスト名
とHello World!を表示するWebア
プリケーションです(Go言語)
62. $ cat Dockerfile
# build stage
ARG GO_VERSION=1.11.1
FROM golang:${GO_VERSION}-alpine AS build-stage
WORKDIR /tmp
COPY ./ /tmp
RUN go build -o main main.go
# production stage
FROM alpine:3.8
WORKDIR /root/
COPY --from=build-stage /tmp/main .
EXPOSE 80
CMD ["./main"]
Dockerfileの確認
ビルド用ベースイメー
ジはGo言語のビルド
ツール入り
実行用ベースイ
メージは軽量に
ビルド用と実行用のベースイ
メージを分けて、実行イメージ
を軽くすることができます
(マルチステージビルド)
ビルドステージで作っ
た成果物をコピー
63. $ cat build_container.sh
#!/bin/bash
az acr build ¥
--registry $ACR ¥
--image disp-hostname:0.0.1 ¥
--context .
ビルド用スクリプトを確認
イメージ名をdisp-hostname
とし、タグ(:以降)でバージョ
ンを表現しています
ビルドに必要なファイルの場
所を指定します
64. $ ./build_container.sh
The behavior of this command has been altered by the following extension: acrbuildext
Sending build context (1.155 KiB) to ACR
Queued a build with ID: ae1
(中略)
2018/10/23 06:40:20 Successfully populated digests for step ID: build
2018/10/23 06:40:20 Step ID: push marked as successful (elapsed time in seconds: 19.848761)
Run ID: ae1 was successful after 1m7s
ビルド用スクリプトを実行
66. $ cat ./create_disphostname_container_on_aci.sh
#!/bin/bash
PASS=$(az acr credential show -n $ACR -o tsv --query passwords[0].value)
az container create ¥
-g $RG_CH02 ¥
-n ${RG_CH02}-disphostname ¥
--registry-login-server ${ACR}.azurecr.io ¥
--registry-username ${ACR} ¥
--registry-password $PASS ¥
--image ${ACR}.azurecr.io/disp-hostname:0.0.1 ¥
--ip-address public
$ ./create_disphostname_container_on_aci.sh
コンテナー作成スクリプトの確認と実行
ACRのパスワー
ドを取得
先ほど作成した
イメージを指定
69. バージョンアップ ビルドスクリプトの確認と実行
$ cat ./build_container_v2.sh
#!/bin/bash
az acr build ¥
--registry $ACR ¥
--image disp-hostname:0.0.2 ¥
--context .
$ ./build_container_v2.sh
タグが “0.0.2” に
70. $ cat ./update_disphostname_container_v2_on_aci.sh
#!/bin/bash
PASS=$(az acr credential show -n $ACR -o tsv --query passwords[0].value)
az container create ¥
-g $RG_CH02 ¥
-n ${RG_CH02}-disphostname ¥
--registry-login-server ${ACR}.azurecr.io ¥
--registry-username ${ACR} ¥
--registry-password $PASS ¥
--image ${ACR}.azurecr.io/disp-hostname:0.0.2 ¥
--ip-address public
$ ./update_disphostname_container_v2_on_aci.sh
コンテナーバージョンアップ
タグを変更
77. Containers in Azure
Choice of developer tools and clients
Azure Container Registry Docker Hub
App Service
Azureの歴史ある
PaaSサービス
GitやVisual Studio
に限らずDockerコ
ンテナーでのデプ
ロイにも対応
Service Fabric
マイクロソフトの
開発する分散処理
基盤
.NETアプリケー
ションとの相性が
いい
Kubernetes Service Container Instance
コンテナーオーケスト
レーターの事実上標準
Ecosystem
パートナーとの
協業
コンテナー1つから
使えるマネージド
サービス
AKSの仮想ノードと
しても利用可能
78. Azure Kubernetes Service (AKS)
API server
Controller
ManagerScheduler
etcd
Store
Cloud
Controller
Self-managed master node(s)
• コンテナーオーケストレーターの
事実上標準
• CNCF(Cloud Native Computing
Foundation)がオープンな開発を
リード
• 可用性を高める仕組み
• 拡張性を高める仕組み
• 自己修復
• 構築や維持が負担が大きいが、
Azureはマネージドサービスとして
提供
• アプリによっては、やや大げさな
規模感
Customer VMs
App/
workload
definitionUser
Docker
Pods
Docker
Pods
Docker
Pods
Docker
Pods
Docker
Pods
Schedule pods over
private tunnel
Kubernetes
API endpoint
Azure managed control plane
79. Azure Web App for Containers
Kubernetesまでは要らないWebアプリケーションに
歴史あるWebアプリケーションPaaS
PaaSらしく、構築、デプロイ、運用が非常に楽
HTTPS(TLS)化、自動スケールアウト、デプロイメントスロット切替
2017年、Dockerコンテナーのデプロイに対応
アプリの公開可能ポートが80/443のみ、という制約を受け入れられれ
ば、強力な選択肢
AKSは次回(応用編)のテーマとし、本日はこちらを演習
84. (続き)
az webapp create ¥
-g $RG_CH03 ¥
-p ${RG_CH03}-appsvcplan ¥
-n ${RG_CH03}-disphostname ¥
-i ${ACR}.azurecr.io/disp-hostname:0.0.1
az webapp config container set ¥
-g $RG_CH03 ¥
-n ${RG_CH03}-disphostname ¥
--docker-custom-image-name ${ACR}.azurecr.io/disp-hostname:0.0.1 ¥
--docker-registry-server-url ${ACR}.azurecr.io ¥
--docker-registry-server-user $ACR ¥
--docker-registry-server-password $PASS
$ ./create_disphostname_container_on_appsvc.sh
App Service PlanとWeb Appを作成 (2/2)
第2部で作成したイメージ
を指定
ACRの認証情報を設定
87. $ cat ./create_staging_slot.sh
#!/bin/bash
PASS=$(az acr credential show -n $ACR -o tsv --query passwords[0].value)
az webapp deployment slot create ¥
-g $RG_CH03 ¥
-n ${RG_CH03}-disphostname ¥
-s staging ¥
--configuration-source ${RG_CH03}-disphostname
(続く)
ステージングスロットを作成 (1/2)
先ほど作成したWeb Appのス
テージングスロットを作る
88. (続き)
az webapp config container set ¥
-g $RG_CH03 ¥
-n ${RG_CH03}-disphostname ¥
-s staging ¥
--docker-custom-image-name ${ACR}.azurecr.io/disp-hostname:0.0.2 ¥
--docker-registry-server-url ${ACR}.azurecr.io ¥
--docker-registry-server-user $ACR ¥
--docker-registry-server-password $PASS
$ ./create_staging_slot.sh
ステージングスロットを作成 (2/2)
ACRの認証情報を設定
コンテナーの新
バージョンを指定
90. $ cat ./swap_slot.sh
#!/bin/bash
az webapp deployment slot swap ¥
-g $RG_CH03 ¥
-n ${RG_CH03}-disphostname ¥
--slot staging ¥
--target-slot production
$ ./swap_slot.sh
スロットの入れ替え
ステージングスロットとプロダ
クションスロットを入れ替え
94. $ cd ../ch02
$ cat ./cleanup_acr.sh
#!/bin/bash
az group delete -n $RG_RGST
$ ./cleanup_acr.sh
おつかれさまでした (ACRも消します)