Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker(带SYSTEMCTL的CentOS 7):未能安装tmpfs&;cgroup_Docker_Mount_Centos7_Systemd_Systemctl - Fatal编程技术网

Docker(带SYSTEMCTL的CentOS 7):未能安装tmpfs&;cgroup

Docker(带SYSTEMCTL的CentOS 7):未能安装tmpfs&;cgroup,docker,mount,centos7,systemd,systemctl,Docker,Mount,Centos7,Systemd,Systemctl,(我是一名码头工人初学者。然后我学习了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 S

(我是一名码头工人初学者。然后我学习了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 --privileged=true -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 80:80 local/centos7-systemd

这应该可以解决您的问题

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

$docker记录bareos
systemd 219在系统模式下运行。(+PAM+AUDIT+SELINUX+IMA-APPARMOR+SMACK+SYSVINIT+UTMP+LIBCRYPTSETUP+GCRYPT+GNUTLS+ACL+XZ-LZ4-SECCOMP+BLKID+ELFUTILS+KMOD+IDN)
检测到虚拟化docker。
检测到架构x86-64。
欢迎使用CentOS Linux 7(Core)!
将主机名设置为。
未能安装发布代理,忽略:没有此类文件或目录
无法创建根cgroup层次结构:没有此类文件或目录
分配管理器对象失败:没有此类文件或目录
[!!!!!]分配管理器对象失败,正在冻结。
最新的
boot2docker
没有
systemd
。如果主机没有,我们不能将
systemd
放在Docker容器中。因为它的重要文件夹是
/sys/fs/cgroup/systemd


最后,我在基于Alpine Linux的VitualBox中创建了一个
default
vm,并使用
generic
驱动程序创建了一个
default
docker机器

$docker run -it -p 80:80 ${ImageID}
在运行了许多容器实例之后,我的mac陷入了困境

[!!!!!!!]装载API文件系统失败,正在冻结。

目前bash模式对我来说很好

$docker run-it-p80:80${ImageID}/bin/bash
正如我所说,您没有被迫使用
--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

在丹尼尔·沃尔什(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

有关更多信息,请参阅

为了演示精简的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
虽然可以在容器中运行systemd,但我认为这不是一个好主意。原因如下:

  • Docker的设计理念是每个容器都有一个服务/进程。尽管它肯定支持在一个容器中运行多个进程,并且不会阻止您这样做,但您最终会遇到这样的情况:容器中的多个服务与Docker或外部工具所期望的并不完全一致。移动到服务的扩展,或者跨主机使用Docker swarm等都只支持每个容器一个服务的概念

    ()

  • 与这个问题更相关的是:

    我是个码头工人初学者

    虽然在某些情况下需要在容器中运行systemd,但它需要一些变通方法(从其他答案中可以看出),我不认为这是学习容器的良好起点

  • 此链接作为如何使其工作的示例,但您可以看到该容器仍需要作为根用户运行:

    EXPOSE 80
    CMD [ "/sbin/init" ]
    
    虽然这肯定不是这些容器所独有的,但仍然不太安全:

  • 作为这不是一个好主意的进一步证据,即使是红帽公司自己的CentOS Dockerfiles也不会这样做。例如():

  • 当然,如果您知道所有这些,并且仍然希望在容器中运行systemd,正如其他人已经提到的,这是可能的。我认为重复他们已经说过的话没有任何价值。

    如果您不需要在前台打开容器,可以在分离模式下启动它以避免此错误。例如:

    docker run -d --name=my_container_name image_id
    
    然后,您可以使用类似这样的方法将壳放入容器中:

    docker exec -ti my_container_name /bin/bash
    
    如果在Dockerfile CMD的前台没有命令,导致容器立即退出,则可以添加一个使其保持运行的命令,例如:

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

    有关上一个示例的更多详细信息,请参阅。

    这实际上是可行的!非常感谢你!!(你知道我什么时候跑步吗,为什么它不在后台跑,而是在我的终端上。)对不起,我不知道怎么解释。再次感谢:如果您想使用Background模式,可以尝试-d选项。请给出原因?在较高级别上,出现问题的原因是命令行参数“-v/sys/fs/cgroup:/sys/fs/cgroup:ro”指示docker将/sys/fs/cgroup从主机装载到docker容器中的同一目录中/sys/fs/cgroup是由root拥有的内核控制的dir结构。什么是/sys/fs/cgroup?Linux内核资源控制查看为什么将其从主机装载到docker容器中?请参阅本问题中描述的创建启用systemd的容器的相同步骤。太棒了!谢谢!!!这需要很多人的支持。如果可能,您希望避免在特权模式下运行。如果您所在的主机系统不是BSD(即最初没有systemd cgroup basedir),您应该
    docker run -d --name=my_container_name image_id
    
    docker exec -ti my_container_name /bin/bash
    
    docker run -d --name=my_container_name image_id tail -f /dev/null