SlideShare a Scribd company logo
Docker 超入門
CAMPHOR- DAY 2020
Koki Makita @km_conner
自己紹介
• Twitter: @km_conner
• GitHub: KMConner
• 春から京都大学大学院 M1
• 普段はバイトで C# & 研究で Python
このトークについて
話すこと
• モジュール間の関係性 (dockerd, containerd,…)
• runc がコンテナ間で環境を分離している仕組み
質問などあれば YouTube Live のコメント or Twitter の
#camphor_day まで!
Docker 使ってますか?
Docker とは?
もともとは港湾作業者 (コンテナの船からの積み下ろしなどをする
人) の意味
特徴としては
• コンテナごとに環境を分離することが可能
• Dockerfile をもとに作成されるイメージによりホスト OS に関わら
ずほぼ同じ環境を再現できる
Dockefile を書くだけで Docker を理解したと
思っていませんか?
それよりももっと奥深いもの
このトークのゴール
Docker の中身をざっくり
と理解する
このトークで扱う範囲
• Linux 上の docker に限定 (Windows は今回は扱わない)
• Docker はランタイムとして runc を使用していると仮定
• これ以降に示すコマンドはすべて Ubuntu 18.04 において実行
Docker に含まれるモジュール群
モジュール概観
Docker CLI
dockerd
containerd
RunC
Registry
REST API
gRPC
ランタイムとして使用
イメージの
Push/Pull
Docker CLI
いわゆる docker コマンド
• docker run …
• docker build …
dockerd の REST API で通信
• TCP ソケット、 Unix ソケットなどを通じて通信
dockerd
• docker cli が使用する REST API を公開する daemon
• containerd と gRPC を通じて通信
Docker CLI
dockerd
containerd
RunC
Registry
REST API
gRPC
ランタイムとして使用
イメージの
Push/Pull
containerd
• gRPC Endpoint で待ち受ける daemon
• コンテナのライフサイクル管理
• イメージの push / pull
• runc などのランタイムのコマンドを実行する
Docker CLI
dockerd
containerd
RunC
Registry
REST API
gRPC
ランタイムとして使用
イメージの
Push/Pull
runc
• containerd が使用するランタイム
• 実際にコンテナを作成するのはココ!
• OCI (Open Container Initiative) の規格に準拠
Docker CLI
dockerd
containerd
RunC
Registry
REST API
gRPC
ランタイムとして使用
イメージの
Push/Pull
OCI とは
コンテナイメージやコンテナランタイムの
仕様を定めている団体
Runc が環境分離を実現している
仕組み
名前空間
• PID などがコンテナ外から見えないようにするための仕掛け
• 基本的に名前空間の外は見えない
• 分離するもの
• PID (名前空間が違えば同じプロセス ID のプロセスが存在できる)
• MNT (ファイルシステムのツリーを完全に分離できる)
• NET (IP アドレス、ルーティングなどのネットワークスタックを分離)
• IPC (共有メモリ空間の分離)
• UTS (ホスト名、ドメインの分離)
• etc…
名前空間とコンテナの関係
• コンテナは (特に何も指定しなければ) 別の名前空間で実行され
るプロセス
• PID, MNT などの名前空間を新しく作ってその中でプロセスを実
行
名前空間の確認方法
• /proc/[pid] ディレクトリに、 各プロセスの情報が入っている
• /proc/self は特殊なリンクで、現在実行中のプロセスの情報にリ
ンクしている
• 例
• /proc/self/cwdはカレントディレクトリへのリンク
• /proc/self/exeは実行中のファイル
$ ls -la /proc/self/cwd /proc/self/exe
lrwxrwxrwx1root root 0 3月 28 11:41 /proc/self/cwd ->/root
lrwxrwxrwx1root root 0 3月 28 11:41 /proc/self/exe -> /bin/ls
名前空間の確認方法
• /proc/self/ns ディレクトリにある!
$ls -l /proc/self/ns
total0
lrwxrwxrwx1rootroot0 3月 2811:48cgroup->'cgroup:[4026531835]'
lrwxrwxrwx1rootroot0 3月 2811:48ipc ->'ipc:[4026531839]'
lrwxrwxrwx1rootroot0 3月 2811:48mnt-> 'mnt:[4026531840]'
lrwxrwxrwx1rootroot0 3月 2811:48net-> 'net:[4026531992]'
lrwxrwxrwx1rootroot0 3月 2811:48pid-> 'pid:[4026531836]'
lrwxrwxrwx1rootroot0 3月 2811:48pid_for_children-> 'pid:[4026531836]'
lrwxrwxrwx1rootroot0 3月 2811:48user->'user:[4026531837]'
lrwxrwxrwx1rootroot0 3月 2811:48uts->'uts:[4026531838]'
名前空間を見てみる
一番上はホスト側のシェル、下の 2 つはそれぞれ別のコンテナで
PID namespace を確認した結果
すべてバラバラ
$ls -l /proc/self/ns/pid
lrwxrwxrwx1rootroot0 3月 2812:07/proc/self/ns/pid-> 'pid:[4026531836]’
$ls -l /proc/self/ns/pid
lrwxrwxrwx1rootroot0Mar2803:10/proc/self/ns/pid-> 'pid:[4026532149]’
$ls -l /proc/self/ns/pid
lrwxrwxrwx1rootroot0Mar2803:11/proc/self/ns/pid-> 'pid:[4026532281]'
名前空間だけで十分ですか?
名前空間以外のテクニック
ただ単に名前空間で分離しただけでは不十分!
• システムコールの制限
• ファイルアクセスの制限
• etc…
システムコールの制限
• システムコールの中にはコンテナの外に影響を及ぼすものもある
• 例: SYS_TIME
• システムの時刻を設定する
• date–s“2020-07-24” (要 root 権限) でシステムの時計のセット
• デフォルトではコンテナ内から使用できない
• docker run --cap-add SYS_TIME … で使用可能に
システムコールの制限
コンテナ内から
何の (予定だった) 日付でしょう??
$ date –s “2020-07-24”
Fri Jul 24 00:00:00 UTC 2020
ファイルのアクセス制限
ファイルへのアクセスを制限したいファイルがある
例
$ echo c > /proc/sysrq-trigger
とするとシステムがクラッシュする (要 root 権限)
$ echo b > /proc/sysrq-trigger
とするとシステムが強制的に再起動(要 root 権限)
☞ 読み取り専用にする or 表示しないなどの対策
まとめ
• Docker は 1 つのアプリケーションではなくいくつかのモジュール
が連携して動いている
• runc ではコンテナ仮想化を実現するために名前空間をはじめと
する Linux カーネルの機能を使用している
• 他にも docker にまつわる Linux カーネルの機能はたくさんある
ので気になる人は以下の単語で調べてみてください
• Overlay File System
• Cgroup
• Etc…

