Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
docker-handson-for-researcher
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
@ジュジュ
March 13, 2019
Technology
350
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
docker-handson-for-researcher
@ジュジュ
March 13, 2019
More Decks by @ジュジュ
See All by @ジュジュ
チーム分割においていかれたアラートをチームで責任を持てる形に再設計した
juju62q
0
200
ボトムアップでSLOを導入 2年半運用して分かった失敗と変化
juju62q
2
1.2k
Firecracker Snapshottingを調べてみた
juju62q
1
650
SLOを活用した技術的改善
juju62q
10
15k
IAM Role for Pods and Instance Meta Data Service
juju62q
1
1.7k
telepresence handson
juju62q
2
5.4k
Wanna Use Vitess in Orientation
juju62q
6
1.4k
machine learning with rancher and K8s on prem
juju62q
5
480
Getting Started to CRIU
juju62q
0
160
Other Decks in Technology
See All in Technology
認証認可だけじゃない! ID管理の構成要素と ライフサイクルを意識しよう
ritou
1
370
週末にループ・エンジニアリングの理解を深めるためのスライド
nagatsu
0
700
NDIAS CTF 2026 問題解説会資料
bata_24
0
130
AWS Security Hub CSPMの成功・失敗体験
cmusudakeisuke
0
610
AIペネトレーションテスト・ セキュリティ検証「AgenticSec」紹介資料
laysakura
2
7.8k
Kotlin 開発のツラミを爆破した話! / Explode the difficulty of Kotlin dev!
eller86
0
120
AWS Summit 2026で見えたSIerにとっての Amazon Quickの位置づけ
maf_0521
0
130
『AIに負けない』より『AIと遊ぶ』」〜ワクワクが最強のテスト・QA学習戦略_公開用
odan611
1
210
小さいから、全部わかる。— 常駐AI "xangi" のすすめ
sugupoko
0
190
AWS Summit の片隅で、体育座りしながらコミュニティがにぎわう理由を考えた
k_adachi_01
2
300
次世代ランサムウェア対策の考察 / 20260704 Mitsutoshi Matsuo
shift_evolve
PRO
3
1k
Text-to-SQLをAgentCoreで実現し、生成されるSQLの精度を定量的に評価する
yakumo
2
190
Featured
See All Featured
Scaling GitHub
holman
464
140k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
360
The Language of Interfaces
destraynor
162
27k
How STYLIGHT went responsive
nonsquared
100
6.2k
Tell your own story through comics
letsgokoyo
1
980
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
170
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
240
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
340
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.1k
[SF Ruby Conf 2025] Rails X
palkan
2
1.1k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.9k
Are puppies a ranking factor?
jonoalderson
1
3.7k
Transcript
明日から研究で使える Dockerハンズオン 2019/03/13 ERTL@名古屋大学 岡野兼也
$ whoami name: - 岡野兼也 - @ジュジュ belonging: - 名古屋大学
interest: - CloudNative - SRE dream: - 働かないこと hobbies: - 登山 - キャンプ 2
注意事項 - 本講義はわからないことは検索しながら 進めていくことが前提となっています - 質問タイムは適当に設けているので 適宜質問してください - 別途ハンズオン中に個別の質問も受け付けます -
ハンズオン終わった人はメンターを手伝ってください 3
本ハンズオンで得られる知識 - コンテナ技術やDockerの概要 - Dockerの基本コマンドの使い方 - Dockerfileの基本命令の使い方 - 研究用途としてのDockerfileの書き方 -
ほかの研究者が作成したDockerのコンテナでデ バッグ、一部改変の方法 4
本ハンズオンで得られない知識 - Dockerfileベストプラクティス - コンテナの運用知識 - コンテナ上でGPUを使う方法 - CloudNativeな環境が今どのようになっているの か
- コンテナそのものの実装レベルでの知識 5
機械学習についてはこちら https://speakerdeck.com/juju62q/machine-learning-environment-made-by-rancher 6
事前セットアップ(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
事前セットアップ(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
事前セットアップ(確認) 共通 docker version docker container ls docker-compose --version 9
Dockerの世界にようこそ! 10
本日やること - Dockerってなんで便利なの? - コンテナやDockerの概要 - Dockerfileを書いてみる - デバッグ用途でdockerコマンドを利用する -
docker-composeを使って 複数のコンテナを管理する 11
本日やること - Dockerってなんで便利なの? - コンテナやDockerの概要 - Dockerfileを書いてみる - デバッグ用途でdockerコマンドを利用する -
docker-composeを使って 複数のコンテナを管理する 12
アンケート 他人の研究環境を再現するのは大変だと思う 13
アンケート 自分の研究環境が正直よくわからない 14
アンケート 正直、明日研究室のマシンが壊れたら 一週間は進捗が出ない自信がある 15
アンケート 研究環境が何もしてないのに壊れた経験がある 16
アンケート 自分のPCが汚れると闇堕ちしてしまう 17
そんなあなたに! 18
19
Dockerを使ってできる世界 - 自分の開発環境をテキストにして管理できる - 一度動いたものはDockerさえ動くならOSや マシンをまたいでもほぼ動作する - 引継ぎ資料がとても簡単になる - 他の人もすぐに使うことができる
環境を作れる 20
本日やること - Dockerってなんで便利なの? - コンテナやDockerの概要 - Dockerfileを書いてみる - デバッグ用途でdockerコマンドを利用する -
docker-composeを使って 複数のコンテナを管理する 21
仮想化おさらい 1/4 ①非仮想化環境 22 ハードウェア ホストOS アプリケーション
仮想化おさらい 3/4 ②ゲストOS型仮想 23 ハードウェア VMware Workstation, VirtualBox ホストOS 仮想化アプリケーション
仮想マシンA アプリケーション ゲストOS 仮想マシンB アプリケーション ゲストOS 仮想マシンC アプリケーション ゲストOS
仮想化おさらい 3/4 ③ハイパーバイザ型仮想(ソフトウェア) ※厳密には完全仮想化と準仮想化で区別すべき。とくに Xenは異なるアーキテクチャを採用している。 24 ハードウェア VMware ESXi, Xen/Citrix
XenServer, Microsoft Hyper-V ハイパーバイザ 仮想マシンA アプリケーション ゲストOS 仮想マシンB アプリケーション ゲストOS 仮想マシンC アプリケーション ゲストOS
仮想化おさらい 4/4 ④ハイパーバイザ型仮想(カーネルモジュール) 25 ハードウェア Linux KVM ホストOS ハイパーバイザ 仮想マシンA
アプリケーション ゲストOS 仮想マシンB アプリケーション ゲストOS アプリケーション
コンテナ型”仮想化” 詳しくは後述しますがいわゆる仮想化ではない 26 ハードウェア Docker, LXC, rkt, haciniwa ホストOS コンテナエンジン
コンテナA アプリケーション コンテナエンジン アプリケーション コンテナB アプリケーション
違いはなに? 27
コンテナ型”仮想化”のメリット - 起動が速い - オーバヘッドが小さい - 小さなリソースに分割できる 28 OSが各個で動かないためにメリットが生まれる
コンテナ型”仮想化”のデメリット - ほぼ同一のカーネルでしか動かない - 分離が比較的弱い 29 OSが共通で動くためにデメリットが生じる
結局コンテナってどんなもの? 30
31 実際に動かしてみる ホストから見るとプロセス(仮想化じゃない)
しかしながら…? 32 - コンテナでは自身のコンテナ以外への アクセスを制限している - コンテナに与えるリソースを制限できる どうやって…?
Linux Namespace 33 ファイルシステム、プロセステーブル、ネットワークを 分割するLinuxカーネルの機能 ハードウェア ホストOS ユ ー ザ
プ ロ セ ス Namespace A ユ ー ザ プ ロ セ ス ユ ー ザ プ ロ セ ス Namespace B ユ ー ザ プ ロ セ ス ユ ー ザ プ ロ セ ス … ユ ー ザ プ ロ セ ス …
Linux Namespace 34 ファイルシステム、プロセステーブル、ネットワークを 分割するLinuxカーネルの機能 ハードウェア ホストOS ユ ー ザ
プ ロ セ ス Namespace A ユ ー ザ プ ロ セ ス ユ ー ザ プ ロ セ ス Namespace B ユ ー ザ プ ロ セ ス ユ ー ザ プ ロ セ ス … ユ ー ザ プ ロ セ ス … これがコンテナ!
Linux Namespace 35 namespace 説明 Mount namespace ファイルシステムの分離 UTS namespace
ホストネームの分離 IPC namespace IPC(プロセス間通信)の分離 User namespace ユーザ(UID/GID)の分離 PID namespace プロセステーブルの分離 Network namespace ネットワーク設定の分離 namespaceにいくつか種類があるので紹介します
cgroup 36 cgroups機能は、それぞれのグループに対してCPUや メモリ割り当てを制御する機能 ハードウェア ホストOS コンテナ A ユ ー
ザ プ ロ セ ス ユ ー ザ プ ロ セ ス コンテナ B ユ ー ザ プ ロ セ ス ユ ー ザ プ ロ セ ス CPU: 2コア メモリ: 4GB CPU: 1コア メモリ: 512MB
ここまでLinuxコンテナ。 じゃあ ってなんなのさ? 37
Dockerとは 38 Linuxカーネルの機能を統合し、コンテナを 作り上げる管理ツール
Dockerの基本機能 39 Dockerfileと呼ばれる手順書に - どのイメージから始めるか - どんな操作を行うか - 起動時に何をするか を記述してDocker
Imageを作る - DockerHubには公式で作られた Imageが多数ある - これを元にして環境を作るのが好 ましい (nvidia/cuda等例外もある) ベースImage Image層 Image作成操作 書き込み可能 Image
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
Dockerの基本機能 41 Dockerfileを書いてビルドを行い、Imageをリポジトリに pushしておけば誰でも同一環境が手に入る! レジストリ https://hub.docker.com 等 自分の研究 リポジトリ 他人の研究
リポジトリ tag: latest tag: latest push pull
つまり… 42 Dockerとは - コンテナの構築手順をレイヤとして保持 - 完成したコンテナイメージを登録 - 他人の作ったコンテナイメージを 実行&追加書き込み
- LinuxNamespaceで実行環境を分離 - cgroupでリソースを分割 できるツール
質疑&休憩 43
もっと詳しく知りたい人はこちら - コンテナ未経験新人が学ぶコンテナ技術入門 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
本日やること - Dockerってなんで便利なの? - コンテナやDockerの概要 - Dockerfileを書いてみる - デバッグ用途でdockerコマンドを利用する -
docker-composeを使って 複数のコンテナを管理する 45
問題集 取得方法 答えの確認方法 git clone https://github.com/Juju-62q/docker-handson.git git checkout answer 46
まずはコンテナを動かしてみよう docker image pull ubuntu:18.04 docker container run -it ubuntu:18.04
47 bashに入れた!ユーザ名も変わった!
まずはコンテナを動かしてみよう docker image pull ubuntu:18.04 docker container run -it ubuntu:18.04
48 DockerImageをDockerHubから引っ張る 引っ張ったコンテナイメージでコンテナを動かす -i インタラクティブ -t ttyを割り当てる
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
自前Dockerfileの動かし方 50 docker image build -t Juju-62q/hoge . docker container
run Juju-62q/hoge カレントディレクトリのDockerfileをビルドする -t imageに名前を付ける(DockerHubの名前と対応させる) ビルドしたコンテナイメージでコンテナを動かす ※こちらやらなくていいです
自前DockerfileをDockerHubに保存 51 docker image build -t Juju-62q/hoge:20190313 . docker image
push Juju-62q/hoge:20190313 カレントディレクトリのDockerfileをビルドする -t “ : ”以降でバージョンを管理できる ビルドしたコンテナイメージをpushする ※こちらやらなくていいです 要DockerHubのアカウントとリポジトリ
Dockerfileのコマンドまとめ 52 コマンド名 説明 FROM ベースイメージの指定 RUN コマンドを実行する(レイヤ作る) COPY ローカルのファイル/ディレクトリをコピーする(レイヤ作る)
CMD 起動時のコマンド指定 WORKDIR カレントディレクトリの変更 ADD COPYより機能が豪華(レイヤ作る) EXPOSE ポートの開放 ENV 環境変数の追加 VOLUME ボリュームの作成 USER ユーザの変更 ARG ビルド時に変数を使う ONBUILD 毎回ビルド時に実行する ENTRYPOINT docker runのときの基本実行コマンド
Dockerfileのコマンドまとめ 53 コマンド名 説明 FROM ベースイメージの指定 RUN コマンドを実行する(レイヤ作る) COPY ローカルのファイル/ディレクトリをコピーする(レイヤ作る)
CMD 起動時のコマンド指定 WORKDIR カレントディレクトリの変更 ADD COPYより機能が豪華(レイヤ作る) EXPOSE ポートの開放 ENV 環境変数の追加 VOLUME ボリュームの作成 USER ユーザの変更 ARG ビルド時に変数を使う ONBUILD 毎回ビルド時に実行する ENTRYPOINT docker runのときの基本実行コマンド とても覚えてほしい
Dockerfileのコマンドまとめ 54 コマンド名 説明 FROM ベースイメージの指定 RUN コマンドを実行する(レイヤ作る) COPY ローカルのファイル/ディレクトリをコピーする(レイヤ作る)
CMD 起動時のコマンド指定 WORKDIR カレントディレクトリの変更 ADD COPYより機能が豪華(レイヤ作る) EXPOSE ポートの開放 ENV 環境変数の追加 VOLUME ボリュームの作成 USER ユーザの変更 ARG ビルド時に変数を使う ONBUILD 毎回ビルド時に実行する ENTRYPOINT docker runのときの基本実行コマンド やや覚えてほしい
Dockerfileのコマンドまとめ 55 コマンド名 説明 FROM ベースイメージの指定 RUN コマンドを実行する(レイヤ作る) COPY ローカルのファイル/ディレクトリをコピーする(レイヤ作る)
CMD 起動時のコマンド指定 WORKDIR カレントディレクトリの変更 ADD COPYより機能が豪華(レイヤ作る) EXPOSE ポートの開放 ENV 環境変数の追加 VOLUME ボリュームの作成 USER ユーザの変更 ARG ビルド時に変数を使う ONBUILD 毎回ビルド時に実行する ENTRYPOINT docker runのときの基本実行コマンド 使うととてもおしゃれなDockerfileが作れる
ではさっきクローンした 問題のex4までやりましょう! 56
問題について - Pythonで作っています - インタプリタのほうが実行が楽 - RubyとPythonなら研究室ではPythonのほうが つかえる人多そう - 遊びたい人はほかの言語使ってもOK
- ちょっと難しいかもしれないです - 適宜呼んでいただければ対応します - 助け合ったりググったりして解いてください 57
質疑 58
もっと詳しく知りたい人はこちら - 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
本日やること - Dockerってなんで便利なの? - コンテナやDockerの概要 - Dockerfileを書いてみる - デバッグ用途でdockerコマンドを利用する -
docker-composeを使って 複数のコンテナを管理する 60
でもでも…? 61 他人の研究のコンテナイメージ引っ張って コマンドがbashとかじゃなかったらデバッグできなくない?
例えば… Pythonのコンテナを実行する docker container run -it python:3.7.2 62 そらみたことか!
起動コマンドを変えてみる Pythonのコンテナを実行する docker container run -it python:3.7.2 bash 63 ここに起動コマンドを記述可能
まだまだ…? 64 僕の研究機密情報扱ってるからDockerHubにpushできない! あと、機械学習とかでデータがでかいとそもそもそのデータイメー ジに含めたら地獄じゃない?
Data Volume - ホストと共有 - ホストマシンのデータをイメージに含めずにコンテナ内部 からも扱えるようにする - 認証情報とかを扱うときに利用 -
コンテナに作成 - コンテナの内部に永続ボリュームを作る - DBの中身とかを扱うときに便利 - コンテナを跨いで共有 65
Data Volume - ホストと共有 - ホストマシンのデータをイメージに含めずにコンテナ内部 からも扱えるようにする - 認証情報とかを扱うときに利用 -
コンテナに作成 - コンテナの内部に永続ボリュームを作る - DBの中身とかを扱うときに便利 - コンテナを跨いで共有 66 研究用途だとこれが割と便利
ホストのディレクトリをマウントする ディレクトリを作ってコンテナと共有する 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 コンテナで作ったものがホスト側にある ホストで作ったものがコンテナ側にある
コンテナにポートフォワードする ホストの8080をコンテナの80にフォワードする docker container run -p 8080:80 nginx (別ターミナルを開く) curl
localhost:8080 69
問題のex6までやりましょう! 70
質疑 71
本日やること - Dockerってなんで便利なの? - コンテナやDockerの概要 - Dockerfileを書いてみる - デバッグ用途でdockerコマンドを利用する -
docker-composeを使って 複数のコンテナを管理する 72
まだいける…? 73 でもでも、僕dockerコマンドなんて多すぎて覚えられないんだけ ど?どうにかならんの?
docker-compose - コンテナの動かし方をyamlで記述できる - どのイメージをどの名前で使うかを記述できる - 各オプションをどのように記述するかを定義できる - 複数のコンテナを一括で管理できる -
コンテナネットワークをいい感じに貼ってくれる - どういう関係なのかも定義できる 74
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
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では相対パスの記述が可能 イメージの記述が宣言的に可能
docker-composeの動かし方 77 docker-compose up --build docker-compose run klee bash コンテナ群を起動させる
--build コンテナをビルドしながら起動する コンテナで任意の命令を動かす ※こちらやらなくていいです
少し細かいプラクティス 78 1つのコンテナでは、1つだけプロセスを動かすべき ハードウェア ホストOS コンテナ A Python コンテナ B
MySQL コンテナ B Nginx
複数のコンテナも管理できる 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 ※こちらやらなくていいです
複数のコンテナも管理できる 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ファイルを作って管理するのが一般的) ※こちらやらなくていいです
問題のex7をやりましょう! (DB面倒くさいのでNginxです) 81
質疑 82
もっと詳しく知りたい人はこちら - Docker Compose 徹底解説 さくらインターネットの方が書いている資料 ( https://www.slideshare.net/zembutsu/docker-compose-guidebook ) Docker
Composeの使い方から実運用まで簡単に 書かれています 83
ここまででハンズオンは終了です 84
まとめ - Dockerfileを使うことで自分の研究環境が 明らかになる - Docker使うと他人の研究環境の再現が簡単 - コンテナの中でデバッグもできる - ホストのディレクトリも読むことができる
- 起動コマンドも簡単に管理できる - プロセスたくさんあっても一括処理できる 85
お越しいただきありがとうございました & 長丁場、お疲れさまでした 86