Systemctl kann unter Ubuntu nicht in einem Docker-Container verwendet werden

Einführung

Beim Erstellen eines Systems oder einer Anwendung dachte ich, wenn es auf dem Docker-Container erstellt werden könnte, würde dies zu einer effizienten Entwicklung und Wartung führen. Deshalb habe ich verschiedene Dinge ausprobiert, um die Grundlagen zusammenzufassen.

Voraussetzungen

[Host-Betriebssystem] ・ Ubuntu20.04 LTS (auf GCP)

[Soft Image Version] ・ Docker 19.03.13 ・ OS Ubuntu20.04 LTS des Container-Images

Was willst du tun

    1. Docker-Installation und -Konfiguration
  1. Erstellen Sie einen Container im Docker
    1. Betreten Sie den Container und starten Sie Apache
  2. Ändern Sie die Bilddatei und erstellen Sie ein neues Image

1. 1. Docker-Installation und -Konfiguration

Gehen Sie bei der Installation aus dem Docker-Repository wie folgt vor.

Stellen Sie sicher, dass Docker nicht installiert ist

$ sudo dpkg -l docker

Update des Paketverwaltungstools

$ sudo apt update

⇒ Wenn dpkg-query: Keine Pakete gefunden, die zum Docker passen angezeigt wird, wird es nicht installiert.

Für die Docker-Installation ist eine Softwareinstallation erforderlich

$ sudo apt install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

Der offizielle öffentliche GPG-Schlüssel von Docker wurde hinzugefügt

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Überprüfen Sie, ob der öffentliche Schlüssel ordnungsgemäß hinzugefügt wurde

$ sudo apt-key fingerprint

Qiita-no010_img04.jpg

Repository hinzufügen

Stellen Sie sicher, dass sich kein Docker im Repository befindet.

$ cat /etc/apt/sources.list | grep docker

Repository-Einstellungen

python


$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

Bestätigen Sie, dass das Repository hinzugefügt wurde

python


$ cat /etc/apt/sources.list | grep docker
deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable
# deb-src [arch=amd64] https://download.docker.com/linux/ubuntu focal stable

Überprüfen Sie die verfügbaren Versionen

python


$ apt-cache madison docker-ce
 docker-ce | 5:19.03.13~3-0~ubuntu-focal | https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
 docker-ce | 5:19.03.12~3-0~ubuntu-focal | https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
 docker-ce | 5:19.03.11~3-0~ubuntu-focal | https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
 docker-ce | 5:19.03.10~3-0~ubuntu-focal | https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
 docker-ce | 5:19.03.9~3-0~ubuntu-focal | https://download.docker.com/linux/ubuntu focal/stable amd64 Packages

Docker installieren

Da das Repository hinzugefügt wurde, aktualisieren Sie es erneut und führen Sie dann "install" aus

python


$ sudo apt update
$ sudo apt install docker-ce

Überprüfen Sie die installierte Docker-Version

python


$ sudo docker version
Client: Docker Engine - Community
 Version:           19.03.13
 API version:       1.40
 Go version:        go1.13.15
 Git commit:        4484c46d9d
 Built:             Wed Sep 16 17:02:52 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Überprüfen Sie, ob der Dämon gestartet ist

python


$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2020-09-30 00:22:29 UTC; 30min ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 25020 (dockerd)
      Tasks: 9
     Memory: 36.8M
     CGroup: /system.slice/docker.service

Überprüfen der Funktion des Dockers

Hallo Welt Holen Sie sich ein Beispiel-Docker-Image und führen Sie es aus.

python


$ sudo docker container run hello-world

Überprüfen Sie die Liste der aktuellen Bilder und Container

python


#Liste der Bilder
$ sudo docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        9 months ago        13.3kB

#Liste der Container (einschließlich gestoppt)
$ sudo docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS   
            NAMES
e8a73ecd0c16        hello-world         "/hello"            5 minutes ago       Exited (0) 5 minutes ago           
            condescending_diffie

#Anzeige des laufenden Containers
$ sudo docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS          
     NAMES

Da ich den Vorgang bestätigen konnte, habe ich den Container und das Bild einmal gelöscht.

python


$ sudo docker container rm [Container ID]
$ sudo docker image rm [Bild-ID]

Docker-Einstellungen

Einstellungen für den automatischen Start

$ sudo systemctl unmask docker.service
$ sudo systemctl enable docker
$ sudo systemctl is-enabled docker

Zur Docker-Gruppe hinzugefügt, um den Docker-Befehl ohne sudo auszuführen.

python


