DockerのサブセットをRustで自作した (Docker + Rust = Rocker 🤟)

DockerのサブセットをRustで自作してみました。

github.com

詳細な実装の解説はこの記事では行っていないので、気になる方はソースコードをご参照ください🙏

 

概要

スクリーンショット 2021-04-08 1 28 27

今のところ以下の機能が実装されています。

  • コンテナの実行 (docker run 相当)
  • 実行中のコンテナ一覧の取得 (docker ps 相当)
  • pull済みのイメージ一覧の取得 (docker images 相当)
  • 実行中のコンテナ内で新しいコマンドを実行 (docker exec 相当)
  • イメージの削除 (docker rmi 相当)

 

自作しようと思ったきっかけ

 Kubernetes 1.20 からDockerが非推奨になったときに、さほど利用者には影響がないにも関わらず自分はなんとなく慌ててしまい、Dockerを雰囲気で使ってることに気づいたのでDockerがどうやって動いてるのかを理解するためにDocker (のサブセット) を自作してみました。

github.com

Dockerを自作しているプロジェクトはすでにいくつか存在し、有名なものだと100行程度のシェルスクリプトで実装しているBockerやGoで実装されているGockerなどがあります。今回はBockerGockerのコードを参考にしながら自作Dockerの実装を行いました。

 

大まかな実装の説明

コンテナを実行するにあたり使った技術は基本的にはDocker (runc) と同じで、プロセスの分離には namespace や chroot、リソースの制限には cgroup (v1 / v2) を使いました。詳細な実装はぜひRockerのソースコードを読んでいただけるとありがたいです。

ネットワーク構成についてもほとんどDockerのbridgeネットワーク (下図) と同じような構成になっています。ネットワークについては私があまり詳しくないということもあり、既存プロジェクトのコードを読んでもよく分からなかったのですが こちらの記事 はとても分かりやすくまとめられており助かりました。

f:id:daikimiura:20210418163954p:plain

Dockerのbridgeネットワーク (https://docs.docker.com/engine/tutorials/networkingcontainers/)

 

学んだこと

  • コンテナを実行するために使われている技術 (Linuxの機能) についての理解が深まった
  • Rustで何か作るのは初めてだったが、だいぶRustの雰囲気に慣れてきた