Upgrade to Pro — share decks privately, control downloads, hide ads and more …

docker-handson-for-researcher

 docker-handson-for-researcher

@ジュジュ

March 13, 2019
Tweet

More Decks by @ジュジュ

Other Decks in Technology

Transcript

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

    interest: - CloudNative - SRE dream: - 働かないこと hobbies: - 登山 - キャンプ 2
  2. 事前セットアップ(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
  3. 事前セットアップ(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
  4. 19

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

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

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

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

    コンテナA アプリケーション コンテナエンジン アプリケーション コンテナB アプリケーション
  9. Linux Namespace 33 ファイルシステム、プロセステーブル、ネットワークを 分割するLinuxカーネルの機能 ハードウェア ホストOS ユ ー ザ

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

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

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

    ザ プ ロ セ ス ユ ー ザ プ ロ セ ス コンテナ B ユ ー ザ プ ロ セ ス ユ ー ザ プ ロ セ ス CPU: 2コア メモリ: 4GB CPU: 1コア メモリ: 512MB
  13. Dockerの基本機能 39 Dockerfileと呼ばれる手順書に - どのイメージから始めるか - どんな操作を行うか - 起動時に何をするか を記述してDocker

    Imageを作る - DockerHubには公式で作られた Imageが多数ある - これを元にして環境を作るのが好 ましい (nvidia/cuda等例外もある) ベースImage Image層 Image作成操作 書き込み可能 Image
  14. 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
  15. もっと詳しく知りたい人はこちら - コンテナ未経験新人が学ぶコンテナ技術入門 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
  16. まずはコンテナを動かしてみよう docker image pull ubuntu:18.04 docker container run -it ubuntu:18.04

    48 DockerImageをDockerHubから引っ張る 引っ張ったコンテナイメージでコンテナを動かす -i インタラクティブ -t ttyを割り当てる
  17. 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
  18. 自前Dockerfileの動かし方 50 docker image build -t Juju-62q/hoge . docker container

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

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

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

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

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

    CMD 起動時のコマンド指定 WORKDIR カレントディレクトリの変更 ADD COPYより機能が豪華(レイヤ作る) EXPOSE ポートの開放 ENV 環境変数の追加 VOLUME ボリュームの作成 USER ユーザの変更 ARG ビルド時に変数を使う ONBUILD 毎回ビルド時に実行する ENTRYPOINT docker runのときの基本実行コマンド 使うととてもおしゃれなDockerfileが作れる
  24. 問題について - Pythonで作っています - インタプリタのほうが実行が楽 - RubyとPythonなら研究室ではPythonのほうが つかえる人多そう - 遊びたい人はほかの言語使ってもOK

    - ちょっと難しいかもしれないです - 適宜呼んでいただければ対応します - 助け合ったりググったりして解いてください 57
  25. もっと詳しく知りたい人はこちら - 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
  26. Data Volume - ホストと共有 - ホストマシンのデータをイメージに含めずにコンテナ内部 からも扱えるようにする - 認証情報とかを扱うときに利用 -

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

    コンテナに作成 - コンテナの内部に永続ボリュームを作る - DBの中身とかを扱うときに便利 - コンテナを跨いで共有 66 研究用途だとこれが割と便利
  28. ホストのディレクトリをマウントする ディレクトリを作ってコンテナと共有する 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
  29. 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では相対パスの記述が可能 イメージの記述が宣言的に可能
  30. docker-composeの動かし方 77 docker-compose up --build docker-compose run klee bash コンテナ群を起動させる

    --build コンテナをビルドしながら起動する コンテナで任意の命令を動かす ※こちらやらなくていいです
  31. 複数のコンテナも管理できる 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 ※こちらやらなくていいです
  32. 複数のコンテナも管理できる 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ファイルを作って管理するのが一般的) ※こちらやらなくていいです