GitLab: DinDとDooD

GitLabのDinDとDooDのイメージについてのメモ(想像で書いており、特に検証はしていません。実際にはRunnerが立ち上げるコンテナは他にもあるようですが、省略しています)

DinD (Docker executor with Docker-in-Docker)

DinDではprivileged trueの設定を行い、Job用のコンテナでdocker serviceが実行できるようにする。build jobのコンテナはdocker serviceを実行しているdockerコンテナにtcpで接続を行う。build jobを実行するコンテナはdocker serviceを実行する必要はないが、docker cliは必要になる。

私の場合は、基本的にはこの構成でJobが実行されるように環境を構築している。

build jobのコンテナ自身がdocker serviceを起動する場合、service用のコンテナは必要ない。次のような形式も可能なはずである。

DooD (Docker executor with Docker socket binding)

DooDはHostのdocker serviceをbuild jobから使用する。このため、ホストの/var/run/docker.sockをbuild jobにもマウントする構成を取る。DooDはそのまま放っておくとHostにbuild時に立ち上げたdocker imageが堆積していくと思われるので、片付け(prune)を別途考えておく必要がある。

DooDでもservice用のcontainerを使用する形式をとることが出来る。この構成をとることにメリットはあまりないが、DinDとDooDの違いを意識せずにgitlab-ci.ymlを書いても問題ないはずである。

試していないが、hostのdocker.sockをtcpで接続することも可能なはずである。NW上のHostのIPアドレスを解決する必要があるのとホスト側でnftablesやiptables, firewalldなどによって通信がドロップされないことが必要になる。