Docker(带有 SYSTEMCTL 的 CentOS 7):挂载 tmpfs 和 cgroup 失败
Docker (CentOS 7 with SYSTEMCTL) : Failed to mount tmpfs & cgroup
(我是 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.
这是什么意思,更重要的是,这是怎么回事,我该如何解决这个问题?
谢谢大家:)
尝试 运行 您的容器处于特权模式:
docker run -ti --privileged=true -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 80:80 local/centos7-systemd
这应该可以解决您的问题
对于 Windows (1.12.3)...Docker 我遇到了同样的问题...
$ 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
.
最后,我在基于 Alpine Linux 的 VitualBox 中创建了一个 default
虚拟机,并使用 generic
驱动程序创建了一个 default
docker-machine
。
MacOS X 不需要在容器中挂载 cgroups 卷
$docker run -it -p 80:80 ${ImageID}
在 运行 个容器实例之后,我的 mac 陷入了
[!!!!!!] Failed to mount API filesystems, freezing.
reference
目前 bash 模式对我来说工作正常
$docker run -it -p 80:80 ${ImageID} /bin/bash
正如我所说 here,你不是被迫使用 --privileged=true
参数(恕我直言,这可能很危险),你只是忘了将 -v /run
添加到你的 [=13] =]命令。
所以你最终的 运行 命令应该是:
docker run -ti -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /run -p 80:80 local/centos7-systemd
在 Daniel Walsh 贡献了一系列补丁之后,更现代的方法是……
docker run -ti --tmpfs /tmp --tmpfs /run -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 80:80 local/centos7-systemd
出于安全原因,从本质上讲,从特权容器开始并不是一个好主意。由于 Daniel 贡献了补丁以使其变得不必要,我们无需升级权限即可开始。
虽然一般来说我们应该保持 "single service/process per container" 原则,但有些人希望 运行 RedHat 支持容器,这意味着使用 systemd。
有关详细信息,请参阅 https://developers.redhat.com/blog/2016/09/13/running-systemd-in-a-non-privileged-container/
为了演示一个精简的 systemd 容器,像这样的东西会有一个 apache 和 tomcat 运行ning;不是单一的 service/process 原则,而只是一个例子。你显然需要对这张图片做更多的事情,但这是基本的想法。我想我是从某处 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
如果你不需要run前台的容器,你可以在分离模式下启动它来避免这个错误。例如:
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
有关最后一个示例的更多详细信息,请参阅 。
(我是 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.
这是什么意思,更重要的是,这是怎么回事,我该如何解决这个问题?
谢谢大家:)
尝试 运行 您的容器处于特权模式:
docker run -ti --privileged=true -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 80:80 local/centos7-systemd
这应该可以解决您的问题
对于 Windows (1.12.3)...Docker 我遇到了同样的问题...
$ 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
.
最后,我在基于 Alpine Linux 的 VitualBox 中创建了一个 default
虚拟机,并使用 generic
驱动程序创建了一个 default
docker-machine
。
MacOS X 不需要在容器中挂载 cgroups 卷
$docker run -it -p 80:80 ${ImageID}
在 运行 个容器实例之后,我的 mac 陷入了
[!!!!!!] Failed to mount API filesystems, freezing.
reference 目前 bash 模式对我来说工作正常
$docker run -it -p 80:80 ${ImageID} /bin/bash
正如我所说 here,你不是被迫使用 --privileged=true
参数(恕我直言,这可能很危险),你只是忘了将 -v /run
添加到你的 [=13] =]命令。
所以你最终的 运行 命令应该是:
docker run -ti -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /run -p 80:80 local/centos7-systemd
在 Daniel Walsh 贡献了一系列补丁之后,更现代的方法是……
docker run -ti --tmpfs /tmp --tmpfs /run -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 80:80 local/centos7-systemd
出于安全原因,从本质上讲,从特权容器开始并不是一个好主意。由于 Daniel 贡献了补丁以使其变得不必要,我们无需升级权限即可开始。
虽然一般来说我们应该保持 "single service/process per container" 原则,但有些人希望 运行 RedHat 支持容器,这意味着使用 systemd。
有关详细信息,请参阅 https://developers.redhat.com/blog/2016/09/13/running-systemd-in-a-non-privileged-container/
为了演示一个精简的 systemd 容器,像这样的东西会有一个 apache 和 tomcat 运行ning;不是单一的 service/process 原则,而只是一个例子。你显然需要对这张图片做更多的事情,但这是基本的想法。我想我是从某处 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
如果你不需要run前台的容器,你可以在分离模式下启动它来避免这个错误。例如:
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
有关最后一个示例的更多详细信息,请参阅