1 of 47

Dockerハンズオン

https://goo.gl/7lvcfV

2 of 47

アジェンダ

  • 準備�
  • Docker on GCE
    • Native Docker
    • With Docker-Machine
    • 基本操作�
  • Others
    • Container Registry
    • Container Optimised Image
    • k8s(口頭)�

3 of 47

アジェンダ

  • 準備�

4 of 47

準備

Projectの準備

5 of 47

準備 Projectの準備

  • Develper Consoleへアクセス
  • プロジェクトを何も作ってない人、クリーンなプロジェクトでやりたい人は新たにプロジェクトを作成�
  • 課金設定してない人は設定
    • 無料にしたいなら無料枠の設定も行う
    • どうしても嫌な人は相談してください�

6 of 47

準備

Docker Client

インストール

7 of 47

準備 Docker Clientインストール

不要

8 of 47

準備 Docker Clientインストール

まじで

9 of 47

準備 Docker Clientインストール

不要

10 of 47

準備 Docker Clientインストール

11 of 47

準備

  • Cloud Shell
    • Google Cloud Platformを触るために用意されたブラウザ上で動くShell�
    • 2015年末まで無料(今はβ扱い)�
    • temporaryのGCEが立つ(OS: Debian)�
    • 5GBのディスク、gcloudコマンド、dockerdocker-machine、kubectl(k8sのcli)、いろんな開発ツールがインストール済み

12 of 47

準備

  • Cloud Shell
    • 今回は基本的にCloud Shellを利用して説明していきます。�
    • MacやWinを使っていて、その上でやりたい方は、Docker ToolboxCloud SDKをインストールすればだいたい同じです。

13 of 47

準備

  • Cloud Shell
    • 今回のプロジェクト用にshell変数として以下を設定しておきます。
      • ※以降は ”$ ~”な文はcloud shell、”$(インスタンス名) ~”な 文は対象のインスタンスでの作業とします。

$ export PROJECT_NAME="project-name"

14 of 47

アジェンダ

  • 準備�

15 of 47

アジェンダ

  • 準備�
  • Docker on GCE
    • Native Docker�

16 of 47

Docker on GCE(Native Docker)

  • やること
    • 作る
      • インスタンス起動
      • dockerのインストールは時間がかかるのとハマりやすいので既にインストール済みなCoreOSを使います。�
    • 入る
      • sshでインスタンスに入る�
    • 取得
      • nginxのdocker imageをpullする
    • 起動
      • nginxのdockerコンテナを起動�
    • テスト
      • 起動したnginxに入ってみる

17 of 47

Docker on GCE(Native Docker)

  • 作る
    • インスタンスの起動
      • CoreOSのCompute Engineインスタンスを作成���������
      • Optionの意味
        • preemptible: preemptibleインスタンスを作る(24hでshutdownする 低価格インスタンス)
        • tags "http-server": port:80へのアクセスを許可する

$ export INSTANCE_NAME="インスタンス名"

$ gcloud compute --project $PROJECT_NAME instances create $INSTANCE_NAME \

--zone "us-central1-a" \

--machine-type "f1-micro" \

--preemptible \

--tags "http-server" \

--image-project "coreos-cloud" \

--image "coreos-stable-766-5-0-v20151105"

18 of 47

Docker on GCE(Native Docker)

  • 入る
    • sshで作ったインスタンスへ
      • gcloud compute ssh --project PROJECT_NAME INSTANCE_NAME でssh可能
      • sshトンネリング(port forward)したい場合とかも↑経由で実施�������
      • CoreOS
        • コンテナを利用した巨大なスケールするプラットフォームを作りやすくするために開発された�比較的軽量なOSS Linux Distribution
        • パッケージマネージャ(aptやyum)がなくアプリケーションは基本的にdocker経由で取得する

$ gcloud compute ssh --project $PROJECT_NAME --zone us-central-a $INSTANCE_NAME

$(instance name) docker -v

Docker version 1.7.1, build df2f73d-dirty

19 of 47

Docker on GCE(Native Docker)

  • 取得
    • nginxのdocker imageを取得
      • docker pull IMAGENAME で取得��������
      • alpine
        • 超軽量Linux Distribution (5MB)
          • 何も入ってない
        • DockerのImageは小さいほうがpullが速くなりスケールアウトする時に有利になる

$(instance name) docker pull connexiolabs/alpine-nginx

latest: Pulling from connexiolabs/alpine-nginx

