Container VM ハンズオン

23 Jul 2016

Daigo Ikeda

Knightso, LLC

Profile

Daigo Ikeda
@hogedigo
ikeda@knightso.co.jp

Knightso, LLC
http://www.knightso.co.jp/
Shizuoka, JAPAN

2

コンテナとは?

3

VM vs コンテナ

4

Container-VM Imageとは?

5

Container-Optimized Google Compute Engine Images(Open Preview)

6

Container-VM Image(beta)

7

vs Google Container Engine(GKE)

8

ハンズオン

9

目標

10

事前準備

11

12

Dockerのビルド環境を作成

または

ローカル&gcloudの場合

$ gcloud auth login  
$ gcloud init

プロジェクトやzoneを選択しておく

13

アプリケーション作成

14

app.go

package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello, Container VM!")
    })
    http.ListenAndServe(":8080", nil)
}
15

テスト実行

$ go run app.go

プレビュー(cloud shell)

停止

Ctrl+C
16

Dockerfile

FROM golang:1.6-onbuild
MAINTAINER Your Name
17

Docker build

ビルド

$ docker build -t testapp .

テスト実行

$ docker run -p 8080:8080 testapp

プレビュー(cloud shell)

停止

Ctrl+C
18

Push

Container Registryにpushする

$ docker tag testapp us.gcr.io/gcpug-containervm/testapp
$ gcloud docker push us.gcr.io/gcpug-containervm/testapp

[Container Engine] - [Container Registry]の画面でpushされているか確認する

19

Container-Optimized Images(Open Preview)

20

Containers.yaml

apiVersion: v1
kind: Pod
metadata:
  name: testapp
spec:
  containers:
    - name: testapp
      image: us.gcr.io/your-project-id/testapp
      imagePullPolicy: Always
      ports:
        - containerPort: 8080
          hostPort: 80
21

インスタンス作成

現状container-vm imageは画面から選択出来ない為、gcloudコマンドで行う

$ gcloud compute instances create testapp --zone us-central1-b --image-family container-vm \
--image-project google-containers --machine-type n1-standard-1 --tags "http-server" \
--metadata-from-file google-container-manifest=containers.yaml

ブラウザで確認

22

インスタンスグループをオートスケールさせてみる

23

インスタンステンプレート作成

現状container-vm imageは画面から選択出来ない為、gcloudコマンドで行う

※ preemptibleを指定

$ gcloud compute instance-templates create testapp-tmpl --image-family container-vm \
--image-project google-containers --machine-type n1-standard-1 --network "default" \
--maintenance-policy "TERMINATE" --preemptible --boot-disk-size "20" \
--boot-disk-type "pd-standard" --boot-disk-device-name "testapp" --tags "http-server" \
--metadata-from-file google-container-manifest=containers.yaml

[Compute Engine] - [Instance templates]にtestapp-tmplというインスタンステンプレートが作成されているか確認

24

インスタンスグループ作成

インスタンステンプレートtestapp-tmplを選択し、[CREATE INSTANCE GROUP]をクリック

Autoscaling: On
他項目: 任意

[Create]で作成

25

ロードバランサ設定

インスタンスグループに対してロードバランサを設定する

ここでは割愛する m(_ _)m

26

Container-VM Image(beta)

27

基本操作

インスタンス作成

$ gcloud compute instances create testapp2 --zone us-central1-b \
--image-family gci-stable --image-project google-containers --machine-type n1-standard-1 \
--tags "http-server"

ログイン

ローカルから

$ gcloud compute ssh testapp2 --zone us-central1-b

または

28

ユーザーをDockerグループにする

$ sudo usermod -a -G docker ${USER}
$ exec sudo su ${USER}

これをしないとログインユーザーからDocker daemonに接続出来ない。
sudo dockerでもdockerは実行出来るが、現状private Container Registoryに接続出来ていない為ユーザーで操作する。

29

docker login

Container Registryにdocker loginする。
container-vmにスクリプトが用意されている。

$ /usr/share/google/dockercfg_update.sh

rootで実行したい場合はsudoでdocker loginしておく必要があるが、container-vmでは/rootがread-onlyになっている様で失敗する
現状解決方法不明(´・ω・`)

30

実行

$ docker run -d -i -t -p 80:8080 --restart unless-stopped --name testapp2 \
us.gcr.io/gcpug-containervm/testapp

ブラウザで表示されることを確認

31

参考: 自動実行

現状うまくいっていない(´・ω・`)

user-data.yaml

#cloud-config

write_files:
- path: /etc/systemd/system/testapp.service
  permissions: 0644
  owner: root
  content: |
    [Unit]
    Description=GCPUG Shonan container-vm test app

    [Service]
    ExecStart=docker run -d -i -t -p 80:8080 --restart unless-stopped --name testapp2 us.gcr.io/gcpug-containervm/testapp

runcmd:
- systemctl daemon-reload
- systemctl start testapp.service
32

インスタンス作成

metadata(key=user-data)に作成したyamlを指定

$ gcloud compute instances create testapp2 --zone us-central1-b \
--image-family gci-stable --image-project google-containers --machine-type n1-standard-1 \
--tags "http-server" --metadata-from-file user-data=user-data.yaml
33

最後に

お金がかかってしまうので、作成したインスタンス等削除しておきましょう。

34

Thank you

23 Jul 2016

Daigo Ikeda

Knightso, LLC

Use the left and right arrow keys or click the left and right edges of the page to navigate between slides.
(Press 'H' or navigate to hide this message.)