この資料では、Docker for Windows を使って Windows OS 上で Linux ベースのアプリを開発する方法、そして Web アプリを含む Docker コンテナをクラウド環境(Azure 環境)に展開する方法について解説します。
※ 本資料では Docker の Linux コンテナのみを取り扱います。(Windows コンテナは取り扱いません。Windows OS で使い慣れたエディタや開発環境を使いつつ、Docker for Windows を活用して Linux 上でデバッグを行う、というシナリオを扱っています。)
※ 資料の概要は以下の blog エントリを参照してください。
https://blogs.msdn.microsoft.com/nakama/2018/09/27/dockerandazure/
IoT Devices Compliant with JC-STAR Using Linux as a Container OSTomohiro Saneyoshi
?
Security requirements for IoT devices are becoming more defined, as seen with the EU Cyber Resilience Act and Japan’s JC-STAR.
It's common for IoT devices to run Linux as their operating system. However, adopting general-purpose Linux distributions like Ubuntu or Debian, or Yocto-based Linux, presents certain difficulties. This article outlines those difficulties.
It also, it highlights the security benefits of using a Linux-based container OS and explains how to adopt it with JC-STAR, using the "Armadillo Base OS" as an example.
Feb.25.2025@JAWS-UG IoT
23. ハンズオン(課題):課題アプリを
Dockerで実装
ホストVMのIP取得方法
$ ip route
default via 10.146.0.1 dev eth0 proto dhcp metric 100
10.146.0.1 dev eth0 proto dhcp scope link metric 100
10.146.0.49 dev eth0 proto kernel scope link src 10.146.0.49 metric 100
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
$ export HOST_IP=`ip route | grep docker | awk '{print $9}'`
$ echo $HOST_IP
172.17.0.1
24. ハンズオン終了?答え合わせ
GCEで作業用サーバを構築する
(事前にやっておくかも)
GCEにSSHする
ホームディレクトリで
$ cd app/mysql/
$ view Dockerfile
$ sudo docker build ./ -t mysql:1.0
Sending build context to Docker daemon 8.192 kB
…
Successfully built e34c079ee87a
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 1.0 e34c079ee87a 42 seconds ago 372 MB
docker.io/mysql 5.7 98455b9624a9 2 weeks ago 372 MB
$ sudo docker run --name mysql -itd -p 3306:3306 mysql:1.0
1ce14b24bba7d2328ccbbc3a18f7bb2801c776c396ef17608390f8c282520f0d
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1ce14b24bba7 mysql:1.0 "docker-entrypoint..." 8 seconds ago Up 7 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
$ mysql -h127.0.0.1 -uuser -ppassword
Warning: Using a password on the command line interface can be insecure.
…
mysql>
25. ハンズオン終了?答え合わせ
GCEで作業用サーバを構築する
(事前にやっておくかも)
GCEにSSHする
ホームディレクトリで
$ cd app/backend/
$ view Dockerfile
$ sudo docker build ./ -t backend:1.0
Sending build context to Docker daemon 20.48 kB
…
Successfully built 575c86da500c
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
backend 1.0 575c86da500c 18 seconds ago 235 MB
mysql 1.0 e34c079ee87a 4 minutes ago 372 MB
docker.io/alpine latest cdf98d1859c1 2 days ago 5.53 MB
docker.io/mysql 5.7 98455b9624a9 2 weeks ago 372 MB
$ sudo docker run --name backend -itd -e MYSQL_IP=$HOST_IP -p 9200:9200 backend:1.0
c4fcca19bea6227ddd9d6205bfb65d2c3e53591ef58d31629ff77e790513d731
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c4fcca19bea6 backend:1.0 "/bin/sh -c 'pytho..." 14 seconds ago Up 13 seconds 0.0.0.0:9200->9200/tcp backend
1ce14b24bba7 mysql:1.0 "docker-entrypoint..." 3 minutes ago Up 3 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
$ curl localhost:9200/tasks
[]
28. Kubernetes用語集
? Cluster
? k8s上で実行される一つのサービス環境
? Node
? ワーカーマシン(物理マシン or VM)
? Pod
? Kubernetes上のデプロイ最小単位で
1つ以上のコンテナを持つ
? Pod内のコンテナは同じノードで動作
? PodごとにIPアドレスが振られる
Container α
Container β
Container γ
Pod A Pod B
Node 1
Container α
Container β
Container γ
Pod A Pod B
Node 2
k8s Cluster
29. Kubernetes用語集
? ReplicaSet
? Podのレプリカのグループ
? 指定の数だけPodを起動して、その数を維持
? Deployment
? ReplicaSetの世代管理を行う設計図の役割
? ローリングアップデート、ロールバックが可能
? Service
? Podとの通信に単一の
エンドポイントを提供する
管理概念
通信概念
Deployment
ReplicaSet
Pod A Pod B
Service
Pod A
Pod B
ReplicaSetを管理
Podの数を管理
Podへ振り分け
ServiceのIPで
アクセス
192.0.2.1
44. ハンズオン(演習):GKEで課題アプリ
を立てる
1.DockerイメージをContainer Registryにpush
GUI:https://console.cloud.google.com/gcr/images/
$ export NAME=[YOUR_NAME]
$ export PROJCT=[GCP_PROJECT_ID]
$ sudo docker tag mysql:1.0 asia.gcr.io/caas-ho-01-76304299/mysql-$NAME:1.0
$ sudo docker tag backend:1.0 asia.gcr.io/caas-ho-01-76304299/backend-$NAME:1.0
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
asia.gcr.io/caas-project/backend-gossy 1.0 a71a4c162b3d About an hour ago 235 MB
backend 1.0 a71a4c162b3d About an hour ago 235 MB
apache 1.0 d7b1249a1f7a About an hour ago 10.4 MB
asia.gcr.io/ caas-project/mysql-gossy 1.0 ce751d780388 About an hour ago 372 MB
mysql 1.0 ce751d780388 About an hour ago 372 MB
docker.io/alpine latest cdf98d1859c1 2 days ago 5.53 MB
docker.io/mysql 5.7 98455b9624a9 2 weeks ago 372 MB
$ sudo gcloud docker -- push asia.gcr.io/$PROJECT/mysql-$NAME:1.0
WARNING: `gcloud docker` will not be supported for Docker client versions above 18.03.
…
1.0: digest: sha256:c8e81dfff7d8a09c0528fd81f704631984edea29ddd901204cda43f834573dd8 size: 2828
$ sudo gcloud docker -- push asia.gcr.io/ $PROJECT/backend-$NAME:1.0
WARNING: `gcloud docker` will not be supported for Docker client versions above 18.03.
…
1.0: digest: sha256:03a1435aa95f3521c16bba650f4390902115a4022b6643f80d482568dba96ed0 size: 1367
45. ハンズオン(演習):GKEで課題アプリ
を立てる
2.kubernetesクラスタ(node)を作成
GUI:https://console.cloud.google.com/kubernetes/list
$ gcloud container clusters create --num-nodes=1 caas-${NAME} --region asia-northeast1 --machine-type g1-small --enable-autoscaling --min-nodes=1 --
max-nodes=2
WARNING: In June 2019, node auto-upgrade will be enabled by default for newly created clusters and node pools. To disable it, use the `--no-enable-
autoupgrade` flag.
…
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS
caas-gossy asia-northeast1 1.11.7-gke.12 35.221.91.90 g1-small 1.11.7-gke.12 3 RUNNING
$ gcloud container clusters list
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS
caas-gossy asia-northeast1 1.11.7-gke.12 35.221.91.90 g1-small 1.11.7-gke.12 3 RUNNING
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
gke-caas-gossy-default-pool-1bb7e39c-dg0p Ready <none> 2m v1.11.7-gke.12
gke-caas-gossy-default-pool-4a92f4d4-fqxk Ready <none> 2m v1.11.7-gke.12
gke-caas-gossy-default-pool-644ee183-jt15 Ready <none> 2m v1.11.7-gke.12
46. ハンズオン(演習):GKEで課題アプリ
を立てる
3.MySQLイメージを使ったpodをデプロイし、
外部に公開(deployment ?service 作成)
$ cd app/mysql/
$ envsubst < mysql-deployment.yaml | kubectl create -f -
deployment.extensions/mysql-gossy-deployment created
$ kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
mysql-gossy-deployment 2 2 2 2 26s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-gossy-deployment-56c95f5cc7-k4rqp 1/1 Running 0 47s
mysql-gossy-deployment-56c95f5cc7-scxpc 1/1 Running 0 47s
$ envsubst < mysql-service.yaml | kubectl create -f -
service/mysql-gossy-service created
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.63.240.1 <none> 443/TCP 12m
mysql-gossy-service LoadBalancer 10.63.245.139 <pending> 3306:30555/TCP 42s
47. ハンズオン(演習):GKEで課題アプリ
を立てる
3.MySQLイメージを使ったpodをデプロイし、
外部に公開(deployment ?service 作成)
IN_MYSQL_IP: cluster内でのみ利用できるローカルIP
EX_MYSQL_IP: cluster外でも利用できるグローバルIP
GUI(deployment):https://console.cloud.google.com/kubernetes/workload
GUI(service):https://console.cloud.google.com/kubernetes/discovery
$ kubectl get services mysql-$NAME-service -o=jsonpath="{.spec.clusterIP}"
10.63.245.139
$ kubectl get services mysql-$NAME-service -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"
35.194.102.226
$ export IN_MYSQL_IP=`kubectl get services mysql-$NAME-service -o=jsonpath="{.spec.clusterIP}"`
$ export EX_MYSQL_IP=`kubectl get services mysql-$NAME-service -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"`
$ mysql -h$EX_MYSQL_IP -uuser -ppassword
Warning: Using a password on the command line interface can be insecure.
…
mysql>
48. ハンズオン(演習):GKEで課題アプリ
を立てる
4.backendイメージを使ったpodをデプロイし、
外部に公開(deployment ?service 作成)
$ cd app/backend/
$ envsubst < backend-deployment.yaml | kubectl create -f -
deployment.extensions/backend-gossy-deployment created
$ kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
backend-gossy-deployment 2 2 2 0 10s
mysql-gossy-deployment 2 2 2 2 16m
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
backend-gossy-deployment-5746c85f4b-b84bq 1/1 Running 0 24s
backend-gossy-deployment-5746c85f4b-lg4g4 1/1 Running 0 24s
mysql-gossy-deployment-56c95f5cc7-k4rqp 1/1 Running 0 16m
mysql-gossy-deployment-56c95f5cc7-scxpc 1/1 Running 0 16m
$ envsubst < backend-service.yaml | kubectl create -f -
service/backend-gossy-service created
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
backend-gossy-service LoadBalancer 10.63.254.100 34.85.113.63 9200:30926/TCP 50s
kubernetes ClusterIP 10.63.240.1 <none> 443/TCP 26m
mysql-gossy-service LoadBalancer 10.63.245.139 35.194.102.226 3306:30555/TCP 14m