18

(我是 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.

这甚至意味着什么,更重要的是,正在发生什么,我该如何解决这个问题

谢谢你们 :)

4

6 回答 6

33

在 Daniel Walsh 贡献了一系列补丁之后,更现代的方法是这样的……

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

出于安全原因,基本上从特权容器开始是一个坏主意。由于 Daniel 提供了补丁以使其变得不必要,因此我们无需升级权限即可开始。

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

有关更多信息,请参阅https://developers.redhat.com/blog/2016/09/13/running-systemd-in-a-non-privileged-container/

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

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
于 2019-02-06T03:32:33.690 回答
27

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

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

这应该可以解决您的问题

于 2016-04-14T08:37:05.107 回答
2

我在 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。如果主机没有,我们不能systemd在 Docker 容器中拥有它。因为重要的文件夹是/sys/fs/cgroup/systemd.

所以最后,我default在基于 Alpine Linux 和驱动程序的 VitualBox 中default docker-machine创建generic了一个 vm。

于 2016-11-09T20:39:49.677 回答
2

正如我在这里所说,您不是被迫使用该--privileged=true参数(恕我直言,这可能很危险),您只是忘记添加-v /run到您的docker run命令中。

所以你应该工作的最终运行命令是:

docker run -ti -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /run -p 80:80 local/centos7-systemd
于 2018-09-19T08:22:40.743 回答
2

如果你不需要在前台运行容器,你可以以分离模式启动它来避免这个错误。例如:

docker run -d --name=my_container_name image_id

然后你可以使用这样的东西将一个 shell 放入容器中:

docker exec -ti my_container_name /bin/bash

如果您在 Dockerfile CMD 中的前台没有命令,导致容器立即退出,您可以添加一个使其保持运行的命令,例如:

docker run -d --name=my_container_name image_id tail -f /dev/null

有关最后一个示例的更多详细信息,请参见SO 答案

于 2019-04-29T16:09:50.517 回答
1

MacOS X 不需要在容器中挂载 cgroups 卷

$docker run -it -p 80:80 ${ImageID}

运行许多容器实例后,我的 mac 卡住了

[!!!!!!] Failed to mount API filesystems, freezing.

参考 目前 bash 模式对我来说工作正常

$docker run -it -p 80:80 ${ImageID} /bin/bash

于 2017-04-25T02:36:49.953 回答