More Related Content

What's hot

Docker入門~word press環境を作ってみる ハンズオン編 ver1.4~ pulic
Docker入門~word press環境を作ってみる ハンズオン編 ver1.4~ pulicDocker入門~word press環境を作ってみる ハンズオン編 ver1.4~ pulic
Docker入門~word press環境を作ってみる ハンズオン編 ver1.4~ pulic
cyberblack28 Ichikawa
 
Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話
Masahito Zembutsu
 
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
Masahito Zembutsu
 
Docker実践入門
Docker実践入門Docker実践入門
Docker実践入門
hiro nemu
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Masahito Zembutsu
 
清貧Docker ~個人がDockerを使う理由~
清貧Docker ~個人がDockerを使う理由~清貧Docker ~個人がDockerを使う理由~
清貧Docker ~個人がDockerを使う理由~
harupong
 
捕鯨!詳解docker
捕鯨!詳解docker捕鯨!詳解docker
捕鯨!詳解docker
雄哉 吉田
 
今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月
今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月
今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月
VirtualTech Japan Inc.
 
JAWS-UG コンテナ支部 Docker入門 ハンズオン
JAWS-UG コンテナ支部 Docker入門 ハンズオンJAWS-UG コンテナ支部 Docker入門 ハンズオン
JAWS-UG コンテナ支部 Docker入門 ハンズオン
Ryo Nakamaru
 
Dockerの仕組みとIIJ社内での利用例
Dockerの仕組みとIIJ社内での利用例Dockerの仕組みとIIJ社内での利用例
Dockerの仕組みとIIJ社内での利用例
maebashi
 
