无法在 Centos Docker 镜像上启动 ssh 服务

无法在 Centos Docker 镜像上启动 ssh 服务

centos 7从 docker hub 下载了 docker 镜像。当我尝试在服务器上启用 sshd 时,它不允许我启用 ssh 服务。

以下是复制我的问题的步骤:

docker pull centos
docker run -i -d --name testSSH centos /bin/bash
docker exec -it testSSH /bin/bash

进入 centos 盒子后,我执行了以下命令:

yum install openssh-server
ssh-keygen 
ssh-keygen -t rsa
yum install -y initscripts
service start sshd
service sshd start

我现在收到此错误消息:

[root@f9e4d1efcfd9 /]# service sshd start
Redirecting to /bin/systemctl start sshd.service
Failed to get D-Bus connection: Operation not permitted

我使用过物理centos机器,同样的命令运行得很好。

答案1

当前 CentOS 的官方 Docker 镜像确实包含systemd,但默认情况下它是不活动的。这记录在CentOS 镜像的 Docker Hub 页面

Systemd 现在包含在 centos:7 和 centos:latest 基础容器中,但默认情况下它不处于活动状态。为了使用 systemd,您需要包含类似于下面示例 Dockerfile 的文本:

提供的示例Dockerfile如下:

FROM centos:7
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]

通过删除这些文件,systemd可以防止在容器启动期间启动多个服务。这种方法产生了一个简单但功能systemd齐全的容器。

从该映像运行容器还需要一个特定的选项来挂载cgroup卷:

$ docker run -it -v /sys/fs/cgroup:/sys/fs/cgroup:ro systemd-app

选项-vbind/sys/fs/cgroup以只读方式将目录从主机挂载到容器。

还需要注意的是,在 Ubuntu 主机上,容器可能需要额外的选项才能正常工作:

$ docker run -it -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /tmp/$(mktemp -d):/run systemd-app

注意:大部分材料,包括 Dockerfile 本身,似乎取自 Daniel Walsh 的这篇博客文章:在 Docker 容器中运行 systemd

相关内容