Share
Embed
Transcript
18 slides
-
今日のお題: Dockerを深く学ぼう 経緯: Job huntingで海外のOS Software Engineerを申し込もうとしたところOSについ ての経験を求められ, 普段の研究以外に仮想化技術のアピールするかってことで, Dockerそのものをいじっていた,
調べていた時の記録をLTにしようと思った 毎度のことで, 間違ってたらすまん, あと可搬性とかオーケストレーションとかみたいなベ ストプラクティスの話はしないです 参考資料: LXCで学ぶコンテナ入門 -軽量仮想化環境を実現する技術 工学基礎シリーズ オペレーティングシステム Binary Hacks Rebooted ―低レイヤの世界を探検するテクニック89選 Docker実践ガイド 第3版 -
・Linux NamespaceというLinuxの機能 ・プロセスの名前空間を分離する ・どういうことかというと, プロセスから見えるProcess ID, Network, Mount Pointなどを 隔離する
・話していると無限に時間が使えちゃうのでコマンドを実行してさっと見せる Container仮想化の構成要素: Namespace -
Container仮想化の構成要素: Namespace 例えば, PID Namespaceを分離させてみる。unshare –fork –pid –mount-procで新し い/procを見てみると...(unshareについては大体こちら) なんと,
あれだけたくさんあったProcess IDが2つに減ってしまった‼ →Docker container内部ではDocker外部のHostのPIDが見えないのはこういうこと 他にもNetworkなどは同じようにLinux Namespaceで分離する -
Container仮想化の構成要素: chroot ・Containerの中身は全く別のシステムのファイルシ ステムが見える ・実はこれはHost fileの一部を隔離したものを chrootでrootの位置を変更している ・Linux distributionはkernelは共通でpackage管 理システムやinit
systemなどが違うという違いがあ るので, distributionのfile構成をこぴってくれば良い ・ここまでのunshare + chrootで簡単なcontainer 構成は作れる 工学基礎シリーズ オペレーティングシステム -
Container仮想化の構成要素: chroot じゃあalpineを例に中身を見てみましょう wget https://dl-cdn.alpinelinux.org/alpine/v3.15/releases/x8 6_64/alpine-minirootfs-3.15.3-x86_64.tar.gz tar -xvzf alpine-minirootfs-3.15.3-x86_64.tar.gz ls
alpine/ みたことある/以下のファイル構成が見える-> alpineコンテナの際はここをrootにしている -
Container仮想化の構成要素: cgroup ・コンテナが暴れすぎないようにプロセスにハードウェアの利用制限をかけるもの ・実はデフォルトのプロセスも何かしらのcgroupに所属している CPU 制御: 割り当てコア数や時間配分の制限 メモリ制御: 最大使用メモリ量の制限、 OOM
キル I/O 制御: ディスクやネットワーク帯域の制御 プロセス数制御 : fork できるプロセス数を制限 ・Containerのハードウェア制限もこのcgroupでかけています -
Containerの外部からContainer内部を操作してみた ・実際のMacの上で立ち上がっているLinuxKit VMにはDocker経由で入る方法が提供 されています。docker run -it --privileged --pid=host justincormack/nsenter1で入りま しょう
・dockerのファイルの実態は/var/lib/docker/volumes/<container name>/_dataにあり ます -
つまりどういうこと? ・多分Docker CLIとかはmetadataだけをみているんじゃないかと思う(実際のところ metricsを取るためだけに何回もcontainer file実態の中身をみに行くのは非効率なよう に感じる) ・SSDの故障でContainerデータだけ破壊されて, metadata.dbは無事な場合, Containerのvolumeが無事じゃないことはおそらくDockerの監視だけではわからない場 合がある。metadataが無事だからおそらく無事だろうという障害原因の切り分けができ
ないことがこのことから予測できる。(インフラって難しいね) ・Dockerから提供されているAPI以外でそもそも動かすんじゃない ・みんなも今日の内容を完全理解してOS Software Engineerになろう