#Als allererstes[docker]Gruppenbestätigung. * Wenn Sie keine Gruppe haben, müssen Sie selbst eine erstellen.
$ cat /etc/group | grep docker
docker:x:998:

# [docker]Fügen Sie der Gruppe Benutzer hinzu.
$ sudo usermod -aG docker [Nutzername]

Wenn Sie nach dem Neustart von Ubuntu den Befehl wie unten gezeigt ohne sudo ausführen können, können Sie die Einstellungen ändern.

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

2. Erstellen Sie einen Container im Docker

Da der Container mit dem Docker-Image erstellt wird, rufen Sie zuerst das Docker-Image ab. Viele Bilder wurden bereits auf der Docker-Site veröffentlicht. Verwenden Sie daher den Suchbefehl, um das gewünschte Bild zu finden und das Bild abzurufen.

Bestätigung des zu erfassenden Bildes

python


$Docker-Suche [beliebiges Schlüsselwort]

Holen Sie sich ein Bild

python


# docker image pull [OPTIONS] NAME[:TAG|@DIGEST]
$ docker image pull  ubuntu:20.04

20.04: Pulling from library/ubuntu
d72e567cc804: Pull complete 
0f3630e5ff08: Pull complete 
b6a83d81d1f4: Pull complete 
Digest: sha256:bc2f7250f69267c9c6b66d7b6a81a54d3878bb85f1ebb5f951c896d13e6ba537
Status: Downloaded newer image for ubuntu:20.04
docker.io/library/ubuntu:20.04

Container aus Bild erstellen

shell::


$ docker container run -it -d --name test-ubuntu20-4 ubuntu:20.04

#Wenn Sie eine Portnummer zuordnen möchten
# docker container run -it -d -p 8080(Ubuntu Side Port):5000(Port auf der Containerseite) --name webgis-server ubuntu:20.04

** Überprüfen Sie den laufenden Container **

python


$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS          
     NAMES
19b7ac7c40ad        ubuntu:20.04        "/bin/bash"         8 seconds ago       Up 7 seconds                       
     test-ubuntu20-4

3. 3. Betreten Sie den Container und starten Sie Apache

Geben Sie den zuvor erstellten Container (test-ubuntu20-4) ein

$ docker attach test-ubuntu20-4

Aktualisierungen des Paketverwaltungstools.

# apt update

Apache installieren

# apt install -y apache2

Überprüfen Sie den Startstatus von Apache.

# systemctl status apache2
bash: systemctl: command not found

Da die obige Meldung angezeigt wird und nicht bedient werden kann, installieren Sie das Paket, damit systemctl verwendet werden kann. (Ein einfacher Start usw. kann mit dem Befehl service apache2 ~~~~ erfolgen.)

# apt install -y systemd

Überprüfen Sie den Startstatus von Apache erneut.

# systemctl status apache2
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

Es scheint ein Problem mit PID1 zu geben, also lasst es uns überprüfen.

# ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.5  0.1   4240  3384 pts/0    Ss   16:40   0:00 /bin/bash
root           8  0.0  0.1   5888  2912 pts/0    R+   16:40   0:00 ps aux 

Wenn Sie einen Container mit dem Befehl docker container run -it -d --name ubuntu: 20.04 erstellen, wird der BEFEHL von [PID: 1] von Ubuntu im Container zu / sbin / bash. In diesem Fall kann der Befehl systemctl anscheinend nicht verwendet werden.

python


#Da es sich um eine Testausführung handelt, ist es diesmal nicht erforderlich, sie als eine Reihe von Arbeiten auszuführen.
$ docker container run -it -d --privileged --name webgis-server ubuntu:20.04 /sbin/init

docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process c
aused "exec: \"/sbin/init\": stat /sbin/init: no such file or directory": unknown.

** Es kann möglich sein, Ubuntu abzubilden, wo / sbin / init existiert! ** **.

4. Ändern Sie die Bilddatei und erstellen Sie ein neues Image

Erstellen Sie / sbin / init als symbolischen Link zu / usr / lib / systemd / system /.

# ln -s  /usr/lib/systemd/system/ /sbin/init

Da es sich um einen Container handelt, in dem ** Apache2 und Systemd installiert und / sbin / init ** auf dem Originalbild erstellt wurden, erstellen Sie ein Bild aus dem Container, der den Container vorübergehend verlassen und gestoppt hat.

python


$ docker commit test-ubuntu20-4 test-ubuntu20-4:add-init
sha256:5f25a8ff7149b22665aeb4d076919ba06d7e5c3f06c77834e60c6a7e042e6bf2

