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

Docker
Docker Linux Ubuntu Windows 覚書

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

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

概要

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

sh-4.2# systemctl start sshd
Failed to get D-Bus connection: Operation not permitted
https://hub.docker.com/_/centos/
リンク先を開く
hub.docker.com

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

試した環境

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

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

設定方法

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

https://qiita.com/shusugmt/items/92ece6874ba5aeff2b41
リンク先を開く
qiita.com

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

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

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

https://github.com/usurageha/docker-centos7-systemd-sshd
リンク先を開く
github.com

設定内容

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でやったほうが良いと思う。

スポンサーリンク
☆Geha☆をフォローする