SlideShare a Scribd company logo
1 of 47
Dockerハンズオン
https://goo.gl/7lvcfV
アジェンダ
� 準備
� Docker on GCE
Native Docker
With Docker-Machine
基本操作
� Others
Container Registry
Container Optimised Image
アジェンダ
� 準備
準備
Projectの準備
準備 Projectの準備
� Develper Consoleへアクセス
https://console.developers.google.com
� プロジェクトを何も作ってない人、クリーンなプロジェクトでやりたい人は新たに
プロジェクトを作成
� 課金設定してない人は設定
無料にしたいなら無料枠の設定も行う
どうしても嫌な人は相談してください
準備
Docker Client
インストール
準備 Docker Clientインストール
不要
準備 Docker Clientインストール
まじで
準備 Docker Clientインストール
不要
準備 Docker Clientインストール
準備
� Cloud Shell
Google Cloud Platformを触るために用意されたブラウザ上で動くShell
2015年末まで無料(今はβ扱い)
temporaryのGCEが立つ(OS: Debian)
5GBのディスク、gcloudコマンド、docker、docker-machine、kubectl(k8sのcli)、いろんな開発ツ
ールがインストール済み
準備
� Cloud Shell
今回は基本的にCloud Shellを利用して説明していきます。
MacやWinを使っていて、その上でやりたい方は、Docker ToolboxとCloud SDKをインストールすれば
だいたい同じです。
準備
� Cloud Shell
今回のプロジェクト用にshell変数として以下を設定しておきます。
※以降は ”$ ~”な文はcloud shell、”$(インスタンス名) ~”な 文は対象のインスタンスでの作業
とします。
$ export PROJECT_NAME="project-name"
アジェンダ
� 準備
アジェンダ
� 準備
� Docker on GCE
Native Docker
Docker on GCE(Native Docker)
� やること
作る
インスタンス起動
dockerのインストールは時間がかかるのとハマりやすいので既にインストール済みなCoreOSを使
います。
入る
sshでインスタンスに入る
取得
nginxのdocker imageをpullする
Docker on GCE(Native Docker)
� 作る
インスタンスの起動
CoreOSのCompute Engineインスタンスを作成
Optionの意味
preemptible: preemptibleインスタンスを作る(24hでshutdownする 低価格インスタンス)
$ 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"
Docker on GCE(Native Docker)
� 入る
sshで作ったインスタンスへ
gcloud compute ssh --project PROJECT_NAME INSTANCE_NAME でssh可能
sshトンネリング(port forward)したい場合とかも↑経由で実施
CoreOS
コンテナを利用した巨大なスケールするプラットフォームを作りやすくするために開発され
$ gcloud compute ssh --project $PROJECT_NAME --zone us-central-a $INSTANCE_NAME
$(instance name) docker -v
Docker version 1.7.1, build df2f73d-dirty
Docker on GCE(Native Docker)
� 取得
nginxのdocker imageを取得
docker pull IMAGENAME で取得
alpine
超軽量Linux Distribution (5MB)
何も入ってない
$(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
Docker on GCE(Native Docker)
� 起動
nginxのdockerコンテナを起動
docker run <OPTIONS> IMAGENAME <COMMAND> で起動
オプション
-d バックエンドで起動
--name コンテナに名前をつける
-p nn:mm ホストのnn番ポートをコンテナのmm番ポートにPort Forward
$(instance name) docker run -d --name nginx -p 80:80 connexiolabs/alpine-nginx
ハッシュ(2d953fef40b6fc80985d88a1caa02a9aace2a8d1410cbeb70c91c863637c66c1)
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アドレスを取得してい
る
$(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
アジェンダ
� 準備
� Docker on GCE
Native Docker
アジェンダ
� 準備
� Docker on GCE
Native Docker
With Docker-Machine
Docker on GCE(With Docker-Machine)
� やること
作る & 入れる
Docker-Machine経由でインスタン起動 & Dockerインストール
設定
Docker Remote APIのクライアント側の設定
取得&起動
nginxのdockerコンテナを取得して起動
テスト
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
� 設定
DockerのRemote APIにアクセスするための設定を行う
docker-machine env [NAME] で表示できる
今回はcloud shellからアクセスしているので特に設定は不要ですが、
Docker on GCE(Docker-Machine)
$ 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
※ 結果を確認
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)
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
アジェンダ
� 準備
� Docker on GCE
Native Docker
With Docker-Machine
アジェンダ
� 準備
� Docker on GCE
Native Docker
With Docker-Machine
基本操作
基本操作
� やること
docker stop コンテナの停止
docker start コンテナの起動
docker restart コンテナを再起動
docker logs ログを表示
docker cp ファイルコピー
docker rm コンテナの削除
docker commit 起動中のコンテナから新しいimageを作成
docker images イメージ一覧
基本操作 stop, start, restart
� stop
コンテナを停止する
docker stop <OPTIONS> NAME でコンテナを停止
� start
停止したコンテナを起動する
docker start <OPTIONS> NAME でコンテナを起動
$ docker stop web
$ docker start web
$ docker restart web
基本操作 logs, cp
� logs
コンテナで起動しているプロセスのログ(標準出力)を取得する
docker logs <OPTIONS> NAME でコンテナのログを取得
� cp
ホスト、コンテナ間でファイルをコピーする
docker cp <OPTIONS> NAME:PATH LOCALPATHでコンテナからホストにファイルをコピー
$ 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
※ この状態でアクセスして一回確認
基本操作 rm, commit
� rm
コンテナを削除する
docker rn <OPTIONS> NAME でコンテナを削除
コンテナが停止していないと通常は削除できない、起動しているコンテナを削除する場合は -f を
つける
コンテナを削除した場合、コンテナ内で編集した内容は残らない
再度同じイメージを起動しても初期化される
� commit
$ docker rm -f web
$ docker run -d --name web -p 80:80 nginx
※アクセスして元に戻っていることを確認
※再度ファイルを編集しておく cpでもexecでもok
$ docker commit -m "first commit" web mynginx
基本操作 images, ps
� images
ホストに保存されているimageの一覧を表示
docker images <OPTIONS>
� ps
起動中(オプションによっては停止した)のコンテナの一覧を取得
docker ps
$ docker images
※先ほど保存したimageがあることを確認
$ docker ps
$ docker ps - a
基本操作 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で確認
基本操作 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"]
#
基本操作 (続)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
アジェンダ
� 準備
� Docker on GCE
Native Docker
With Docker-Machine
基本操作
アジェンダ
� 準備
� Docker on GCE
Native Docker
With Docker-Machine
基本操作
� Others
Container Registry
その他 Cointainer Registry
� Container Registry
実際に本番環境で利用しようと思うとimageを保存するためにRegistryが必要
選択肢としては
自前で立てる
https://hub.docker.com/_/registry/
https://hub.docker.com/r/google/docker-registry/
どっかのRegistryを使う
Docker Hub
Quary.io
CoreOS Registry
その他 Cointainer Registry
� Google Container Registry
Googleが公式に用意しているContainer Registry
裏側はCloud Storage 表側はGoogleがホストしている
Google Developer Consoleに統合されている
https://console.developers.google.com/kubernetes/images/list
課金体系はネットワーク通信費と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
その他 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
アジェンダ
� 準備
� Docker on GCE
Native Docker
With Docker-Machine
基本操作
� Others
Container Registry
アジェンダ
� 準備
� Docker on GCE
Native Docker
With Docker-Machine
基本操作
� Others
Container Registry
Container Optimised Image
その他 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
その他 (続)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

More Related Content

What's hot

Dockerハンズオン
DockerハンズオンDockerハンズオン
Dockerハンズオン
Kazuyuki Mori
 

What's hot (20)

Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴Docker最新動向2017秋+セキュリティの落とし穴
Docker最新動向2017秋+セキュリティの落とし穴
 
Docker実践入門
Docker実践入門Docker実践入門
Docker実践入門
 
Docker 1.12 & Swarm Mode Introduction ~ Docker の新しい技術と swarm モードの紹介
Docker 1.12 & Swarm Mode Introduction ~ Docker の新しい技術と swarm モードの紹介Docker 1.12 & Swarm Mode Introduction ~ Docker の新しい技術と swarm モードの紹介
Docker 1.12 & Swarm Mode Introduction ~ Docker の新しい技術と swarm モードの紹介
 
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
 
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
 
Dockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニックDockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニック
 
2015-07-27 Docker Introduction 〜Dockerの基礎とユースケースに関する考察〜
2015-07-27 Docker Introduction 〜Dockerの基礎とユースケースに関する考察〜2015-07-27 Docker Introduction 〜Dockerの基礎とユースケースに関する考察〜
2015-07-27 Docker Introduction 〜Dockerの基礎とユースケースに関する考察〜
 
JAWS-UG コンテナ支部 Docker入門 ハンズオン
JAWS-UG コンテナ支部 Docker入門 ハンズオンJAWS-UG コンテナ支部 Docker入門 ハンズオン
JAWS-UG コンテナ支部 Docker入門 ハンズオン
 
JAWS-UG コンテナ支部 Docker入門 10分ハンズオン
JAWS-UG コンテナ支部 Docker入門 10分ハンズオンJAWS-UG コンテナ支部 Docker入門 10分ハンズオン
JAWS-UG コンテナ支部 Docker入門 10分ハンズオン
 
Dockerライフサイクルの基礎 地雷を踏み抜けろ!
Dockerライフサイクルの基礎 地雷を踏み抜けろ!Dockerライフサイクルの基礎 地雷を踏み抜けろ!
Dockerライフサイクルの基礎 地雷を踏み抜けろ!
 
とある社内ビックデータ基盤にバッチ用コンテナ基盤を構築してみた
とある社内ビックデータ基盤にバッチ用コンテナ基盤を構築してみたとある社内ビックデータ基盤にバッチ用コンテナ基盤を構築してみた
とある社内ビックデータ基盤にバッチ用コンテナ基盤を構築してみた
 
Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版
 
Docker地雷n本勝負
Docker地雷n本勝負Docker地雷n本勝負
Docker地雷n本勝負
 
今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門
 
Dockerハンズオン
DockerハンズオンDockerハンズオン
Dockerハンズオン
 
捕鯨!詳解docker
捕鯨!詳解docker捕鯨!詳解docker
捕鯨!詳解docker
 
分散環境におけるDocker とオーケストレーション
分散環境におけるDocker とオーケストレーション分散環境におけるDocker とオーケストレーション
分散環境におけるDocker とオーケストレーション
 
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでDockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
 
アプリ屋もDockerをドカドカ使おう ~ Docker入門
アプリ屋もDockerをドカドカ使おう ~ Docker入門アプリ屋もDockerをドカドカ使おう ~ Docker入門
アプリ屋もDockerをドカドカ使おう ~ Docker入門
 
Dockerと継続的インテグレーション
Dockerと継続的インテグレーションDockerと継続的インテグレーション
Dockerと継続的インテグレーション
 

Similar to Dockerハンズオン

Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Masahiro Nagano
 
20150101勉強会 dokku alt
20150101勉強会 dokku alt20150101勉強会 dokku alt
20150101勉強会 dokku alt
Shugo Numano
 

Similar to Dockerハンズオン (20)

ゆるふわなDockerの使い方
ゆるふわなDockerの使い方ゆるふわなDockerの使い方
ゆるふわなDockerの使い方
 
Webアプリケーション開発者のためのDockerハンズオン
Webアプリケーション開発者のためのDockerハンズオンWebアプリケーション開発者のためのDockerハンズオン
Webアプリケーション開発者のためのDockerハンズオン
 
Docker超入門
Docker超入門Docker超入門
Docker超入門
 
Webアプリケーション開発者のためのDockerハンズオン20210519
Webアプリケーション開発者のためのDockerハンズオン20210519Webアプリケーション開発者のためのDockerハンズオン20210519
Webアプリケーション開発者のためのDockerハンズオン20210519
 
Dockerでlamp環境を作って見る
Dockerでlamp環境を作って見るDockerでlamp環境を作って見る
Dockerでlamp環境を作って見る
 
Introduce that Best practices for writing Dockerfiles
Introduce that Best practices for writing DockerfilesIntroduce that Best practices for writing Dockerfiles
Introduce that Best practices for writing Dockerfiles
 
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
 
Dockerの導入
Dockerの導入Dockerの導入
Dockerの導入
 
Docker Swarm入門
Docker Swarm入門Docker Swarm入門
Docker Swarm入門
 
Ansibleを使ってdockerコンテナをプロビジョニングする
Ansibleを使ってdockerコンテナをプロビジョニングするAnsibleを使ってdockerコンテナをプロビジョニングする
Ansibleを使ってdockerコンテナをプロビジョニングする
 
Docker handson
Docker handsonDocker handson
Docker handson
 
Dockerクイックツアー
DockerクイックツアーDockerクイックツアー
Dockerクイックツアー
 
Dockerのキホンその2 Docker Compose Swarm Machine 利用編
Dockerのキホンその2 Docker Compose Swarm Machine 利用編Dockerのキホンその2 Docker Compose Swarm Machine 利用編
Dockerのキホンその2 Docker Compose Swarm Machine 利用編
 
Docker Swarm モード にゅうもん
Docker Swarm モード にゅうもんDocker Swarm モード にゅうもん
Docker Swarm モード にゅうもん
 
Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解
 
20150101勉強会 dokku alt
20150101勉強会 dokku alt20150101勉強会 dokku alt
20150101勉強会 dokku alt
 
Docker & Kubernetes基礎
Docker & Kubernetes基礎Docker & Kubernetes基礎
Docker & Kubernetes基礎
 
Docker講習会資料
Docker講習会資料Docker講習会資料
Docker講習会資料
 
Dockerイメージを作る
Dockerイメージを作るDockerイメージを作る
Dockerイメージを作る
 
Newcomer2020 Docker研修
Newcomer2020 Docker研修Newcomer2020 Docker研修
Newcomer2020 Docker研修
 

More from 啓介 大橋 (8)

App Dojo 2017 12月 - VUI in your app with Dialogflow -
App Dojo 2017 12月 - VUI in your app with Dialogflow -App Dojo 2017 12月 - VUI in your app with Dialogflow -
App Dojo 2017 12月 - VUI in your app with Dialogflow -
 
GCPUG Shonan GAS & GAE
GCPUG Shonan GAS & GAEGCPUG Shonan GAS & GAE
GCPUG Shonan GAS & GAE
 
Fusion360 meetup vol2 LT
Fusion360 meetup vol2 LTFusion360 meetup vol2 LT
Fusion360 meetup vol2 LT
 
パフォーマンスの良いGASの書き方 Best Practice
パフォーマンスの良いGASの書き方 Best Practiceパフォーマンスの良いGASの書き方 Best Practice
パフォーマンスの良いGASの書き方 Best Practice
 
Google Apps Scriptとは? Add-onとは?
Google Apps Scriptとは? Add-onとは?Google Apps Scriptとは? Add-onとは?
Google Apps Scriptとは? Add-onとは?
 
gcp ja night #27 Google Cloud Endpoints with Golang
gcp ja night #27 Google Cloud Endpoints with Golanggcp ja night #27 Google Cloud Endpoints with Golang
gcp ja night #27 Google Cloud Endpoints with Golang
 
Tokyo gas #5_whatsnewinappsscript_公開用
Tokyo gas #5_whatsnewinappsscript_公開用Tokyo gas #5_whatsnewinappsscript_公開用
Tokyo gas #5_whatsnewinappsscript_公開用
 
Dart flightschool cloudendpoint with dart
Dart flightschool cloudendpoint with dartDart flightschool cloudendpoint with dart
Dart flightschool cloudendpoint with dart
 

Recently uploaded

Recently uploaded (10)

LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 

Dockerハンズオン

  • 2. アジェンダ � 準備 � Docker on GCE Native Docker With Docker-Machine 基本操作 � Others Container Registry Container Optimised Image
  • 5. 準備 Projectの準備 � Develper Consoleへアクセス https://console.developers.google.com � プロジェクトを何も作ってない人、クリーンなプロジェクトでやりたい人は新たに プロジェクトを作成 � 課金設定してない人は設定 無料にしたいなら無料枠の設定も行う どうしても嫌な人は相談してください
  • 11. 準備 � Cloud Shell Google Cloud Platformを触るために用意されたブラウザ上で動くShell 2015年末まで無料(今はβ扱い) temporaryのGCEが立つ(OS: Debian) 5GBのディスク、gcloudコマンド、docker、docker-machine、kubectl(k8sのcli)、いろんな開発ツ ールがインストール済み
  • 12. 準備 � Cloud Shell 今回は基本的にCloud Shellを利用して説明していきます。 MacやWinを使っていて、その上でやりたい方は、Docker ToolboxとCloud SDKをインストールすれば だいたい同じです。
  • 13. 準備 � Cloud Shell 今回のプロジェクト用にshell変数として以下を設定しておきます。 ※以降は ”$ ~”な文はcloud shell、”$(インスタンス名) ~”な 文は対象のインスタンスでの作業 とします。 $ export PROJECT_NAME="project-name"
  • 16. Docker on GCE(Native Docker) � やること 作る インスタンス起動 dockerのインストールは時間がかかるのとハマりやすいので既にインストール済みなCoreOSを使 います。 入る sshでインスタンスに入る 取得 nginxのdocker imageをpullする
  • 17. Docker on GCE(Native Docker) � 作る インスタンスの起動 CoreOSのCompute Engineインスタンスを作成 Optionの意味 preemptible: preemptibleインスタンスを作る(24hでshutdownする 低価格インスタンス) $ 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. Docker on GCE(Native Docker) � 入る sshで作ったインスタンスへ gcloud compute ssh --project PROJECT_NAME INSTANCE_NAME でssh可能 sshトンネリング(port forward)したい場合とかも↑経由で実施 CoreOS コンテナを利用した巨大なスケールするプラットフォームを作りやすくするために開発され $ 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. Docker on GCE(Native Docker) � 取得 nginxのdocker imageを取得 docker pull IMAGENAME で取得 alpine 超軽量Linux Distribution (5MB) 何も入ってない $(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. Docker on GCE(Native Docker) � 起動 nginxのdockerコンテナを起動 docker run <OPTIONS> IMAGENAME <COMMAND> で起動 オプション -d バックエンドで起動 --name コンテナに名前をつける -p nn:mm ホストのnn番ポートをコンテナのmm番ポートにPort Forward $(instance name) docker run -d --name nginx -p 80:80 connexiolabs/alpine-nginx ハッシュ(2d953fef40b6fc80985d88a1caa02a9aace2a8d1410cbeb70c91c863637c66c1)
  • 21. 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アドレスを取得してい る $(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
  • 23. アジェンダ � 準備 � Docker on GCE Native Docker With Docker-Machine
  • 24. Docker on GCE(With Docker-Machine) � やること 作る & 入れる Docker-Machine経由でインスタン起動 & Dockerインストール 設定 Docker Remote APIのクライアント側の設定 取得&起動 nginxのdockerコンテナを取得して起動 テスト
  • 25. 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. � 設定 DockerのRemote APIにアクセスするための設定を行う docker-machine env [NAME] で表示できる 今回はcloud shellからアクセスしているので特に設定は不要ですが、 Docker on GCE(Docker-Machine) $ 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. 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. 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. アジェンダ � 準備 � Docker on GCE Native Docker With Docker-Machine
  • 30. アジェンダ � 準備 � Docker on GCE Native Docker With Docker-Machine 基本操作
  • 31. 基本操作 � やること docker stop コンテナの停止 docker start コンテナの起動 docker restart コンテナを再起動 docker logs ログを表示 docker cp ファイルコピー docker rm コンテナの削除 docker commit 起動中のコンテナから新しいimageを作成 docker images イメージ一覧
  • 32. 基本操作 stop, start, restart � stop コンテナを停止する docker stop <OPTIONS> NAME でコンテナを停止 � start 停止したコンテナを起動する docker start <OPTIONS> NAME でコンテナを起動 $ docker stop web $ docker start web $ docker restart web
  • 33. 基本操作 logs, cp � logs コンテナで起動しているプロセスのログ(標準出力)を取得する docker logs <OPTIONS> NAME でコンテナのログを取得 � cp ホスト、コンテナ間でファイルをコピーする docker cp <OPTIONS> NAME:PATH LOCALPATHでコンテナからホストにファイルをコピー $ 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. 基本操作 rm, commit � rm コンテナを削除する docker rn <OPTIONS> NAME でコンテナを削除 コンテナが停止していないと通常は削除できない、起動しているコンテナを削除する場合は -f を つける コンテナを削除した場合、コンテナ内で編集した内容は残らない 再度同じイメージを起動しても初期化される � commit $ docker rm -f web $ docker run -d --name web -p 80:80 nginx ※アクセスして元に戻っていることを確認 ※再度ファイルを編集しておく cpでもexecでもok $ docker commit -m "first commit" web mynginx
  • 35. 基本操作 images, ps � images ホストに保存されているimageの一覧を表示 docker images <OPTIONS> � ps 起動中(オプションによっては停止した)のコンテナの一覧を取得 docker ps $ docker images ※先ほど保存したimageがあることを確認 $ docker ps $ docker ps - a
  • 36. 基本操作 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. 基本操作 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. 基本操作 (続)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. アジェンダ � 準備 � Docker on GCE Native Docker With Docker-Machine 基本操作
  • 40. アジェンダ � 準備 � Docker on GCE Native Docker With Docker-Machine 基本操作 � Others Container Registry
  • 41. その他 Cointainer Registry � Container Registry 実際に本番環境で利用しようと思うとimageを保存するためにRegistryが必要 選択肢としては 自前で立てる https://hub.docker.com/_/registry/ https://hub.docker.com/r/google/docker-registry/ どっかのRegistryを使う Docker Hub Quary.io CoreOS Registry
  • 42. その他 Cointainer Registry � Google Container Registry Googleが公式に用意しているContainer Registry 裏側はCloud Storage 表側はGoogleがホストしている Google Developer Consoleに統合されている https://console.developers.google.com/kubernetes/images/list 課金体系はネットワーク通信費と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. その他 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. アジェンダ � 準備 � Docker on GCE Native Docker With Docker-Machine 基本操作 � Others Container Registry
  • 45. アジェンダ � 準備 � Docker on GCE Native Docker With Docker-Machine 基本操作 � Others Container Registry Container Optimised Image
  • 46. その他 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. その他 (続)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