#Überprüfen Sie die Liste der Bilder
$ $ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
test-ubuntu20-4     add-init            91fffb874bf9        About a minute ago   202MB
ubuntu              20.04               9140108b62dc        2 weeks ago          72.9MB
hello-world         latest              bf756fb1ae65        9 months ago         13.3kB

Erstellen Sie den Container erneut aus der Bilddatei

Erstellen Sie einen Container aus dem zuvor erstellten Bild

$ docker container run -it -d --privileged --name test-ubuntu20-4-2 test-ubuntu2
0-4:add-init /sbin/init

af59767d9b17c60fcb5284ec3669bc61edb5f4a7e5a019b5c572997553d43e9f
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process c
aused "exec: \"/sbin/init\": permission denied": unknown.

Es wird gesagt, dass ich diesmal keine Zugriffsrechte habe, und es scheint schwierig, es schließlich mit [PID1 = / sblin / init] zu starten. Ich habe verschiedene Dinge untersucht, aber im Grunde kann systemd nicht als Prozessmanagement-Tool im Docker-Container verwendet werden. (Es gibt vielleicht nichts, was Sie nicht tun können, wenn Sie es erzwingen, aber es scheint keinen Grund dafür zu geben.) ・ [Referenzseite 1](https://www.it-swarm-ja.tech/ja/boot/ubuntu%E3%81%8C%E8%B5%B7%E5%8B%95%E3%81%97 % E3% 81% AA% E3% 81% 84% EF% BC% 9Aruninit% EF% BC% 9A-sbin-init% EF% BC% 9Apermission-verweigert-and-bin-sh% EF% BC% 9A0% EF % BC% 9Kann nicht geöffnet werden / 961074669 / amp / ) ・ Referenzseite 2

Zusammenfassung

Zunächst habe ich die Vorgehensweise zum Installieren von Docker und Erstellen eines Containers kurz zusammengefasst. Da sich der für den Betrieb verwendete Kernel jedoch zwischen VM und Container unterscheidet, können Prozessmanagement-Tools nicht auf dieselbe Weise verwendet werden. Beachten Sie beim Erstellen eines Dienstes in einem Container, dass das Programm, das unter der Prämisse [PID1 = init] dämonisiert wird, nicht funktioniert. Bei der Verwaltung von Prozessen mit Docker scheint ** Supervisor ** üblich zu sein.

Recommended Posts

Systemctl kann unter Ubuntu nicht in einem Docker-Container verwendet werden
Java kann unter Ubuntu 13.04 nicht installiert werden
Führen Sie NordVPN im Docker (Windows) Ubuntu-Container aus
Installieren Sie Docker unter Ubuntu Server 20.04
Weil getSupportLoaderManager nicht verwendet werden kann
Oracle Java 8 unter Docker Ubuntu
CentOS7 VirtualBOX yum kann nicht verwendet werden
Ubuntu unter WSL2: Unter Unix kann keine Verbindung zum Docker-Daemon hergestellt werden
Führen Sie PureScript auf einem Docker-Container aus
Mit Pg_resetwal kann der PostgreSQL Docker-Container gestartet werden, wenn WAL fehlerhaft ist und nicht gestartet werden kann.
Ein Memorandum, in dem IME nicht mit VS Code aktiviert werden kann (Ubuntu 20.04)
[Java] Variablen, die innerhalb der `for-Anweisung` deklariert sind, können nicht außerhalb des` for-Anweisungsblocks` verwendet werden
Starten Sie einen Docker-Container auf EC2 (persönliches Memorandum)
Verwenden Sie Docker in einer Proxy-Umgebung unter Ubuntu 20.04.1
Versuchen Sie, Docker in Ubuntu auf WSL zu setzen
Bis Sie Apache mit Ubuntu auf Docker ausführen
Führen Sie Ubuntu + ROS mit Docker auf dem Mac aus
Überprüfen Sie mithilfe des Remote-Containers von VSCode, ob Sie vom Host in der Docker-Umgebung Laravel on nicht auf den Container zugreifen können.
Überwachen Sie den Docker-Container und den SystemD-Prozess auf demselben Host mit Zabbix unter Ubuntu.
Aktualisieren Sie das Container-Image mit KUSANAGI Runs on Docker
Installationsanweisungen für Docker unter Ubuntu18.04 unter WSL2 und VSCode
[Lösung] Java kann unter Windows 10 + ATOK 2017 nicht installiert werden
Warum der Klassenvergleich vom Typ Java String (==) nicht verwendet werden kann