EXPLORINEER
ja

Hacker News

Dockerは変だ

ソフトウェア初登場 800ポイントコメント330件


この記事は、ある開発者がDockerの仕組みを学ぶために自作のコンテナ実行環境を作り始め、その中で見つけた「Dockerの不思議な点」をまとめたものです。

何が書かれているか

筆者は趣味で自分のコンテナ実行環境(コンテナランタイム)を作り始めました。そこで、Dockerにはいくつか意外な仕組みがあることに気づきました。コンテナは「特別な制限をかけられた普通のプロセス」であり、イメージは「フォルダ」であることなどを説明しています。

コンテナとは?

コンテナは、アプリを箱に入れるように、動きに必要なものをまとめて動かす仕組みです。仮想マシン(VM)とは違い、ホストのOSカーネルを直接使います。そのため、コンテナは軽く速く動きます。

押さえておきたいポイント

  • コンテナは、Linuxの5つのカーネル機能を組み合わせて作られている
  • namespaces(名前空間)は、見える範囲を隠す役割をもつ
  • cgroups(コントロールグループ)は、使えるリソース量を制限する
  • イメージは、コンテナのルートディレクトリとして使われるフォルダである

Dockerの不思議な点

  • Dockerのランタイム runc は Go 言語で書かれているが、Go は一つのスレッドで動く処理が必要な場面に向いていない
  • runc は Go の起動前に動く C のモジュールを使って、その問題を回避している
  • Go には fork がないため、/proc/self/exe を特別な引数付きで実行して fork に近い動きを再現している
  • Dockerデーモンは通常 root 権限で動く。ただし、rootless にすると、ネットワーク機能を再実装する必要がある

なぜ大事なのか

Dockerは多くの開発者が毎日使う道具です。その中身を知ると、トラブルの原因を見つけやすくなり、セキュリティも考えやすくなります。筆者の言うように、自分で作ってみることは、ツールを深く理解する良い方法です。

用語解説

Docker
アプリをコンテナという箱に入れて動かすためのソフトウェアです。
runc
Dockerが使うコンテナ実行用のプログラムです。
namespaces
プロセスから見える範囲を分ける Linux の仕組みです。
cgroups
プロセスが使える CPU やメモリなどの量を制限する Linux の仕組みです。
Go
Google が作ったプログラミング言語です。

出典: Hacker Newsで原文を読む ↗

この記事は原文をもとにAIがやさしい言葉で書き直した解説です。事実関係は原文をご確認ください。