it-swarm.com.de

Docker (CentOS 7 mit SYSTEMCTL): Das Mounten von tmpfs & cgroup ist fehlgeschlagen

(Ich bin ein Docker-Anfänger. Dann habe ich einige Tutorials für CentOS-7 befolgt)

In meinem CentOS 7.2 habe ich versucht, Docker anhand der folgenden Schritte zu lernen.

# 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

Also bis zu diesem Punkt scheint alles in Ordnung zu sein.
Nun kommt das Problem, wenn ich renne:

# 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.

Was bedeutet das überhaupt und was noch wichtiger ist, was passiert und wie kann ich das bitte lösen ?

Danke euch allen :)

7
夏期劇場

versuchen Sie, Ihren Container im privilegierten Modus auszuführen:

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

dies sollte Ihr Problem lösen

14
arcticless

ich folgte

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

und kommen mit

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.

sie fragen sich, ob es unter MacOS nicht funktioniert?

4
Keith Yau

Ich habe das gleiche Problem mit Docker für 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.

Der neueste boot2docker hat keine systemd. Wir können systemd nicht in einem Docker-Container haben, wenn der Host es nicht hat. Da der wichtige Ordner dafür /sys/fs/cgroup/systemd ist.

Schließlich erstelle ich in VitualBox eine default vm basierend auf Alpine Linux und einen defaultdocker-machine mit dem generic-Treiber.

2

Wenn Sie den Container im Vordergrund nicht ausführen müssen, können Sie ihn im getrennten Modus starten, um diesen Fehler zu vermeiden. Zum Beispiel:

docker run -d --name=my_container_name image_id

Dann können Sie so etwas benutzen, um eine Shell in den Container zu bekommen:

docker exec -ti my_container_name /bin/bash

Wenn Sie im Dockerfile-CMD keinen Befehl im Vordergrund haben und der Container sofort beendet wird, können Sie einen Befehl hinzufügen, der ihn weiterhin ausführt, z.

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

Weitere Informationen zum letzten Beispiel finden Sie in SO answer .

1
Nagev

Der modernere Ansatz, nachdem Daniel Walsh eine Reihe von Patches beigesteuert hat, ist ...

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

Weitere Informationen finden Sie unter https://developers.redhat.com/blog/2016/09/13/running-systemd-in-a-non-privileged-container/

1

Wie ich bereits sagte hier , müssen Sie den --privileged=true -Parameter (der meiner Meinung nach gefährlich sein kann) nicht verwenden. Sie haben nur vergessen, -v /run zu Ihrem docker run-Befehl hinzuzufügen.

Ihr letzter Run-Befehl, der funktionieren sollte, wäre also:

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

Für MacOS X ist es nicht erforderlich, das cgroups-Volume im Container bereitzustellen

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

Nachdem ich viele Container-Instanzen ausgeführt hatte, steckte mein Mac in

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

Referenz Derzeit Bash-Modus funktioniert gut für mich

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

0
patilnitin

Während Sie systemd in einem Container ausführen können , halte ich es nicht für eine gute Idee. Hier ist der Grund:

  1. Docker basiert auf der Idee eines einzelnen Service/Prozesses pro Container. Obwohl es definitiv die Ausführung mehrerer Prozesse in einem Container unterstützt und Sie in keiner Weise davon abhält, werden Sie auf Bereiche stoßen, in denen mehrere Dienste in einem Container nicht genau den Erwartungen von Docker oder externen Tools entsprechen. Dinge wie die Umstellung auf die Skalierung von Diensten oder die Verwendung von Docker-Schwarm über Hosts hinweg unterstützen nur das Konzept eines Dienstes pro Container.

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

  2. Speziell für diese Frage relevanter:

    Ich bin ein Docker-Anfänger.

    Es kann zwar Situationen geben, in denen das Ausführen von systemd in einem Container gewünscht wird, es sind jedoch einige Problemumgehungen erforderlich (wie Sie aus den anderen Antworten ersehen können), und ich glaube nicht, dass dies ein guter Ausgangspunkt für jemanden ist, der Container lernt.

  3. Dieser Blog-Beitrag wurde als Beispiel für die Funktionsweise verlinkt. Sie können jedoch feststellen, dass der Container weiterhin als Root-Benutzer ausgeführt werden muss:

    EXPOSE 80
    CMD [ "/sbin/init" ]
    

    Dies ist zwar für diese Container nicht eindeutig, aber immer noch weniger sicher:

  4. Als weiterer Beweis dafür, dass dies keine gute Idee ist, tun dies nicht einmal die CentOS Docker-Dateien von Red Hat. Zum Beispiel ( Quelle ):

    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"]
    

Natürlich, wenn Sie all dies wissen und systemd trotzdem in einem Container ausführen möchten, wie andere bereits erwähnt haben, ist dies möglich. Ich glaube nicht, dass es Sinn macht, das zu wiederholen, was sie bereits gesagt haben.

0
bmaupin