docker-handson-for-researcher

 docker-handson-for-researcher

0b5a8c592b267d1cc8d5d6a9577bdd34?s=128

@ジュジュ

March 13, 2019
Tweet

Transcript

  1. 明日から研究で使える Dockerハンズオン 2019/03/13 ERTL@名古屋大学 岡野兼也

  2. $ whoami name: - 岡野兼也 - @ジュジュ belonging: - 名古屋大学

    interest: - CloudNative - SRE dream: - 働かないこと hobbies: - 登山 - キャンプ 2
  3. 注意事項 - 本講義はわからないことは検索しながら 進めていくことが前提となっています - 質問タイムは適当に設けているので 適宜質問してください - 別途ハンズオン中に個別の質問も受け付けます -

    ハンズオン終わった人はメンターを手伝ってください 3
  4. 本ハンズオンで得られる知識 - コンテナ技術やDockerの概要 - Dockerの基本コマンドの使い方 - Dockerfileの基本命令の使い方 - 研究用途としてのDockerfileの書き方 -

    ほかの研究者が作成したDockerのコンテナでデ バッグ、一部改変の方法 4
  5. 本ハンズオンで得られない知識 - Dockerfileベストプラクティス - コンテナの運用知識 - コンテナ上でGPUを使う方法 - CloudNativeな環境が今どのようになっているの か

    - コンテナそのものの実装レベルでの知識 5
  6. 機械学習についてはこちら https://speakerdeck.com/juju62q/machine-learning-environment-made-by-rancher 6

  7. 事前セットアップ(Docker) Linuxの方 Macの方 curl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh

    sudo gpasswd -a ${USER} docker sudo systemctl enable docker sudo systemctl restart docker brew install docker brew cask install docker open /Application/Docker.app 7
  8. 事前セットアップ(docker-compose) Linuxの方 Macの方 sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$ (uname -s)-$(uname -m)"

    -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose (brew install sl) sl -l && sl -a && sl -alF (brew uninstall sl) 8
  9. 事前セットアップ(確認) 共通 docker version docker container ls docker-compose --version 9

  10. Dockerの世界にようこそ! 10

  11. 本日やること - Dockerってなんで便利なの? - コンテナやDockerの概要 - Dockerfileを書いてみる - デバッグ用途でdockerコマンドを利用する -

    docker-composeを使って 複数のコンテナを管理する 11
  12. 本日やること - Dockerってなんで便利なの? - コンテナやDockerの概要 - Dockerfileを書いてみる - デバッグ用途でdockerコマンドを利用する -

    docker-composeを使って 複数のコンテナを管理する 12
  13. アンケート 他人の研究環境を再現するのは大変だと思う 13

  14. アンケート 自分の研究環境が正直よくわからない 14

  15. アンケート 正直、明日研究室のマシンが壊れたら 一週間は進捗が出ない自信がある 15

  16. アンケート 研究環境が何もしてないのに壊れた経験がある 16

  17. アンケート 自分のPCが汚れると闇堕ちしてしまう 17

  18. そんなあなたに! 18

  19. 19

  20. Dockerを使ってできる世界 - 自分の開発環境をテキストにして管理できる - 一度動いたものはDockerさえ動くならOSや マシンをまたいでもほぼ動作する - 引継ぎ資料がとても簡単になる - 他の人もすぐに使うことができる

    環境を作れる 20
  21. 本日やること - Dockerってなんで便利なの? - コンテナやDockerの概要 - Dockerfileを書いてみる - デバッグ用途でdockerコマンドを利用する -

    docker-composeを使って 複数のコンテナを管理する 21
  22. 仮想化おさらい 1/4 ①非仮想化環境 22 ハードウェア ホストOS アプリケーション

  23. 仮想化おさらい 3/4 ②ゲストOS型仮想 23 ハードウェア VMware Workstation, VirtualBox ホストOS 仮想化アプリケーション

    仮想マシンA アプリケーション ゲストOS 仮想マシンB アプリケーション ゲストOS 仮想マシンC アプリケーション ゲストOS
  24. 仮想化おさらい 3/4 ③ハイパーバイザ型仮想(ソフトウェア) ※厳密には完全仮想化と準仮想化で区別すべき。とくに Xenは異なるアーキテクチャを採用している。 24 ハードウェア VMware ESXi, Xen/Citrix

    XenServer, Microsoft Hyper-V ハイパーバイザ 仮想マシンA アプリケーション ゲストOS 仮想マシンB アプリケーション ゲストOS 仮想マシンC アプリケーション ゲストOS
  25. 仮想化おさらい 4/4 ④ハイパーバイザ型仮想(カーネルモジュール) 25 ハードウェア Linux KVM ホストOS ハイパーバイザ 仮想マシンA

    アプリケーション ゲストOS 仮想マシンB アプリケーション ゲストOS アプリケーション
  26. コンテナ型”仮想化” 詳しくは後述しますがいわゆる仮想化ではない 26 ハードウェア Docker, LXC, rkt, haciniwa ホストOS コンテナエンジン

    コンテナA アプリケーション コンテナエンジン アプリケーション コンテナB アプリケーション
  27. 違いはなに? 27

  28. コンテナ型”仮想化”のメリット - 起動が速い - オーバヘッドが小さい - 小さなリソースに分割できる 28 OSが各個で動かないためにメリットが生まれる

  29. コンテナ型”仮想化”のデメリット - ほぼ同一のカーネルでしか動かない - 分離が比較的弱い 29 OSが共通で動くためにデメリットが生じる

  30. 結局コンテナってどんなもの? 30

  31. 31 実際に動かしてみる ホストから見るとプロセス(仮想化じゃない)

  32. しかしながら…? 32 - コンテナでは自身のコンテナ以外への アクセスを制限している - コンテナに与えるリソースを制限できる どうやって…? 

  33. Linux Namespace 33 ファイルシステム、プロセステーブル、ネットワークを 分割するLinuxカーネルの機能 ハードウェア ホストOS ユ ー ザ

    プ ロ セ ス Namespace A ユ ー ザ プ ロ セ ス ユ ー ザ プ ロ セ ス Namespace B ユ ー ザ プ ロ セ ス ユ ー ザ プ ロ セ ス … ユ ー ザ プ ロ セ ス …
  34. Linux Namespace 34 ファイルシステム、プロセステーブル、ネットワークを 分割するLinuxカーネルの機能 ハードウェア ホストOS ユ ー ザ

    プ ロ セ ス Namespace A ユ ー ザ プ ロ セ ス ユ ー ザ プ ロ セ ス Namespace B ユ ー ザ プ ロ セ ス ユ ー ザ プ ロ セ ス … ユ ー ザ プ ロ セ ス … これがコンテナ!
  35. Linux Namespace 35 namespace 説明 Mount namespace ファイルシステムの分離 UTS namespace

    ホストネームの分離 IPC namespace IPC(プロセス間通信)の分離 User namespace ユーザ(UID/GID)の分離 PID namespace プロセステーブルの分離 Network namespace ネットワーク設定の分離 namespaceにいくつか種類があるので紹介します
  36. cgroup 36 cgroups機能は、それぞれのグループに対してCPUや メモリ割り当てを制御する機能 ハードウェア ホストOS コンテナ A ユ ー

    ザ プ ロ セ ス ユ ー ザ プ ロ セ ス コンテナ B ユ ー ザ プ ロ セ ス ユ ー ザ プ ロ セ ス CPU: 2コア メモリ: 4GB CPU: 1コア メモリ: 512MB
  37. ここまでLinuxコンテナ。 じゃあ ってなんなのさ? 37

  38. Dockerとは 38 Linuxカーネルの機能を統合し、コンテナを 作り上げる管理ツール

  39. Dockerの基本機能 39 Dockerfileと呼ばれる手順書に - どのイメージから始めるか - どんな操作を行うか - 起動時に何をするか を記述してDocker

    Imageを作る - DockerHubには公式で作られた Imageが多数ある - これを元にして環境を作るのが好 ましい (nvidia/cuda等例外もある) ベースImage Image層 Image作成操作 書き込み可能 Image
  40. Dockerの基本機能 40 リポジトリからpullしたイメージをコンテナに当てることで 欲しいコンテナが起動できる ハードウェア ホストOS コンテナ A ユ ー

    ザ プ ロ セ ス ユ ー ザ プ ロ セ ス コンテナ B ユ ー ザ プ ロ セ ス レジストリ https://hub.docker.com 等 CentOS リポジトリ Ubuntu リポジトリ tag: latest tag: 7 tag: latest tag: 18.04 Ubuntu tag: 18.04 push pull
  41. Dockerの基本機能 41 Dockerfileを書いてビルドを行い、Imageをリポジトリに pushしておけば誰でも同一環境が手に入る! レジストリ https://hub.docker.com 等 自分の研究 リポジトリ 他人の研究

    リポジトリ tag: latest tag: latest push pull
  42. つまり… 42 Dockerとは - コンテナの構築手順をレイヤとして保持 - 完成したコンテナイメージを登録 - 他人の作ったコンテナイメージを 実行&追加書き込み

    - LinuxNamespaceで実行環境を分離 - cgroupでリソースを分割 できるツール
  43. 質疑&休憩 43

  44. もっと詳しく知りたい人はこちら - コンテナ未経験新人が学ぶコンテナ技術入門 NTTの方が作ったコンテナの基礎について丁寧に記述した資料 ( https://www.slideshare.net/KoheiTokunaga/ss-122754942 ) - コンテナ技術入門 -

    仮想化との違いを知り、要素技術を触って 学ぼう はてなの方が作ったハンズオン形式でコンテナの構成技術に触れあえる資料 ( https://employment.en-japan.com/engineerhub/entry/2019/02/05/103000 ) - コンテナのセキュリティを中身から理解しよう ペパボの方が作ったコンテナを攻撃して遊んでみる資料 ( https://speakerdeck.com/udzura/inside-out-container-and-its-security ) どれも面白いのでぜひ! 44
  45. 本日やること - Dockerってなんで便利なの? - コンテナやDockerの概要 - Dockerfileを書いてみる - デバッグ用途でdockerコマンドを利用する -

    docker-composeを使って 複数のコンテナを管理する 45
  46. 問題集 取得方法 答えの確認方法 git clone https://github.com/Juju-62q/docker-handson.git git checkout answer 46

  47. まずはコンテナを動かしてみよう docker image pull ubuntu:18.04 docker container run -it ubuntu:18.04

    47 bashに入れた!ユーザ名も変わった!
  48. まずはコンテナを動かしてみよう docker image pull ubuntu:18.04 docker container run -it ubuntu:18.04

    48 DockerImageをDockerHubから引っ張る 引っ張ったコンテナイメージでコンテナを動かす -i インタラクティブ -t ttyを割り当てる
  49. Dockerfileをちらっとみてみよう # base imageの指定 FROM python:3.7.2 # ファイルの追加 COPY requirements.txt

    ./ # 環境構築の処理を書く RUN pip install -r requirements.txt # プログラムを追加 COPY app.py ./ # ポート開放 EXPOSE 5000 # 起動コマンドの指定 CMD ["python", "app.py"] 49
  50. 自前Dockerfileの動かし方 50 docker image build -t Juju-62q/hoge . docker container

    run Juju-62q/hoge カレントディレクトリのDockerfileをビルドする -t imageに名前を付ける(DockerHubの名前と対応させる) ビルドしたコンテナイメージでコンテナを動かす ※こちらやらなくていいです
  51. 自前DockerfileをDockerHubに保存 51 docker image build -t Juju-62q/hoge:20190313 . docker image

    push Juju-62q/hoge:20190313 カレントディレクトリのDockerfileをビルドする -t “ : ”以降でバージョンを管理できる ビルドしたコンテナイメージをpushする ※こちらやらなくていいです  要DockerHubのアカウントとリポジトリ
  52. Dockerfileのコマンドまとめ 52 コマンド名 説明 FROM ベースイメージの指定 RUN コマンドを実行する(レイヤ作る) COPY ローカルのファイル/ディレクトリをコピーする(レイヤ作る)

    CMD 起動時のコマンド指定 WORKDIR カレントディレクトリの変更 ADD COPYより機能が豪華(レイヤ作る) EXPOSE ポートの開放 ENV 環境変数の追加 VOLUME ボリュームの作成 USER ユーザの変更 ARG ビルド時に変数を使う ONBUILD 毎回ビルド時に実行する ENTRYPOINT docker runのときの基本実行コマンド
  53. Dockerfileのコマンドまとめ 53 コマンド名 説明 FROM ベースイメージの指定 RUN コマンドを実行する(レイヤ作る) COPY ローカルのファイル/ディレクトリをコピーする(レイヤ作る)

    CMD 起動時のコマンド指定 WORKDIR カレントディレクトリの変更 ADD COPYより機能が豪華(レイヤ作る) EXPOSE ポートの開放 ENV 環境変数の追加 VOLUME ボリュームの作成 USER ユーザの変更 ARG ビルド時に変数を使う ONBUILD 毎回ビルド時に実行する ENTRYPOINT docker runのときの基本実行コマンド とても覚えてほしい
  54. Dockerfileのコマンドまとめ 54 コマンド名 説明 FROM ベースイメージの指定 RUN コマンドを実行する(レイヤ作る) COPY ローカルのファイル/ディレクトリをコピーする(レイヤ作る)

    CMD 起動時のコマンド指定 WORKDIR カレントディレクトリの変更 ADD COPYより機能が豪華(レイヤ作る) EXPOSE ポートの開放 ENV 環境変数の追加 VOLUME ボリュームの作成 USER ユーザの変更 ARG ビルド時に変数を使う ONBUILD 毎回ビルド時に実行する ENTRYPOINT docker runのときの基本実行コマンド やや覚えてほしい
  55. Dockerfileのコマンドまとめ 55 コマンド名 説明 FROM ベースイメージの指定 RUN コマンドを実行する(レイヤ作る) COPY ローカルのファイル/ディレクトリをコピーする(レイヤ作る)

    CMD 起動時のコマンド指定 WORKDIR カレントディレクトリの変更 ADD COPYより機能が豪華(レイヤ作る) EXPOSE ポートの開放 ENV 環境変数の追加 VOLUME ボリュームの作成 USER ユーザの変更 ARG ビルド時に変数を使う ONBUILD 毎回ビルド時に実行する ENTRYPOINT docker runのときの基本実行コマンド 使うととてもおしゃれなDockerfileが作れる
  56. ではさっきクローンした 問題のex4までやりましょう! 56

  57. 問題について - Pythonで作っています - インタプリタのほうが実行が楽 - RubyとPythonなら研究室ではPythonのほうが つかえる人多そう - 遊びたい人はほかの言語使ってもOK

    - ちょっと難しいかもしれないです - 適宜呼んでいただければ対応します - 助け合ったりググったりして解いてください 57
  58. 質疑 58

  59. もっと詳しく知りたい人はこちら - Best practices for writing Dockerfiles Docker公式が書いているベストプラクティス ( https://docs.docker.com/develop/develop-images/dockerfile_best-practices

    ) - 改めてDockerfileのベストプラクティスを振り返ろう オイシックス・ラ・大地の方が作った上の資料を圧縮した資料 (https://www.slideshare.net/ssuser1f3c12/introduce-that-best-practices-for-writi ng-dockerfiles ) - The Twelve-Factor App PaaSやコンテナを動作させるときに注意することまとめ ( https://12factor.net/ja/ ) 実運用で大事になる書き方がまとめられているので よければ 59
  60. 本日やること - Dockerってなんで便利なの? - コンテナやDockerの概要 - Dockerfileを書いてみる - デバッグ用途でdockerコマンドを利用する -

    docker-composeを使って 複数のコンテナを管理する 60
  61. でもでも…? 61 他人の研究のコンテナイメージ引っ張って コマンドがbashとかじゃなかったらデバッグできなくない?

  62. 例えば… Pythonのコンテナを実行する docker container run -it python:3.7.2 62 そらみたことか!

  63. 起動コマンドを変えてみる Pythonのコンテナを実行する docker container run -it python:3.7.2 bash 63 ここに起動コマンドを記述可能

  64. まだまだ…? 64 僕の研究機密情報扱ってるからDockerHubにpushできない! あと、機械学習とかでデータがでかいとそもそもそのデータイメー ジに含めたら地獄じゃない?

  65. Data Volume - ホストと共有 - ホストマシンのデータをイメージに含めずにコンテナ内部 からも扱えるようにする - 認証情報とかを扱うときに利用 -

    コンテナに作成 - コンテナの内部に永続ボリュームを作る - DBの中身とかを扱うときに便利 - コンテナを跨いで共有 65
  66. Data Volume - ホストと共有 - ホストマシンのデータをイメージに含めずにコンテナ内部 からも扱えるようにする - 認証情報とかを扱うときに利用 -

    コンテナに作成 - コンテナの内部に永続ボリュームを作る - DBの中身とかを扱うときに便利 - コンテナを跨いで共有 66 研究用途だとこれが割と便利
  67. ホストのディレクトリをマウントする ディレクトリを作ってコンテナと共有する mkdir test echo "hello volume from host" >

    data_volume/from_host docker container run -it \ -v "$(pwd)/test":/data_volume python:3.7.2 bash cat data_volume/from_host echo "hello volume from container" \ > data_volume/from_container exit cat test/from_container rm -rf test 67
  68. ホストのディレクトリをマウントする 結果 68 コンテナで作ったものがホスト側にある ホストで作ったものがコンテナ側にある

  69. コンテナにポートフォワードする ホストの8080をコンテナの80にフォワードする docker container run -p 8080:80 nginx (別ターミナルを開く) curl

    localhost:8080 69
  70. 問題のex6までやりましょう! 70

  71. 質疑 71

  72. 本日やること - Dockerってなんで便利なの? - コンテナやDockerの概要 - Dockerfileを書いてみる - デバッグ用途でdockerコマンドを利用する -

    docker-composeを使って 複数のコンテナを管理する 72
  73. まだいける…? 73 でもでも、僕dockerコマンドなんて多すぎて覚えられないんだけ ど?どうにかならんの?

  74. docker-compose - コンテナの動かし方をyamlで記述できる - どのイメージをどの名前で使うかを記述できる - 各オプションをどのように記述するかを定義できる - 複数のコンテナを一括で管理できる -

    コンテナネットワークをいい感じに貼ってくれる - どういう関係なのかも定義できる 74
  75. docker-compose.ymlを覗いてみよう version: '3' services: klee: image: klee/klee:latest volumes: - ./target_files:/home/klee/klee_src/target

    - ./shells:/home/klee/shells ulimits: stack: soft: -1 hard: -1 75
  76. docker-compose.ymlを覗いてみよう version: '3' services: klee: image: klee/klee:latest volumes: - ./target_files:/home/klee/klee_src/target

    - ./shells:/home/klee/shells ulimits: stack: soft: -1 hard: -1 76 Data Volumeの記述 docker-composeでは相対パスの記述が可能 イメージの記述が宣言的に可能
  77. docker-composeの動かし方 77 docker-compose up --build docker-compose run klee bash コンテナ群を起動させる

    --build コンテナをビルドしながら起動する コンテナで任意の命令を動かす ※こちらやらなくていいです
  78. 少し細かいプラクティス 78 1つのコンテナでは、1つだけプロセスを動かすべき ハードウェア ホストOS コンテナ A Python コンテナ B

    MySQL コンテナ B Nginx
  79. 複数のコンテナも管理できる version: '3' services: api: build: . ports: - "5000:5000"

    volumes: - "./src:/src" tty: true environment: TZ: Asia/Tokyo FLASK_APP: run.py FLASK_ENV: development command: flask run -h 0.0.0.0 db: build: ./mysql/ volumes: - ./mysql/mysql_data:/var/lib/mysql - ./mysql/sqls:/docker-entrypoint-initdb.d environment: - MYSQL_ROOT_PASSWORD=hoge 79 ※こちらやらなくていいです
  80. 複数のコンテナも管理できる version: '3' services: api: build: . ports: - "5000:5000"

    volumes: - "./src:/src" tty: true environment: TZ: Asia/Tokyo FLASK_APP: run.py FLASK_ENV: development depends_on: - db db: build: ./mysql/ volumes: - ./mysql/mysql_data:/var/lib/mysql - ./mysql/sqls:/docker-entrypoint-initdb.d environment: - MYSQL_ROOT_PASSWORD=hoge 80 指定ディレクトリのDockerfileを対象とする (もっと細かく指定もできる) ポートフォワードの記述 環境変数の記述 (.envファイルを作って管理するのが一般的) ※こちらやらなくていいです
  81. 問題のex7をやりましょう! (DB面倒くさいのでNginxです) 81

  82. 質疑 82

  83. もっと詳しく知りたい人はこちら - Docker Compose 徹底解説 さくらインターネットの方が書いている資料 ( https://www.slideshare.net/zembutsu/docker-compose-guidebook ) Docker

    Composeの使い方から実運用まで簡単に 書かれています 83
  84. ここまででハンズオンは終了です 84

  85. まとめ - Dockerfileを使うことで自分の研究環境が 明らかになる - Docker使うと他人の研究環境の再現が簡単 - コンテナの中でデバッグもできる - ホストのディレクトリも読むことができる

    - 起動コマンドも簡単に管理できる - プロセスたくさんあっても一括処理できる 85
  86. お越しいただきありがとうございました & 長丁場、お疲れさまでした 86