DockerコンテナのCentOS7でSSHdをSystemd で動かすには?

Docker

Windowsで Docker Desktop を使っています。

今回はCentOS7 の Systemd を使用する必要があったので調べてみたという話。

概要

なにもせずにCentOS7 をコンテナで動かしている場合、systemctl コマンドを実行すると、以下のようなエラーに遭遇します。

sh-4.2# systemctl start sshd
Failed to get D-Bus connection: Operation not permitted
Docker

これを回避するにはコンテナ起動時にオプションを追加する必要があります。Docker Hub に記載があるのですが、この通りにしてもうまくいきませんでした。環境によって必要な設定が異なるようです。

試した環境

Windows 10 Pro (21H2)
OSビルド: 19044.1741
実装RAM: 64.0GB
Docker Desktop 4.8.2 (79419) WSL 2 backend

上記の環境でCentOS7+Systemdを動かす場合を想定しています。それ以外の環境では、異なる設定が必要となると思われます。

設定方法

下記の記事を参考にさせていただきました。

systemd in docker container without --privileged - Qiita
2016-08-23 追記docker-engineが1.12.1にバージョンアップして少し修正が入った。docker-engine 1.12.1 ReleasenoteSecurityA…

ホスト側で Systemd は動いていないのですが、cap_add をつけるだけではうまくいかず、 VOLUME [ "/sys/fs/cgroup" ] をつけてコンテナをビルドしたらうまくいきました。

結局何が正解なのかわかっていません。とりあえず動いた設定を貼っておきます。

Github にも置いておきました。

GitHub - usurageha/docker-centos7-systemd-sshd: Execute Systemd and SSHd in CentOS7 container
Execute Systemd and SSHd in CentOS7 container. Contribute to usurageha/docker-centos7-systemd-sshd development by creati...

設定内容

Dockerfile。SSHdをSystemd経由で実行しています。

FROM centos:7

# Install SSHd and sudo
ENV PACKAGES="sudo openssh-server"
RUN yum -y update \
	&& yum install -y ${PACKAGES} \
	&& rm -rf /var/cache/yum/* \
	&& yum clean all; systemctl enable sshd.service \
	&& sed -i -e "s/^\#UseDNS yes/UseDNS no/" /etc/ssh/sshd_config

# Create user and Configure passwordless sudo
ARG USER_NAME=user
ARG USER_PASSWD=password
RUN useradd -c "Default User" -d /home/${USER_NAME} -s /bin/bash ${USER_NAME} \
	&& echo "${USER_NAME}:${USER_PASSWD}" | chpasswd \
	&& usermod -aG wheel ${USER_NAME} \
	&& echo "${USER_NAME}        ALL=(ALL)       NOPASSWD: ALL" >> /etc/sudoers

EXPOSE 22

VOLUME [ "/sys/fs/cgroup" ]

CMD ["/usr/sbin/init"]

docker-compose.yml。Dockerfileで VOLUMEを定義している場合は、/sys/fs/cgroup のマウントは必要ないみたい。docker info で Cgroup Version を見るとバージョン1でした。

version: '3.9'

services:

    centos7:
        image: centos7-systemd-sshd:latest
        build:
            context: .
            args:
                USER_NAME: "user"
                USER_PASSWD: "password"
        ports:
            - "2222:22"
        cap_add:
            - SYS_ADMIN
#        volumes:
#            - /sys/fs/cgroup:/sys/fs/cgroup:rw
        # restart: always

実行

普通に実行して、ssh で接続できることを確認しました。

$ docker-compose up
[+] Running 1/0
 ⠿ Container docker-centos7-systemd-sshd-centos7-1  Created         0.0s
Attaching to docker-centos7-systemd-sshd-centos7-1

適当なクライアントからアクセス。

$ ssh user@localhost -p 2222
The authenticity of host '[localhost]:2222 ([127.0.0.1]:2222)' can't be established.
ED25519 key fingerprint is SHA256:7/IkwboYviNsx2fj08osEqHEDXZnNtEJy0gj54u2VVI.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[localhost]:2222' (ED25519) to the list of known hosts.
user@localhost's password:
Last login: Fri Jun 17 10:34:42 2022 from 172.19.0.1
[user@2d73595a5ac4 ~]$ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
わし
わし

VMと同じような感じで使えるけど、、、コンテナ使わずVMでやったほうが良いと思う。

Amazon.co.jp: ゲームウォッチ: ゲーム
ゲーム の優れたセレクションでオンラインショッピング。

コメント