15分で分か(った気になれ)るDocker
15分で分か(った気になれ)るDocker15分で分か(った気になれ)るDocker
15分で分か(った気になれ)るDocker
Masahiro NAKAYAMA
 
Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方
Yuichi Ito
 
Docker技術情報アップデート 2015年7月号
Docker技術情報アップデート 2015年7月号Docker技術情報アップデート 2015年7月号
Docker技術情報アップデート 2015年7月号
Masahito Zembutsu
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
Masahito Zembutsu
 
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
Kunihiro TANAKA
 
Docker hands on nifty sakura jul19
Docker hands on nifty sakura jul19Docker hands on nifty sakura jul19
Docker hands on nifty sakura jul19
Masahito Zembutsu
 
Dockerが抱えるネットワークの課題
Dockerが抱えるネットワークの課題Dockerが抱えるネットワークの課題
Dockerが抱えるネットワークの課題
Asuka Suzuki
 
ゆるふわなDockerの使い方
ゆるふわなDockerの使い方ゆるふわなDockerの使い方
ゆるふわなDockerの使い方
Kento Aoyama
 
何者(Dockerって)
何者(Dockerって)何者(Dockerって)
何者(Dockerって)
Koji Saiki
 
Docker技術情報アップデート v1.9 ネットワークとオーケストレーション
Docker技術情報アップデート v1.9 ネットワークとオーケストレーションDocker技術情報アップデート v1.9 ネットワークとオーケストレーション
Docker技術情報アップデート v1.9 ネットワークとオーケストレーション
Masahito Zembutsu
 

What's hot (20)

Docker入門~word press環境を作ってみる ハンズオン編 ver1.4~ pulic
Docker入門~word press環境を作ってみる ハンズオン編 ver1.4~ pulicDocker入門~word press環境を作ってみる ハンズオン編 ver1.4~ pulic
Docker入門~word press環境を作ってみる ハンズオン編 ver1.4~ pulic
 
Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話
 
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
 
Docker実践入門
Docker実践入門Docker実践入門
Docker実践入門
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
 
清貧Docker ~個人がDockerを使う理由~
清貧Docker ~個人がDockerを使う理由~清貧Docker ~個人がDockerを使う理由~
清貧Docker ~個人がDockerを使う理由~
 
捕鯨!詳解docker
捕鯨!詳解docker捕鯨!詳解docker
捕鯨!詳解docker
 
今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月
今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月
今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月
 
JAWS-UG コンテナ支部 Docker入門 ハンズオン
JAWS-UG コンテナ支部 Docker入門 ハンズオンJAWS-UG コンテナ支部 Docker入門 ハンズオン
JAWS-UG コンテナ支部 Docker入門 ハンズオン
 
Dockerの仕組みとIIJ社内での利用例
Dockerの仕組みとIIJ社内での利用例Dockerの仕組みとIIJ社内での利用例
Dockerの仕組みとIIJ社内での利用例
 
15分で分か(った気になれ)るDocker
15分で分か(った気になれ)るDocker15分で分か(った気になれ)るDocker
15分で分か(った気になれ)るDocker
 
Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方
 
Docker技術情報アップデート 2015年7月号
Docker技術情報アップデート 2015年7月号Docker技術情報アップデート 2015年7月号
Docker技術情報アップデート 2015年7月号
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
 
Docker hands on nifty sakura jul19
Docker hands on nifty sakura jul19Docker hands on nifty sakura jul19
Docker hands on nifty sakura jul19
 
Dockerが抱えるネットワークの課題
Dockerが抱えるネットワークの課題Dockerが抱えるネットワークの課題
Dockerが抱えるネットワークの課題
 
ゆるふわなDockerの使い方
ゆるふわなDockerの使い方ゆるふわなDockerの使い方
ゆるふわなDockerの使い方
 
何者(Dockerって)
何者(Dockerって)何者(Dockerって)
何者(Dockerって)
 
Docker技術情報アップデート v1.9 ネットワークとオーケストレーション
Docker技術情報アップデート v1.9 ネットワークとオーケストレーションDocker技術情報アップデート v1.9 ネットワークとオーケストレーション
Docker技術情報アップデート v1.9 ネットワークとオーケストレーション
 

Similar to CAMPHOR- day 2020 - Docker 超入門

