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.
[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
Lors de l'installation à partir du référentiel Docker, suivez la procédure ci-dessous.
est recommandée, donc ʻapt-get
n'est pas utilisé.$ sudo dpkg -l docker
$ sudo apt update
⇒ Si dpkg-query: aucun paquet trouvé correspondant au docker
est affiché, il n'est pas installé.
$ 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 -
Vérifiez si la clé publique a été correctement ajoutée
$ sudo apt-key fingerprint
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
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
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 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
É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.
python
$recherche de docker [mot-clé arbitraire]
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
#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
docker container run
pour créer un conteneur pour vous.** 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
Entrez le conteneur (test-ubuntu20-4) créé précédemment
$ docker attach test-ubuntu20-4
, le conteneur sera arrêté, donc lorsque vous entrez à nouveau, démarrez-le avec
docker container start [nom du conteneur]`.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.
/ sbin / init
avec la commande suivante, mais on dit que / sbin / init
n'existe pas dans l'image.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! ** **
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 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
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