webdevqa.jp.net

Docker(CENTOS 7 with SYSTEMCTL):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" <[email protected]>
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.

これはどういう意味ですか、そしてさらに重要なことです何が起こっているのか、どうすればこれを解決できますか

皆さん、ありがとうございました :)

10
夏期劇場

コンテナーを特権モードで実行してみます。

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

これはあなたの問題を解決するはずです

19
arcticless

これに対するより近代的なアプローチは、ダニエルウォルシュが一連のパッチを提供した後、これは...

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を実行します。単一のサービス/プロセスの原則ではなく、単なる例です。あなたは明らかにこの画像にもっと多くのことをする必要があるでしょうが、これは基本的な考えです。ダニエルの投稿のどこかからこれを得たと思いますが、今は思い出しません。

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
5

私はついていきます

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

そして思いつく

Failed to insert module 'autofs4'
Failed to mount cgroup at /sys/fs/cgroup/systemd: No such file or directory
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 <c7b8edb49c60>.
Initializing machine ID from random generator.
Cannot determine cgroup we are running in: No such file or directory
Failed to allocate manager object: No such file or directory
[!!!!!!] Failed to allocate manager object, freezing.

それがMacOSで動作していないのだろうか?

4
Keith Yau

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です。

最後に、Alpine Linuxに基づいてVitualBoxにdefault vmを作成し、defaultドライバーを使用してgenericdocker-machineを作成します。

2

run コンテナをフォアグラウンドで実行する必要がない場合は、デタッチモードで起動してこのエラーを回避できます。例えば:

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

最後の例の詳細については SO answer を参照してください。

1
Nagev

私が言ったように ここ 、あなたは--privileged=trueパラメータを使用することを強制されません(これは危険なIMHOです)、-v /rundocker runに追加するのを忘れましたコマンド。

したがって、動作するはずの最終的な実行コマンドは次のようになります。

docker run -ti -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /run -p 80:80 local/centos7-systemd
1
Anthony O.

MacOS Xはcgroupボリュームをコンテナーにマウントする必要はありません

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

多くのコンテナインスタンスを実行した後、私のMacが

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

参照 現在、bashモードは正常に動作しています

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

0
patilnitin

コンテナー内でsystemdを実行するできる間、それは良い考えではないと思います。理由は次のとおりです。

  1. Dockerは、コンテナーごとに1つのサービス/プロセスという考えに基づいて設計されています。コンテナでの複数のプロセスの実行を確実にサポートし、それを実行することを決して妨げるものではありませんが、最終的にはコンテナ内の複数のサービスがDockerまたは外部ツールが期待するものに完全にマッピングされない領域に出くわします。サービスのスケーリングへの移行や、ホスト間でのDocker swarmの使用などは、コンテナーごとに1つのサービスの概念のみをサポートします。

    https://stackoverflow.com/a/46801406/399105

  2. この質問に特に関連性が高い:

    私はDockerの初心者です。

    コンテナー内でsystemdを実行することが望ましい場合もありますが、(他の回答からわかるように)いくつかの回避策が必要であり、コンテナーを学習する人にとってそれが良い出発点であるとは思いません。

  3. この ブログ投稿 は、それを機能させる方法の例としてリンクされていましたが、コンテナーは引き続きrootユーザーとして実行する必要があることがわかります。

    EXPOSE 80
    CMD [ "/sbin/init" ]
    

    これは確かにこれらのコンテナに固有のものではありませんが、それでも安全性は低くなります。

  4. これが良い考えではないことのさらなる証拠として、Red Hat独自のCentOS Dockerfilesでもこれを行いません。例( source ):

    FROM centos:centos7
    
    # RHSCL httpd24 image.
    #
    # Volumes:
    #  * /opt/rh/httpd24/root/var/www - Datastore for httpd
    #  * /var/log/httpd24 - Storage for logs when $HTTPD_LOG_TO_VOLUME is set
    # Environment:
    #  * $HTTPD_LOG_TO_VOLUME (optional) - When set, httpd will log into /var/log/httpd24
    
    EXPOSE 80
    EXPOSE 443
    
    COPY run-*.sh /usr/local/bin/
    RUN mkdir -p /var/lib/httpd24
    COPY contrib /var/lib/httpd24/
    
    RUN rpmkeys --import file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 && \
        yum -y --setopt=tsflags=nodocs install https://www.softwarecollections.org/en/scls/rhscl/httpd24/epel-7-x86_64/download/rhscl-httpd24-epel-7-x86_64.noarch.rpm && \
        yum install -y --setopt=tsflags=nodocs gettext hostname bind-utils httpd24 httpd24-mod_ssl && \
        yum clean all
    
    # When bash is started non-interactively, to run a Shell script, for example it
    # looks for this variable and source the content of this file. This will enable
    # the SCL for all scripts without need to do 'scl enable'.
    ENV BASH_ENV=/var/lib/httpd24/scl_enable \
        ENV=/var/lib/httpd24/scl_enable \
        Prompt_COMMAND=". /var/lib/httpd24/scl_enable"
    
    
    VOLUME ["/opt/rh/httpd24/root/var/www"]
    VOLUME ["/var/log/httpd24"]
    
    ENTRYPOINT ["/usr/local/bin/run-httpd24.sh"]
    CMD ["httpd", "-DFOREGROUND"]
    

もちろん、これらすべてに気づいていて、コンテナーでsystemdを実行したい場合は、他の人がすでに言及しているように可能です。彼らがすでに言ったことを繰り返すことには何の価値もないと思います。

0
bmaupin