はじめてのDockerパーフェクトガイド(2017年版)
はじめてのDockerパーフェクトガイド(2017年版)はじめてのDockerパーフェクトガイド(2017年版)
はじめてのDockerパーフェクトガイド(2017年版)
Hiroshi Hayakawa
 
DockerとDocker Hubの操作と概念
DockerとDocker Hubの操作と概念DockerとDocker Hubの操作と概念
DockerとDocker Hubの操作と概念
Masahito Zembutsu
 
鯨物語~Dockerコンテナとオーケストレーションの理解
鯨物語~Dockerコンテナとオーケストレーションの理解鯨物語~Dockerコンテナとオーケストレーションの理解
鯨物語~Dockerコンテナとオーケストレーションの理解
Masahito Zembutsu
 
どっかのしたのほう
どっかのしたのほうどっかのしたのほう
どっかのしたのほう
_norin_
 
Docker Tokyo
Docker TokyoDocker Tokyo
Docker Tokyo
cyberblack28 Ichikawa
 
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
Masahito Zembutsu
 
Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクル
Masahito Zembutsu
 
GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望
GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望
GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望
Tetsuo Yamabe
 
Dockerを支える技術
Dockerを支える技術Dockerを支える技術
Dockerを支える技術
Etsuji Nakai
 
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Masahiro Nagano
 
Docker handson
Docker handsonDocker handson
Docker handson
koda3
 
Docker Swarm入門
Docker Swarm入門Docker Swarm入門
Docker Swarm入門
Masahito Zembutsu
 
INF-015_そこのコンテナ、うまく積めてるね! ~Windows アプリケーション コンテナの展開と運用~
INF-015_そこのコンテナ、うまく積めてるね! ~Windows アプリケーション コンテナの展開と運用~INF-015_そこのコンテナ、うまく積めてるね! ~Windows アプリケーション コンテナの展開と運用~
INF-015_そこのコンテナ、うまく積めてるね! ~Windows アプリケーション コンテナの展開と運用~
decode2016
 
Newcomer2020 Docker研修
Newcomer2020 Docker研修Newcomer2020 Docker研修
Newcomer2020 Docker研修
Suguru Yazawa
 
20170124 linux basic_1
20170124 linux basic_120170124 linux basic_1
20170124 linux basic_1
YUSUKE MORIZUMI
 
Recap: Modern CI/CD with Tekton and Prow Automated via Jenkins X - Kubernetes...
Recap: Modern CI/CD with Tekton and Prow Automated via Jenkins X - Kubernetes...Recap: Modern CI/CD with Tekton and Prow Automated via Jenkins X - Kubernetes...
Recap: Modern CI/CD with Tekton and Prow Automated via Jenkins X - Kubernetes...
JUNICHI YOSHISE
 
コンテナ on Windows
コンテナ on Windowsコンテナ on Windows
コンテナ on Windows
Tsubasa Nomura
 
DockerでWordPressサイトを開発してみよう
DockerでWordPressサイトを開発してみようDockerでWordPressサイトを開発してみよう
DockerでWordPressサイトを開発してみよう
mookjp
 
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけねGitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
Naoto TAKAHASHI
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on docker
Hiroshi Miura
 

Similar to CAMPHOR- day 2020 - Docker 超入門 (20)

はじめてのDockerパーフェクトガイド(2017年版)
はじめてのDockerパーフェクトガイド(2017年版)はじめてのDockerパーフェクトガイド(2017年版)
はじめてのDockerパーフェクトガイド(2017年版)
 
DockerとDocker Hubの操作と概念
DockerとDocker Hubの操作と概念DockerとDocker Hubの操作と概念
DockerとDocker Hubの操作と概念
 
鯨物語~Dockerコンテナとオーケストレーションの理解
鯨物語~Dockerコンテナとオーケストレーションの理解鯨物語~Dockerコンテナとオーケストレーションの理解
鯨物語~Dockerコンテナとオーケストレーションの理解
 
どっかのしたのほう
どっかのしたのほうどっかのしたのほう
どっかのしたのほう
 
Docker Tokyo
Docker TokyoDocker Tokyo
Docker Tokyo
 
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
 
Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクル
 
GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望
GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望
GMO プライベート DMP 開発で 取り組んできた DevOps と今後の展望
 
