More Related Content
Similar to Dockerハンズオン (20)
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)、いろんな開発ツ
ールがインストール済み
- 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
- 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
- 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"]
#
- 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