$30 off During Our Annual Pro Sale. View Details »

docker-handson-for-researcher

 docker-handson-for-researcher

@ジュジュ

March 13, 2019
Tweet

More Decks by @ジュジュ

Other Decks in Technology

Transcript

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

    View Slide

  2. $ whoami
    name:
    - 岡野兼也
    - @ジュジュ
    belonging:
    - 名古屋大学
    interest:
    - CloudNative
    - SRE
    dream:
    - 働かないこと
    hobbies:
    - 登山
    - キャンプ
    2

    View Slide

  3. 注意事項
    - 本講義はわからないことは検索しながら
    進めていくことが前提となっています
    - 質問タイムは適当に設けているので
    適宜質問してください
    - 別途ハンズオン中に個別の質問も受け付けます
    - ハンズオン終わった人はメンターを手伝ってください
    3

    View Slide

  4. 本ハンズオンで得られる知識
    - コンテナ技術やDockerの概要
    - Dockerの基本コマンドの使い方
    - Dockerfileの基本命令の使い方
    - 研究用途としてのDockerfileの書き方
    - ほかの研究者が作成したDockerのコンテナでデ
    バッグ、一部改変の方法
    4

    View Slide

  5. 本ハンズオンで得られない知識
    - Dockerfileベストプラクティス
    - コンテナの運用知識
    - コンテナ上でGPUを使う方法
    - CloudNativeな環境が今どのようになっているの

    - コンテナそのものの実装レベルでの知識
    5

    View Slide

  6. 機械学習についてはこちら
    https://speakerdeck.com/juju62q/machine-learning-environment-made-by-rancher
    6

    View Slide

  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

    View Slide

  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

    View Slide

  9. 事前セットアップ(確認)
    共通
    docker version
    docker container ls
    docker-compose --version
    9

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  13. アンケート
    他人の研究環境を再現するのは大変だと思う
    13

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  18. そんなあなたに!
    18

    View Slide

  19. 19

    View Slide

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

    View Slide

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

    View Slide

  22. 仮想化おさらい 1/4
    ①非仮想化環境
    22
    ハードウェア
    ホストOS
    アプリケーション

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  27. 違いはなに?
    27

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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







    Namespace A














    Namespace B























    View Slide

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







    Namespace A














    Namespace B























    これがコンテナ!

    View Slide

  35. Linux Namespace
    35
    namespace 説明
    Mount namespace ファイルシステムの分離
    UTS namespace ホストネームの分離
    IPC namespace IPC(プロセス間通信)の分離
    User namespace ユーザ(UID/GID)の分離
    PID namespace プロセステーブルの分離
    Network namespace ネットワーク設定の分離
    namespaceにいくつか種類があるので紹介します

    View Slide

  36. cgroup
    36
    cgroups機能は、それぞれのグループに対してCPUや
    メモリ割り当てを制御する機能
    ハードウェア
    ホストOS
    コンテナ A














    コンテナ B














    CPU: 2コア
    メモリ: 4GB
    CPU: 1コア
    メモリ: 512MB

    View Slide

  37. ここまでLinuxコンテナ。
    じゃあ
    ってなんなのさ?
    37

    View Slide

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

    View Slide

  39. Dockerの基本機能
    39
    Dockerfileと呼ばれる手順書に
    - どのイメージから始めるか
    - どんな操作を行うか
    - 起動時に何をするか
    を記述してDocker Imageを作る
    - DockerHubには公式で作られた
    Imageが多数ある
    - これを元にして環境を作るのが好
    ましい
    (nvidia/cuda等例外もある)
    ベースImage
    Image層
    Image作成操作
    書き込み可能
    Image

    View Slide

  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

    View Slide

  41. Dockerの基本機能
    41
    Dockerfileを書いてビルドを行い、Imageをリポジトリに
    pushしておけば誰でも同一環境が手に入る!
    レジストリ
    https://hub.docker.com 等
    自分の研究
    リポジトリ
    他人の研究
    リポジトリ
    tag: latest tag: latest
    push
    pull

    View Slide

  42. つまり…
    42
    Dockerとは
    - コンテナの構築手順をレイヤとして保持
    - 完成したコンテナイメージを登録
    - 他人の作ったコンテナイメージを
    実行&追加書き込み
    - LinuxNamespaceで実行環境を分離
    - cgroupでリソースを分割
    できるツール

    View Slide

  43. 質疑&休憩
    43

    View Slide

  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

    View Slide

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

    View Slide

  46. 問題集
    取得方法
    答えの確認方法
    git clone https://github.com/Juju-62q/docker-handson.git
    git checkout answer
    46

    View Slide

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

    View Slide

  48. まずはコンテナを動かしてみよう
    docker image pull ubuntu:18.04
    docker container run -it ubuntu:18.04
    48
    DockerImageをDockerHubから引っ張る
    引っ張ったコンテナイメージでコンテナを動かす
    -i インタラクティブ
    -t ttyを割り当てる

    View Slide

  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

    View Slide

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

    View Slide

  51. 自前DockerfileをDockerHubに保存
    51
    docker image build -t Juju-62q/hoge:20190313 .
    docker image push Juju-62q/hoge:20190313
    カレントディレクトリのDockerfileをビルドする
    -t “ : ”以降でバージョンを管理できる
    ビルドしたコンテナイメージをpushする
    ※こちらやらなくていいです
     要DockerHubのアカウントとリポジトリ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  56. ではさっきクローンした
    問題のex4までやりましょう!
    56

    View Slide

  57. 問題について
    - Pythonで作っています
    - インタプリタのほうが実行が楽
    - RubyとPythonなら研究室ではPythonのほうが
    つかえる人多そう
    - 遊びたい人はほかの言語使ってもOK
    - ちょっと難しいかもしれないです
    - 適宜呼んでいただければ対応します
    - 助け合ったりググったりして解いてください
    57

    View Slide

  58. 質疑
    58

    View Slide

  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

    View Slide

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

    View Slide

  61. でもでも…?
    61
    他人の研究のコンテナイメージ引っ張って
    コマンドがbashとかじゃなかったらデバッグできなくない?

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  68. ホストのディレクトリをマウントする
    結果
    68
    コンテナで作ったものがホスト側にある
    ホストで作ったものがコンテナ側にある

    View Slide

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

    View Slide

  70. 問題のex6までやりましょう!
    70

    View Slide

  71. 質疑
    71

    View Slide

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

    View Slide

  73. まだいける…?
    73
    でもでも、僕dockerコマンドなんて多すぎて覚えられないんだけ
    ど?どうにかならんの?

    View Slide

  74. docker-compose
    - コンテナの動かし方をyamlで記述できる
    - どのイメージをどの名前で使うかを記述できる
    - 各オプションをどのように記述するかを定義できる
    - 複数のコンテナを一括で管理できる
    - コンテナネットワークをいい感じに貼ってくれる
    - どういう関係なのかも定義できる
    74

    View Slide

  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

    View Slide

  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では相対パスの記述が可能
    イメージの記述が宣言的に可能

    View Slide

  77. docker-composeの動かし方
    77
    docker-compose up --build
    docker-compose run klee bash
    コンテナ群を起動させる
    --build コンテナをビルドしながら起動する
    コンテナで任意の命令を動かす
    ※こちらやらなくていいです

    View Slide

  78. 少し細かいプラクティス
    78
    1つのコンテナでは、1つだけプロセスを動かすべき
    ハードウェア
    ホストOS
    コンテナ A
    Python
    コンテナ B
    MySQL
    コンテナ B
    Nginx

    View Slide

  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
    ※こちらやらなくていいです

    View Slide

  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ファイルを作って管理するのが一般的)
    ※こちらやらなくていいです

    View Slide

  81. 問題のex7をやりましょう!
    (DB面倒くさいのでNginxです)
    81

    View Slide

  82. 質疑
    82

    View Slide

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

    View Slide

  84. ここまででハンズオンは終了です
    84

    View Slide

  85. まとめ
    - Dockerfileを使うことで自分の研究環境が
    明らかになる
    - Docker使うと他人の研究環境の再現が簡単
    - コンテナの中でデバッグもできる
    - ホストのディレクトリも読むことができる
    - 起動コマンドも簡単に管理できる
    - プロセスたくさんあっても一括処理できる
    85

    View Slide

  86. お越しいただきありがとうございました
    &
    長丁場、お疲れさまでした
    86

    View Slide