Dockerを支える技術
Dockerを支える技術Dockerを支える技術
Dockerを支える技術
 
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
 
Docker handson
Docker handsonDocker handson
Docker handson
 
Docker Swarm入門
Docker Swarm入門Docker Swarm入門
Docker Swarm入門
 
INF-015_そこのコンテナ、うまく積めてるね! ~Windows アプリケーション コンテナの展開と運用~
INF-015_そこのコンテナ、うまく積めてるね! ~Windows アプリケーション コンテナの展開と運用~INF-015_そこのコンテナ、うまく積めてるね! ~Windows アプリケーション コンテナの展開と運用~
INF-015_そこのコンテナ、うまく積めてるね! ~Windows アプリケーション コンテナの展開と運用~
 
Newcomer2020 Docker研修
Newcomer2020 Docker研修Newcomer2020 Docker研修
Newcomer2020 Docker研修
 
20170124 linux basic_1
20170124 linux basic_120170124 linux basic_1
20170124 linux basic_1
 
Recap: Modern CI/CD with Tekton and Prow Automated via Jenkins X - Kubernetes...
Recap: Modern CI/CD with Tekton and Prow Automated via Jenkins X - Kubernetes...Recap: Modern CI/CD with Tekton and Prow Automated via Jenkins X - Kubernetes...
Recap: Modern CI/CD with Tekton and Prow Automated via Jenkins X - Kubernetes...
 
コンテナ on Windows
コンテナ on Windowsコンテナ on Windows
コンテナ on Windows
 
DockerでWordPressサイトを開発してみよう
DockerでWordPressサイトを開発してみようDockerでWordPressサイトを開発してみよう
DockerでWordPressサイトを開発してみよう
 
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけねGitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
GitHubのリポジトリ(32個)を 覗いてみよう。 ただし、READMEだけね
 
Building production server on docker
Building production server on dockerBuilding production server on docker
Building production server on docker
 

CAMPHOR- day 2020 - Docker 超入門