511136ea3c5a: Pull complete

b0b08730b93c: Pull complete

f83928bbe904: Pull complete

...

Status: Downloaded newer image for connexiolabs/alpine-nginx:latest

20 of 47

Docker on GCE(Native Docker)

  • 起動
    • nginxのdockerコンテナを起動
      • docker run <OPTIONS> IMAGENAME <COMMAND> で起動�����
      • オプション
        • -d バックエンドで起動
        • --name コンテナに名前をつける
        • -p nn:mm ホストのnn番ポートをコンテナのmm番ポートにPort Forward
      • docker runで起動したコンテナは起動時に指定したコマンド(未指定の場合はデフォルトのコマンド)のプロセスが死ぬまでプロセスが生きている状態になる

$(instance name) docker run -d --name nginx -p 80:80 connexiolabs/alpine-nginx

ハッシュ(2d953fef40b6fc80985d88a1caa02a9aace2a8d1410cbeb70c91c863637c66c1)

21 of 47

Docker on GCE(Native Docker)

  • テスト
    • アクセスしてみる������
      • メタデータサーバ
        • curl "http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip" -H "Metadata-Flavor: Google"
        • GoogleがホストしているメタデータサーバからこのインスタンスのIPアドレスを取得している
        • IPアドレス以外にも様々な情報が取得できる
        • メタデータサーバにはプロジェクト、インスタンスに対して任意の値も設定できる

$(instance name) curl http://localhost

$(instance name) IP_ADDRESS=$(curl "http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip" -H "Metadata-Flavor: Google")

$(instance name) curl http://$IP_ADDRESS

22 of 47

アジェンダ

  • 準備�
  • Docker on GCE
    • Native Docker

23 of 47

アジェンダ

  • 準備�
  • Docker on GCE
    • Native Docker
    • With Docker-Machine

24 of 47

Docker on GCE(With Docker-Machine)

  • やること
    • 作る & 入れる
      • Docker-Machine経由でインスタン起動 & Dockerインストール�
    • 設定
      • Docker Remote APIのクライアント側の設定�
    • 取得&起動
      • nginxのdockerコンテナを取得して起動�
    • テスト
      • 起動したnginxに入ってみる

25 of 47

Docker on GCE(Docker-Machine)

  • 作る & 入れる
    • Docker-Machine経由でインスタンスを上げつつDockerをインストール�������
      • OAuthトークンを発行するために、URLが表示されるのでそのURLへアクセス�最終的に表示されるコードをShellに貼り付ける

$ docker-machine create --driver google --google-project $PROJECT_NAME --google-preemptible --google-scopes "https://www.googleapis.com/auth/cloud-platform" $INSTANCE_NAME

26 of 47

Docker on GCE(Docker-Machine)

  • 設定
    • DockerのRemote APIにアクセスするための設定を行う�docker-machine env [NAME] で表示できる����������
      • 今回はcloud shellからアクセスしているので特に設定は不要ですが、�クライアントPCからアクセスする場合はGCPのFirewallの設定で2376ポートを開ける必要がある

$ docker-machine env $INSTANCE_NAME�

export DOCKER_TLS_VERIFY="1"

export DOCKER_HOST="tcp://146.148.73.118:2376"

export DOCKER_CERT_PATH="/home/keisuke_oohashi/.docker/machine/machines/machine2"

export DOCKER_MACHINE_NAME="machine2"

# Run this command to configure your shell:

# eval "$(docker-machine env machine2)"�

$ eval $(docker-machine env $INSTANCE_NAME)�$ docker info�※ 結果を確認

27 of 47

Docker on GCE(Native Docker)

  • 取得・起動
    • nginxのdockerコンテナを起動(取得していないimageは取得される)
      • docker run <OPTIONS> IMAGENAME <COMMAND> で取得・起動�����
      • 今回はDocker公式imageを利用
      • DockerのImageを探す場合は Docker Hubを参照�https://hub.docker.com/

$ docker run -d --name web -p 80:80 nginx

ハッシュ(2d953fef40b6fc80985d88a1caa02a9aace2a8d1410cbeb70c91c863637c66c1)

28 of 47

Docker on GCE(Native Docker)

  • テスト
    • nginx(コンテナ)の中に入ってみる
      • docker exec <OPTIONS> NAME <COMMAND> でコンテナ内でコマンドを叩ける�������
      • docker 1.7まではホストからコンテナに対してファイルコピーをする時にdocker execでやることが多かった�docker 1.8からは docker cp を利用�����

