Systemctl ne peut pas être utilisé sur Ubuntu dans un conteneur Docker

introduction

Lors de la création d'un système ou d'une application, j'ai pensé que s'il pouvait être construit sur le conteneur Docker, cela conduirait à l'efficacité du développement et de la maintenance, j'ai donc essayé diverses choses, je vais donc résumer les bases.

Conditions préalables

[OS hôte] ・ Ubuntu20.04 LTS (sur GCP)

[Version de l'image douce] ・ Docker 19.03.13 ・ OS Ubuntu20.04 LTS de l'image du conteneur

Que veux-tu faire

    1. installation et configuration de docker
  1. Créer un conteneur dans le docker
    1. Entrez dans le conteneur et démarrez Apache
  2. Modifier le fichier image et le réimaginer

1. 1. installation et configuration de docker

Lors de l'installation à partir du référentiel Docker, suivez la procédure ci-dessous.

Assurez-vous que Docker n'est pas installé

$ sudo dpkg -l docker

Mise à jour de l'outil de gestion des packages

$ sudo apt update

⇒ Si dpkg-query: aucun paquet trouvé correspondant au docker est affiché, il n'est pas installé.

Installation du logiciel requise pour l'installation de Docker

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

Ajout de la clé publique GPG officielle de Docker

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

Vérifiez si la clé publique a été correctement ajoutée

$ sudo apt-key fingerprint

Qiita-no010_img04.jpg

Ajouter un référentiel

Assurez-vous qu'il n'y a pas de docker dans le référentiel.

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

Paramètres du référentiel

python


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

Confirmez que le référentiel a été ajouté

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

Vérifier les versions disponibles

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

installation de docker

Depuis que le référentiel a été ajouté, ʻupdate à nouveau puis exécutez ʻinstall

python


$ sudo apt update
$ sudo apt install docker-ce

Vérifiez la version du docker installée

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

Vérifiez si le démon est démarré

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

Vérification du fonctionnement du docker

Hello world Obtenez un exemple d'image Docker et exécutez-le.

python


$ sudo docker container run hello-world

Consultez la liste des images et des conteneurs actuels

python


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

#Liste des conteneurs (y compris arrêtés)
$ 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

#Affichage du conteneur en cours d'exécution
$ sudo docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS          
     NAMES

Depuis que j'ai pu confirmer l'opération, j'ai supprimé le conteneur et l'image une fois.

python


$ sudo docker container rm [ID du conteneur]
$ sudo docker image rm [ID de l'image]

paramètres du docker

Paramètres de démarrage automatique

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

Ajouté au groupe docker pour exécuter la commande docker sans sudo.

python


#Tout d'abord[docker]Confirmation de groupe. * Si vous n'avez pas de groupe, vous devez en créer un vous-même.
$ cat /etc/group | grep docker
docker:x:998:

# [docker]Ajoutez des utilisateurs au groupe.
$ sudo usermod -aG docker [Nom d'utilisateur]

Après avoir redémarré Ubuntu, si vous pouvez exécuter la commande sans sudo comme indiqué ci-dessous, vous pouvez modifier les paramètres.

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

2. Créer un conteneur dans le docker

Étant donné que le conteneur est créé à l'aide de l'image docker, obtenez d'abord l'image docker. De nombreuses images ont déjà été publiées sur le site docker, utilisez donc la commande de recherche pour trouver l'image souhaitée et obtenir l'image.

Confirmation de l'image à acquérir

python


$recherche de docker [mot-clé arbitraire]

Obtenir une image

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

Créer un conteneur à partir d'une image

shell::


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

#Lorsque vous souhaitez associer un numéro de port
# docker container run -it -d -p 8080(Port côté Ubuntu):5000(Port côté conteneur) --name webgis-server ubuntu:20.04

** Vérifiez le conteneur en cours d'exécution **

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. Entrez dans le conteneur et démarrez Apache

Entrez le conteneur (test-ubuntu20-4) créé précédemment

$ docker attach test-ubuntu20-4

Mises à jour de l'outil de gestion des packages.

# apt update

Installer Apache

# apt install -y apache2

Vérifiez l'état de démarrage d'Apache.

# systemctl status apache2
bash: systemctl: command not found

Étant donné que le message ci-dessus est affiché et qu'il ne peut pas être utilisé, installez le package afin que systemctl puisse être utilisé. (Un simple démarrage, etc. peut être fait avec la commande service apache2 ~~~~.)

# apt install -y systemd

Vérifiez à nouveau l'état de démarrage d'Apache.

# 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

Il semble y avoir un problème avec PID1, donc vérifions-le.

# 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 

En fait, lorsque vous créez un conteneur avec la commande docker container run -it -d --name ubuntu: 20.04, la COMMANDE de [PID: 1] d'Ubuntu dans le conteneur devient / sbin / bash. Dans ce cas, il semble que la commande systemctl ne puisse pas être utilisée.

python


#Puisqu'il s'agit d'une exécution de test, il n'est pas nécessaire de l'exécuter comme une série de travaux cette fois.
$ 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.

** Il peut être possible de créer une image d'Ubuntu là où / sbin / init existe! ** **

4. Modifier le fichier image et le réimaginer

Créez / sbin / init comme lien symbolique vers / usr / lib / systemd / system /.

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

Puisqu'il s'agit d'un conteneur avec ** Apache2 et Systemd installés et / sbin / init créé ** sur l'image d'origine, créez une image à partir du conteneur qui a temporairement quitté le conteneur et s'est arrêté.

python


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

#Consultez la liste des images
$ $ 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

Créer à nouveau le conteneur à partir du fichier image

Créer un conteneur à partir de l'image créée précédemment

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

On dit que je n'ai pas de droits d'accès cette fois, et il semble difficile de le démarrer avec [PID1 = / sblin / init] après tout. J'ai recherché diverses choses, mais fondamentalement, systemd ne peut pas être utilisé comme outil de gestion de processus dans le conteneur Docker. (Il se peut que vous ne puissiez rien faire si vous le forcez, mais il ne semble y avoir aucun mérite à le faire.) ・ [Site de référence 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-refusée-et-bin-sh% EF% BC% 9A0% EF % BC% 9Acan-not-open-splash / 961074669 / amp / ) ・ Site de référence 2

Résumé

Tout d'abord, j'ai brièvement résumé la procédure d'installation de docker et de création d'un conteneur, mais comme le noyau utilisé pour l'opération est différent entre la VM et le conteneur, les outils de gestion de processus ne peuvent pas être utilisés de la même manière. Lors de la création d'un service dans un conteneur, sachez que le programme démonisé sur la base de [PID1 = init] ne fonctionnera pas. Lors de la gestion des processus avec docker, il semble que ** Supervisor ** soit courant.

Recommended Posts

Systemctl ne peut pas être utilisé sur Ubuntu dans un conteneur Docker
Impossible d'installer Java sur Ubuntu 13.04
Exécutez NordVPN dans le conteneur Ubuntu Docker (Windows)
Installez Docker sur Ubuntu Server 20.04
Parce que getSupportLoaderManager ne peut pas être utilisé
Oracle Java 8 sur Docker Ubuntu
CentOS7 VirtualBOX yum ne peut pas être utilisé
Ubuntu sur WSL2: impossible de se connecter au démon Docker sous unix
Exécuter PureScript sur un conteneur Docker
Pg_resetwal peut être utilisé pour démarrer le conteneur Docker PostgreSQL lorsque WAL est cassé et ne peut pas être démarré.
Un mémorandum lorsque IME ne peut pas être activé avec VS Code (Ubuntu 20.04)
[Java] Les variables déclarées à l'intérieur de l'instruction `for` ne peuvent pas être utilisées en dehors du bloc` instruction for`
Lancer un conteneur docker sur EC2 (mémorandum personnel)
Utiliser docker dans un environnement proxy sur ubuntu 20.04.1
Essayez de mettre Docker dans ubuntu sur WSL
Jusqu'à ce que vous exécutiez apache avec ubuntu sur docker
Exécutez Ubuntu + ROS avec Docker sur Mac
Vérifiez si vous ne pouvez pas accéder au conteneur à partir de l'hôte dans l'environnement Laravel sur docker à l'aide du conteneur distant de VSCode.
Surveillez le conteneur Docker et le processus SystemD sur le même hôte avec Zabbix sur Ubuntu.
Mettre à jour l'image du conteneur avec KUSANAGI s'exécute sur Docker
Docker sur Ubuntu18.04 sur WSL2 et instructions d'installation de VSCode
[Solution] Java ne peut pas être installé sur Windows 10 + ATOK 2017
Pourquoi la comparaison de classe de type chaîne Java (==) ne peut pas être utilisée