当前位置: 首页 > 知识库问答 >
问题:

Docker(带有SYSTEMCTL的CentOS 7):挂载tmpfs失败

和和裕
2023-03-14

(我是一个Docker初学者。然后我学习了CentOS-7的一些教程)

在我的 CentOS 7.2 中,我尝试按照以下步骤学习 Docker。

# docker version

Client:
 Version:      1.10.3
 API version:  1.22
 Go version:   go1.5.3
 Git commit:   20f81dd
 Built:        Thu Mar 10 15:39:25 2016
 OS/Arch:      linux/amd64

Server:
 Version:      1.10.3
 API version:  1.22
 Go version:   go1.5.3
 Git commit:   20f81dd
 Built:        Thu Mar 10 15:39:25 2016
 OS/Arch:      linux/amd64

# docker pull centos:latest
# docker images
centos     latest    778a53015523    12 days ago    196.7 MB

# mkdir ~/docker/centos7-systemd
# cd ~/docker/centos7-systemd
# vi Dockerfile
FROM centos
MAINTAINER "XXXX XXXX" <xxxx@xxxx.com>
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"]

# docker build --rm -t local/centos7-systemd .
..
Successfully built 1a9f1c4938b3

# docker images
centos                  latest    778a53015523    12 days ago    196.7 MB
local/centos7-systemd   latest    1a9f1c4938b3    8 seconds ago  196.7 MB

所以到目前为止,一切(似乎)都很好。
现在问题来了,当我运行:

# docker run -ti -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 80:80 local/centos7-systemd
Failed to mount tmpfs at /run: Operation not permitted
Failed to mount cgroup at /sys/fs/cgroup/systemd: Operation not permitted
[!!!!!!] Failed to mount API filesystems, freezing.

这到底是什么意思,更重要的是,发生了什么,我该如何解决这个问题?

谢谢大家:)

共有3个答案

利海阳
2023-03-14

我在Docker for Windows(1.12.3)中遇到了同样的问题。。。

$ docker logs bareos
systemd 219 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
Detected virtualization docker.
Detected architecture x86-64.

Welcome to CentOS Linux 7 (Core)!

Set hostname to <bareos>.
Failed to install release agent, ignoring: No such file or directory
Failed to create root cgroup hierarchy: No such file or directory
Failed to allocate manager object: No such file or directory
[!!!!!!] Failed to allocate manager object, freezing.

最新的boot2docker没有systemd。如果主机没有,我们不能在Docker容器中包含systemd。因为重要的文件夹是/sys/fs/cgroup/systemd

最后,我在VitualBox中创建了一个基于阿尔卑斯Linux的默认虚拟机和一个带有通用驱动程序的默认泊坞站机

封弘伟
2023-03-14

尝试以特权模式运行容器:

docker run -ti --privileged=true -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 80:80 local/centos7-systemd

这应该能解决你的问题

岳宣
2023-03-14

在丹尼尔·沃尔什贡献了一系列补丁之后,更现代的方法是这样的…

docker run -ti --tmpfs /tmp --tmpfs /run -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 80:80 local/centos7-systemd

从安全的角度来看,从特权容器开始并不是一个好主意。由于丹尼尔贡献了补丁,使它变得不必要,我们能够在不升级特权的情况下开始。

虽然我们确实应该维护“每个容器单个服务/进程”的原则,但有些人希望运行RedHat支持的容器,这意味着使用systemd。

看见https://developers.redhat.com/blog/2016/09/13/running-systemd-in-a-non-privileged-container/更多信息

为了演示一个精简的systemd容器,像这样的东西会运行一个apache和tomcat;不是单一的服务/流程原则,只是一个例子。你显然需要对这个图像做更多的事情,但这是基本的想法。我想我是从丹尼尔的某个帖子中得到的,但我现在不记得了。

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/*;
RUN yum -y install httpd tomcat tomcat-javadoc.noarch \
    tomcat-docs-webapp.noarch tomcat-admin-webapps.noarch ; \
    yum clean all
RUN systemctl enable tomcat.service
RUN systemctl enable httpd.service

VOLUME [ "/sys/fs/cgroup" ]
EXPOSE 80 8080
CMD ["/usr/sbin/init"]

docker build -t apache ./
docker run --tmpfs /tmp --tmpfs /run -it -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 8081:80 -p 8080:8080 --name apache apache
 类似资料:
  • 问题内容: 我最近创建了一个在Windows上的boot2docker上运行的mongodb docker实例。 不幸的是,在尝试kitematic的过程中,我意外地从mongo容器中删除了该卷,并且无法再访问我的数据。 mongo实例似乎创建了一个新卷,而旧卷现在仍悬空(孤立)并且未安装在任何容器中。 有什么办法可以恢复吗? 问题答案: 感谢您的答复,它使我处于正确的轨道,我设法使用以下命令启动

  • 问题内容: 我正在运行一个Jenkins集群,其中在Master和Slave中,它们都作为Docker容器运行。 主机是在MacOS上运行的最新的boot2docker VM。 为了使Jenkins能够使用Docker执行部署,我将docker.sock和docker客户端从主机安装到Jenkins容器,如下所示: 在将卷装载到Jenkins容器中运行的Docker容器时,我遇到了问题。例如,如果

  • Dockerfile文件 docker撰写。yml公司 命令 错误: 步骤6:运行systemctl start httpd。服务--- Obs:在windows 7上运行:( 有小费吗?

  • 我尝试使用systemctl命令构建CentOS映像。但是每次我构建它时。我得到这个错误: 我的Dockerfile: centos\u systemctl:最新版本:https://github.com/docker-library/docs/tree/master/centos#systemd-集成 有人知道我做错了什么吗? 谢谢

  • 本文向大家介绍Docker数据存储之tmpfs mounts详解,包括了Docker数据存储之tmpfs mounts详解的使用技巧和注意事项,需要的朋友参考一下 阅读本文前,希望你已经对Volumes和Bind mounts有了初步的了解,具体可以参考以下文章: Docker数据持久化之Volumes Docker数据持久化之Bind mounts tmpfs mounts Volumes和Bi