DockerのサブセットをRustで自作した (Docker + Rust = Rocker 🤟)
DockerのサブセットをRustで自作してみました。
詳細な実装の解説はこの記事では行っていないので、気になる方はソースコードをご参照ください🙏
概要
今のところ以下の機能が実装されています。
- コンテナの実行 (
docker run
相当) - 実行中のコンテナ一覧の取得 (
docker ps
相当) - pull済みのイメージ一覧の取得 (
docker images
相当) - 実行中のコンテナ内で新しいコマンドを実行 (
docker exec
相当) - イメージの削除 (
docker rmi
相当)
自作しようと思ったきっかけ
Kubernetes 1.20 からDockerが非推奨になったときに、さほど利用者には影響がないにも関わらず自分はなんとなく慌ててしまい、Dockerを雰囲気で使ってることに気づいたのでDockerがどうやって動いてるのかを理解するためにDocker (のサブセット) を自作してみました。
Dockerを自作しているプロジェクトはすでにいくつか存在し、有名なものだと100行程度のシェルスクリプトで実装しているBockerやGoで実装されているGockerなどがあります。今回はBockerやGockerのコードを参考にしながら自作Dockerの実装を行いました。
大まかな実装の説明
コンテナを実行するにあたり使った技術は基本的にはDocker (runc) と同じで、プロセスの分離には namespace や chroot、リソースの制限には cgroup (v1 / v2) を使いました。詳細な実装はぜひRockerのソースコードを読んでいただけるとありがたいです。
ネットワーク構成についてもほとんどDockerのbridgeネットワーク (下図) と同じような構成になっています。ネットワークについては私があまり詳しくないということもあり、既存プロジェクトのコードを読んでもよく分からなかったのですが こちらの記事 はとても分かりやすくまとめられており助かりました。
学んだこと
- コンテナを実行するために使われている技術 (Linuxの機能) についての理解が深まった
- Rustで何か作るのは初めてだったが、だいぶRustの雰囲気に慣れてきた