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.
[Host-Betriebssystem] ・ Ubuntu20.04 LTS (auf GCP)
[Soft Image Version] ・ Docker 19.03.13 ・ OS Ubuntu20.04 LTS des Container-Images
Gehen Sie bei der Installation aus dem Docker-Repository wie folgt vor.
apt
empfohlen, daher wird apt-get
nicht verwendet.$ sudo dpkg -l docker
$ sudo apt update
⇒ Wenn dpkg-query: Keine Pakete gefunden, die zum Docker passen
angezeigt wird, wird es nicht installiert.
$ sudo apt install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
$ 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
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
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
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]
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
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.
python
$Docker-Suche [beliebiges Schlüsselwort]
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
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
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.
/ sbin / init
mit dem folgenden Befehl anzugeben, aber es wird gesagt, dass / sbin / init
im Image nicht vorhanden ist.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! ** **.
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 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
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