$ docker exec -it web bash

$(root) ps aux

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

root 1 0.0 0.8 31532 4936 ? Ss 14:46 0:00 nginx: master process nginx -g daemon off;

nginx 7 0.0 0.4 31908 2760 ? S 14:46 0:00 nginx: worker process

root 8 0.3 0.5 20216 3168 ? Ss 16:47 0:00 bash

root 15 0.0 0.3 17492 2152 ? R+ 16:47 0:00 ps aux

29 of 47

アジェンダ

  • 準備�
  • Docker on GCE
    • Native Docker
    • With Docker-Machine

30 of 47

アジェンダ

  • 準備�
  • Docker on GCE
    • Native Docker
    • With Docker-Machine
    • 基本操作

31 of 47

基本操作

  • やること
    • docker stop コンテナの停止
    • docker start コンテナの起動
    • docker restart コンテナを再起動
    • docker logs ログを表示
    • docker cp ファイルコピー
    • docker rm コンテナの削除
    • docker commit 起動中のコンテナから新しいimageを作成
    • docker images イメージ一覧
    • docker ps 起動中のコンテナ一覧
    • docker push registryへimageを登録
    • docker build Dockerfileを利用してimageを作成

32 of 47

基本操作 stop, start, restart

  • stop
    • コンテナを停止する
      • docker stop <OPTIONS> NAME でコンテナを停止���
  • start
    • 停止したコンテナを起動する
      • docker start <OPTIONS> NAME でコンテナを起動����
  • restart
    • コンテナの再起動
      • docker restart <OPTIONS> NAME でコンテナを再起動�����

$ docker stop web

$ docker start web

$ docker restart web

33 of 47

基本操作 logs, cp

  • logs
    • コンテナで起動しているプロセスのログ(標準出力)を取得する
      • docker logs <OPTIONS> NAME でコンテナのログを取得���
  • cp
    • ホスト、コンテナ間でファイルをコピーする
      • docker cp <OPTIONS> NAME:PATH LOCALPATHでコンテナからホストにファイルをコピー����
      • docker cp <OPTIONS> LOCALPATH NAME:PATHでホストからコンテナにファイルをコピー����

$ docker logs web

$ docker cp web:/usr/share/nginx/html/index.html .

$ vi index.html

※ 好きに修正

$ docker cp index.html web:/usr/share/nginx/html/index.html

※ この状態でアクセスして一回確認

34 of 47

基本操作 rm, commit

  • rm
    • コンテナを削除する
      • docker rn <OPTIONS> NAME でコンテナを削除
      • コンテナが停止していないと通常は削除できない、起動しているコンテナを削除する場合は -f をつける�
      • コンテナを削除した場合、コンテナ内で編集した内容は残らない�再度同じイメージを起動しても初期化される����
  • commit
    • 起動中のコンテナからイメージを作る
      • docker commit <OPTIONS> NAME <REPOSITORYNAME<:TAG>>でイメージ化

$ docker rm -f web

$ docker run -d --name web -p 80:80 nginx

※アクセスして元に戻っていることを確認

※再度ファイルを編集しておく cpでもexecでもok

$ docker commit -m "first commit" web mynginx

35 of 47

基本操作 images, ps

  • images
    • ホストに保存されているimageの一覧を表示
      • docker images <OPTIONS> ����
  • ps
    • 起動中(オプションによっては停止した)のコンテナの一覧を取得
      • docker ps

$ docker images�※先ほど保存したimageがあることを確認

$ docker ps

$ docker ps - a

36 of 47

基本操作 push

  • push
    • docker registryにimageをpushする
      • docker push <OPTIONS> NAME:<TAG>
      • image名によってpush先が変わる
        • 未指定( mynginx、 hoge、 fuga)�→ Docker Hubの公式イメージ (基本的にはpush 不可)
        • ユーザー名・グループ名付き (soundtricker/mynginx {ユーザ名}/{イメージ名})�→ Docker Hubのユーザーイメージ
        • レジストリ名付き(localhost:5000/mynginx grc.io/project-name/image-name)�→ 指定したレジストリにpush����

$ docker login�※ 認証が必要なregistryは docker loginで loginする��$ docker tag mynginx soundtricker/mynginx�※ イメージに別名をつける�

$ docker push soundtricker/mynginx

※ docker hubで確認

