Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Dockerハンズオン

378 views

Published on

GCPUG Shounan向け Dockerハンズオン資料

Published in: Technology
  • Be the first to comment

Dockerハンズオン

  1. 1. Dockerハンズオン https://goo.gl/7lvcfV
  2. 2. アジェンダ � 準備 � Docker on GCE Native Docker With Docker-Machine 基本操作 � Others Container Registry Container Optimised Image
  3. 3. アジェンダ � 準備
  4. 4. 準備 Projectの準備
  5. 5. 準備 Projectの準備 � Develper Consoleへアクセス https://console.developers.google.com � プロジェクトを何も作ってない人、クリーンなプロジェクトでやりたい人は新たに プロジェクトを作成 � 課金設定してない人は設定 無料にしたいなら無料枠の設定も行う どうしても嫌な人は相談してください
  6. 6. 準備 Docker Client インストール
  7. 7. 準備 Docker Clientインストール 不要
  8. 8. 準備 Docker Clientインストール まじで
  9. 9. 準備 Docker Clientインストール 不要
  10. 10. 準備 Docker Clientインストール
  11. 11. 準備 � Cloud Shell Google Cloud Platformを触るために用意されたブラウザ上で動くShell 2015年末まで無料(今はβ扱い) temporaryのGCEが立つ(OS: Debian) 5GBのディスク、gcloudコマンド、docker、docker-machine、kubectl(k8sのcli)、いろんな開発ツ ールがインストール済み
  12. 12. 準備 � Cloud Shell 今回は基本的にCloud Shellを利用して説明していきます。 MacやWinを使っていて、その上でやりたい方は、Docker ToolboxとCloud SDKをインストールすれば だいたい同じです。
  13. 13. 準備 � Cloud Shell 今回のプロジェクト用にshell変数として以下を設定しておきます。 ※以降は ”$ ~”な文はcloud shell、”$(インスタンス名) ~”な 文は対象のインスタンスでの作業 とします。 $ export PROJECT_NAME="project-name"
  14. 14. アジェンダ � 準備
  15. 15. アジェンダ � 準備 � Docker on GCE Native Docker
  16. 16. Docker on GCE(Native Docker) � やること 作る インスタンス起動 dockerのインストールは時間がかかるのとハマりやすいので既にインストール済みなCoreOSを使 います。 入る sshでインスタンスに入る 取得 nginxのdocker imageをpullする
  17. 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. 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. 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. 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. 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
  22. 22. アジェンダ � 準備 � Docker on GCE Native Docker
  23. 23. アジェンダ � 準備 � Docker on GCE Native Docker With Docker-Machine
  24. 24. Docker on GCE(With Docker-Machine) � やること 作る & 入れる Docker-Machine経由でインスタン起動 & Dockerインストール 設定 Docker Remote APIのクライアント側の設定 取得&起動 nginxのdockerコンテナを取得して起動 テスト
  25. 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. 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. 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. 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. 29. アジェンダ � 準備 � Docker on GCE Native Docker With Docker-Machine
  30. 30. アジェンダ � 準備 � Docker on GCE Native Docker With Docker-Machine 基本操作
  31. 31. 基本操作 � やること docker stop コンテナの停止 docker start コンテナの起動 docker restart コンテナを再起動 docker logs ログを表示 docker cp ファイルコピー docker rm コンテナの削除 docker commit 起動中のコンテナから新しいimageを作成 docker images イメージ一覧
  32. 32. 基本操作 stop, start, restart � stop コンテナを停止する docker stop <OPTIONS> NAME でコンテナを停止 � start 停止したコンテナを起動する docker start <OPTIONS> NAME でコンテナを起動 $ docker stop web $ docker start web $ docker restart web
  33. 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. 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. 35. 基本操作 images, ps � images ホストに保存されているimageの一覧を表示 docker images <OPTIONS> � ps 起動中(オプションによっては停止した)のコンテナの一覧を取得 docker ps $ docker images ※先ほど保存したimageがあることを確認 $ docker ps $ docker ps - a
  36. 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. 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. 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. 39. アジェンダ � 準備 � Docker on GCE Native Docker With Docker-Machine 基本操作
  40. 40. アジェンダ � 準備 � Docker on GCE Native Docker With Docker-Machine 基本操作 � Others Container Registry
  41. 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. 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. 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. 44. アジェンダ � 準備 � Docker on GCE Native Docker With Docker-Machine 基本操作 � Others Container Registry
  45. 45. アジェンダ � 準備 � Docker on GCE Native Docker With Docker-Machine 基本操作 � Others Container Registry Container Optimised Image
  46. 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. 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

×