Editor's Notes

  1. では、「Docker 超入門」というタイトルで話します
  2. 簡単に自己紹介 本名は巻田、 Twitter やってるんでフォローお願いします 今年の春から京大の大学院、情報学研究科の M1 普段はバイトで C# を書きつつ研究では Python で Deep Learning
  3. このトークでは主に 2 つのことに関して話します モジュール間の関連性 (1 つのモノリシックなシステムではなく、複数のモジュールから構成されている) ランタイム「runc」 がコンテナ間で環境を分離している仕組み 質問などあればこのライブのコメントに書くか、 Twitter のハッシュタグでつぶやいて
  4. Docker 使ってますか?? 便利ですよね???
  5. まず、 Docker とはそもそも何か???に関して話します 英単語としての docker は港とかで作業する人、の意味で、コンテナとかの積み下ろしなどをする人です で、アプリケーションの docker はこれらの特徴 環境分離 コンテナに入れるとアプリケーション間の干渉が起こらない 同じ状況を再現 ライブラリ、ミドルウェアとかの環境がそっくりそのまま
  6. Docker は魔法ではなく、ちゃんとバックに動作の仕組みが存在する!
  7. このトークの目標は Docker が動いている仕組みをざっくりと理解する
  8. 今回は、 Linux 上の docker に関してのみ扱う。 Windows 上の docker も存在はするが、今回は扱わない Docker ランタイム、 (これは後で説明) には runc を使用 ちなみに、今後に示すコマンドは ubuntu 18.04 で、 実行、 docker は snap で入れたもの、 あと、コマンドは基本的に root で実行してる
  9. まずは、 docker を構成するモジュールたちに関して解説
  10. 全体がこんな感じ、 今回jは左側の 4 つに関して解説。 ちなみに、右にある registry は docker image を格納しておくサービスで、 Docker Hub や GitHub Packages などが有名
  11. まずは、 docker CLI に関して解説 いわゆる docker コマンドを叩いた時に最初に呼び出されるプログラム このプログラムは dockerd が提供する REST API のクライアントになっている REST API は TCP ソケットや Unix ソケットなどを通じて通信している
  12. Dockerd は cli が使用する REST API を公開している daemon ちなみに、 linux 上のアプリケーションで d が最後に着くのは daemon と言ってバックグラウンドで動き続ける、 httpd とか sshd とか REST API 内の動作は containerd と gRPC で通信して動いている
  13. Containerd は、 dockerd が使う gRPC インタフェースを提供 コンテナのライフサイクル管理、作成、起動、削除など イメージの push と pull コンテナ周りの具体的な機能はコンテナランタイムの runc に任せている
  14. Runc とは containerd が依存する、コンテナランタイムで、実際にコンテナを作ったりする ただし、 runc は OCI が定めた企画に従って作成されている。 他にもランタイムは存在するので、代替可能 OCI はコンテナ周りの仕様を決めている団体で、コンテナランタイム以外にもイメージに関する企画も決めている
  15. 次は、 runc が環境の分離を実現している仕組みを解説
  16. Runc では、ホスト OS とコンテナで同じ共有されたカーネルを使用している。 で、その中でものを分離するのに使われるのが namespace これによって namespace 内から namespace 外のものが基本的に見えなくなるため環境が分離される NS にはいくつかの種類があり、分離しているリソースが異なっている 一つずつ見ていくと、 PID name space は名前空間を分けることで同じプロセス ID のプロセスが存在できるようにする MNT name space はファイルシステムのマウントポイントを他の name space から見えないようにしてファイルシステムのツリーを完全に分離する network name space は IP アドレス、 NIC などの network stack を分離する IPC name space はプロセス間通信で使用される共有メモリを、分離する UTS name space は同じホストで複数の host name, domain の利用を可能にする 他にも色々ある。 詳しくはググってみてください
  17. では、名前空間を実際に確認する方法を紹介 その前に、プロセスの情報を見る方法を紹介します /proc ディレクトリの中を見ると、数字のディレクトリがいっぱい! で、これの一部はプロセス ID に該当するもの 他に、 /proc/self は特別なリンクで、現在実行中のpid のディレクトリにリンクしている つまり、 /proc/self ディレクトリに、現在実行中のプロセスに関する情報が入ってる。 中身はいろいろあるが、、、 cwd, exe はそれぞれカレントディレクトリ、実行中のプログラムへのリンクが張られている。
  18. 先ほどの /proc/self の中に、 /proc/self/ns というディレクトリがあり、その中に namespace に関する情報が入っている ここを見ると nams space の一覧が見られる
  19. では、実際にホスト側のシェル、コンテナ内のシェルで実際に name space を見てみる、 ここでは PID name space を見てみる 一番上がホスト側、下 2 つがそれぞれ別のコンテナ内で PID を確認した結果 赤字の部分を見てわかるが、すべて別々の名前空間内で実行されていることがわかる
  20. では、名前空間があればそれで充分分離できているのか??????
  21. そんなことはない!!!! コンテナ内の処理は、基本的に外から見ると root 権付で実行されることが多いため、結構厄介 他にもいろいろと必要な機能があるが、ここでは システムコールの制限、 ファイルアクセスの制限 を紹介。
  22. システムコールとは、要するに OS カーネルの機能呼び出しみたいな感じ、 で、カーネルと話すので、カーネルの動作に影響する可能性があり、それは完全なコンテナ間の分離を妨げる。 例えばシステムの時刻を設定するシステムコールを考える。 システムの時刻設定は date コマンドで行える。 例えば、 OTP とかは時刻に従って生成されているシステムも多い。 つまり、システムの時計が狂うとこれはいろいろとヤバイ デフォルトでコンテナ内からは実行できないが、 --cap-add すればコンテナ内から実行できる。
  23. 実際に動かしてみると、 コンテナ内から、このコマンドを実行したところ、ホスト OS の時計が変わる! ちなみに、この日付は???? まあググってみてw
  24. 他にも、ファイルシステム上にはファイルのアクセス制限が必要な場合がある 例えば、 /proc/sysrq-trigger のファイルは以下のような性質がある C を書き込むとクラッシュ、 B を書き込むと強制的な再起動 これでは困るので、読み取り専用にするとか非表示にするとかの対策。
  25. まとめです。 まず、 Docker はものしりっくなものではない! で、 ruunc ではいろいろと仮想化のために Linux カーネルの機能を利用している 他にも docker にまつわる linux kernel の機能は沢山あるので、興味あればこの辺の単語でググってみてください、