37 of 47

基本操作 build

  • build
    • Dockerfile経由でimageを作成する
      • docker build <OPTIONS> DOCKERFILEPATH
      • imageを作るときは基本的にDockerfileで作成したほうが良い�※ commitで作るやり方もあるけど、どういうimageなのかわかりにくい
      • Docker Hubで様々なDockerfileが見れるので参考にすると良い��

$ vi Dockerfile�#

from ubuntu

run echo "deb http://us.archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list

run apt-get update

run apt-get install -y redis-server --no-install-recommends

run apt-get upgrade -y && apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/*

expose 6379

entrypoint ["/usr/bin/redis-server"]

#

38 of 47

基本操作 (続)build

  • build����
      • 細かいDockerfileのコマンド群は他の資料とかみて慣れていくといいともいます。
      • 最初は FROM、RUN、CMD、ADD、VOLUME、EXPOSEあたりがわかれば大体OK�

$ docker build -t my-redis ./�$ docker images�$ docker run -d --name redis -p 6379:6379 my-redis��

39 of 47

アジェンダ

  • 準備�
  • Docker on GCE
    • Native Docker
    • With Docker-Machine
    • 基本操作�

40 of 47

アジェンダ

  • 準備�
  • Docker on GCE
    • Native Docker
    • With Docker-Machine
    • 基本操作�
  • Others
    • Container Registry

41 of 47

その他 Cointainer Registry

  • Container Registry
    • 実際に本番環境で利用しようと思うとimageを保存するためにRegistryが必要
    • 選択肢としては
      • 自前で立てる
      • どっかのRegistryを使う
        • Docker Hub
        • Quary.io
        • CoreOS Registry
        • Amazon EC2 Container Registry
        • Google Container Registry
          • 今回はこれを使ってみる

42 of 47

その他 Cointainer Registry

  • Google Container Registry
    • Googleが公式に用意しているContainer Registry
    • 裏側はCloud Storage 表側はGoogleがホストしている
    • Google Developer Consoleに統合されている
    • 課金体系はネットワーク通信費とCloud Storageの価格のみ
    • 認証/PUSHはgcloud コマンド経由で実行����

$ gcloud auth login�$ docker tag my-redis gcr.io/${PROJECT_NAME}/my-redis�$ gcloud docker push gcr.io/${PROJECT_NAME}/my-redis

$ gcloud docker pull gcr.io/${PROJECT_NAME}/my-redis�

43 of 47

その他 Cointainer Registry

  • Google Container Registry
    • dockerコマンドで直接行う場合はdocker loginを使って行う

$ docker login -e 1234@5678.com -u _token -p "$(gcloud auth print-access-token)" https://gcr.io�$ docker push gcr.io/${PROJECT_NAME}/my-redis

$ docker pull gcr.io/${PROJECT_NAME}/my-redis�

44 of 47

アジェンダ

  • 準備�
  • Docker on GCE
    • Native Docker
    • With Docker-Machine
    • 基本操作�
  • Others
    • Container Registry

45 of 47

アジェンダ

  • 準備�
  • Docker on GCE
    • Native Docker
    • With Docker-Machine
    • 基本操作�
  • Others
    • Container Registry
    • Container Optimised Image

46 of 47

その他 Cointainer Optimized Image

  • Google Optimized Image
    • Googleが公式に用意しているコンテナを触るのに最適化した VM Image
    • 中身は単体で動く Kubernetes Worker Node(minion)
    • メタデータにpods.yaml(k8sの設定ファイル)をいれて立ち上げると、dockerコンテナが動かせる����

$ vi containers.yaml�apiVersion: v1

kind: Pod

metadata:

name: simple-echo

spec:

containers:

- name: simple-echo

image: gcr.io/google-containers/busybox

command: ['nc', '-p', '8080', '-l', '-l', '-e', 'echo', 'hello world!']

imagePullPolicy: Always

ports:

- containerPort: 8080

hostPort: 8080

47 of 47

その他 (続)Cointainer Optimized Image

  • Google Optimized Image���������
    • 正直微妙(k8s or Docker-Compose 使ったほうが良い)

���

$ gcloud compute instances create containervm-test-1 \

--image container-vm \

--metadata-from-file google-container-manifest=containers.yaml \

--zone us-central1-a \

--machine-type f1-micro��$ gcloud compute ssh --zone us-central1-a containervm-test-1�$ nc localhost 8080