Fedoraのmoby-engineパッケージをインストールすると、Dockerを利用できます。多分このことを知らずに、Fedora向けのDocker Engine(旧称 Docker CE)をインストールしている人のほうが多いと思います。
ちなみにDocker Engine(旧称 Docker CE)の場合は /etc/docker/daemon.json
に{ "selinux-enabled": true }
とか書いてサービス再起動するまで、コンテナーに対してSELinuxによる制御はされません。つまりホストでSELinuxが有効化されていても、コンテナに対してはSELinuxは働かないということです。
一方、moby-engineパッケージでインストールしたDockerでは、デフォルトでSELinuxサポートが有効になっていることがdocker info
コマンドの実行結果から確認できます。
# docker info ... Security Options: seccomp Profile: default selinux #seccompとselinuxサポートが有効化されている cgroupns ...
そこで、試しに /etc/docker/daemon.json
に{ "selinux-enabled": false }
とあえて書いてみました。すると、Dockerサービスが正常に動いてくれません。
# systemctl restart docker Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xeu docker.service" for details.
ステータスやjournalctlで内容を確認せよと言われていますが、サービスを起動できなかったことくらいしかログには出ておらず、正直有力な情報は書かれていません。
うまくいかない理由を調べるためにmoby-engineパッケージのサービスファイルと環境変数を指定しているファイルを見たら、原因がわかりました。
- https://src.fedoraproject.org/rpms/moby-engine/blob/rawhide/f/docker.service
- https://src.fedoraproject.org/rpms/moby-engine/blob/rawhide/f/docker.sysconfig
必要なところだけ抜き出すと、サービスを起動するときに環境変数として/etc/sysconfig/docker
が呼ばれるようです。ここにdockerdのオプション --selinux-enabled
が書かれていました。ここに書かれているのに/etc/docker/daemon.json
で設定をしようとしたのでサービスの実行に失敗したようです。
# cat /usr/lib/systemd/system/docker.service ... [Service] Type=notify EnvironmentFile=-/etc/sysconfig/docker # the default is not to use systemd for cgroups because the delegate issues still # exists and systemd currently does not support the cgroup feature set required # for containers run by docker ExecStart=/usr/bin/dockerd \ --host=fd:// \ --exec-opt native.cgroupdriver=systemd \ $OPTIONS ExecReload=/bin/kill -s HUP $MAINPID ... # cat /etc/sysconfig/docker ... # Modify these options if you want to change the way the docker daemon runs OPTIONS="--selinux-enabled \ --log-driver=journald \ --live-restore \ --default-ulimit nofile=1024:1024 \ --init-path /usr/libexec/docker/docker-init \ --userland-proxy-path
もし、/etc/docker/daemon.json
側でDockerコンテナー側のSELinuxサポートを制御したい場合は、
/etc/sysconfig/docker
のOPTIONSから--selinux-enabled
を取り除いた上で、つぎのように記述すれば良いようです。
# vi /etc/docker/daemon.json { "selinux-enabled": true }
ただ、DockerについてはSELinuxサポートが有効化されていても困ることはあまりないので、問題が起きない限りデフォルト設定のまま使ったほうが良いと思います。また、/etc/sysconfig/docker
の設定変更はなにかの拍子に元の設定に戻る可能性があるので、どうしてもこの設定を変更したい場合はDocker Engineの方をインストールすると良いかなと思います。
ちなみにPodmanも割と良いので、DockerからPodmanへの乗り換えもありといえば有りなのかもしれません。
# dnf install podman # podman container run -it docker.io/redhat/ubi9 bash