Un mémorandum lors de l'installation de Docker et de la construction d'un conteneur Linux

Objectif

Avec Docker non installé, installez Docker et essayez d'utiliser la commande zypper avec openSUSE sur le conteneur. Combine l'apprentissage LPIC et Docker.

environnement

macOS Catalina (version 10.15.7) MacBook Pro Docker version 19.03.13

Installation de Docker

Suivez les instructions dans Docker Official et installez depuis Docker Hub .. Puisqu'il y a eu un tutoriel après l'installation, entrez la commande comme indiqué sur Docker Desktop (vous pouvez également cliquer sur le bouton). Quant au contenu, ① Construisez un conteneur nommé repo à partir de l'image ʻalpine / git, et créez un clone à partir du référentiel GitHub sur le conteneur. ② Copiez les fichiers dans le conteneur localement. ③ Construisez une image à partir du Dockerfile et nommez-la docker101tutorial. ④ Donnez à l'image créée le nom docker / docker101tutorial`, téléchargez-la sur Docker Hub et partagez-la.

$ docker run --name repo alpine/git clone https://github.com/docker/getting-started.git
$ docker cp repo:/git/getting-started/ .
$ cd getting-started/
$ docker build -t docker101tutorial .
$ docker tag docker101tutorial dockeridok/docker101tutorial 
$ docker push dockeridok/docker101tutorial

Commande etc. Explication
docker run [option]image[:Tag ou@Valeur du résumé] [commander] [argument...] Crée une couche de conteneur sur l'image spécifiée et la démarre.
Effectue la même opération que docker create → docker start. Si l'image spécifiée n'existe pas localement, elle sera téléchargée à partir de Docker Hub, elle peut donc être accompagnée d'une opération d'extraction de docker.
Cette fois, l'image spécifiée alpine/Je n'ai pas de git localement, donc je le télécharge depuis Docker Hub.
--name Donnez un nom au conteneur. Cette fois, je l'ai nommé repo. La valeur par défaut est de le nommer à partir d'une chaîne aléatoire.
clone Je clonage depuis GitHub. Puisque git est spécifié dans ENTRYPOINT, git clone est en fait exécuté.
conteneur cp: chemin chemin local Copiez le contenu du système de fichiers du conteneur dans votre chemin local.
docker build [option]Chemin ou URL ou- Créez une nouvelle image à partir du Dockerfile dans le chemin.
-t Nom: TagSpécifiez le nom et les balises facultatives dans le format. Cette fois, seul le nom est spécifié et la balise est omise.
docker tag [option]image[:marque] [Hôte du registre/][Nom d'utilisateur/]Nom[:marque] リポジトリ内のイメージにmarque付。今回はdocker101tutorialÀ l'imagedockeridok/docker101tutorialというNomをつけている。
docker push [option]Nom[:marque] Vous pouvez partager l'image avec le registre Docker Hub ou votre propre registre.

Dockerfile

Dockerfile sur lequel l'image est basée. Docker lit les instructions du Dockerfile et crée automatiquement l'image. Cette fois, nous approfondirons notre compréhension de Docker en utilisant le simple Dockerfile du tutoriel du site officiel comme exemple.

Dockerfile



#Image de base
FROM node:current-slim

#RUN spécifié dans Dockerfile,Spécifiez le répertoire de travail lors de l'exécution d'instructions telles que COPY
WORKDIR /usr/src/app

#Copiez le fichier de l'hôte dans le conteneur.
COPY package.json .

#Exécutez la commande dans le système de fichiers image.
RUN npm install

#Libérez le port du conteneur.
EXPOSE 8080

#Exécutez la commande spécifiée dans le conteneur. CMD fournit les valeurs par défaut lors de l'exécution du conteneur.
CMD [ "npm", "start" ]

#Copiez tous les fichiers, etc. dans le conteneur.
COPY . .

Autres commandes Docker utilisées

#Supprimer le conteneur
nom du conteneur docker rm
#Supprimez le conteneur en cours d'exécution.--la force arrête le conteneur.
docker rm --forcer le nom du conteneur

#Confirmation du conteneur
docker ps -a

#Suppression d'image
nom de l'image rmi docker
#Supprimez toutes les images.-L'option q affiche uniquement l'ID.
docker rmi `docker images -q`

#Confirmation d'image
docker images

#Démarrez le conteneur. Extrait du tutoriel sur le site officiel. Les détails de la commande seront décrits plus loin.
docker run --publish 8000:8080 --detach --name bb bulletinboard:1.0

#Créer une image à partir d'un conteneur
docker commit -m "message" -un "responsable"" \
ID de conteneur hogeuser/opensuse:v2
Commande etc. Explication
--publish 8000:8080 Publiez le port du conteneur côté hôte. Transférez le port hôte 8000 vers le port conteneur 8080.
--detach Exécutez le conteneur en arrière-plan.
docker commit [option]récipient[Dépôt[:marque]] Créez une nouvelle image qui reflète les modifications et les paramètres du fichier du conteneur.

Installez l'image openSUSE afin de pouvoir taper des commandes sur le conteneur

Maintenant que j'ai une idée de Docker, je vais créer un conteneur openSUSE pour le sujet principal.

Le nom de l'image openSUSE a été trouvé par DockerHub opensuse / leap, donc tout ce que vous avez à faire est de l'exécuter. Si vous vérifiez simplement la commande, c'est plus rapide que de créer une machine virtuelle.

% docker run -it opensuse/leap:latest
Unable to find image 'opensuse/leap:latest' locally
latest: Pulling from opensuse/leap
658f48177d00: Already exists 
Digest: sha256:
Status: Downloaded newer image for opensuse/leap:latest

0a5ec012802e:/ # cat /etc/*release
NAME="openSUSE Leap"
VERSION="15.2"
ID="opensuse-leap"
ID_LIKE="suse opensuse"
VERSION_ID="15.2"
PRETTY_NAME="openSUSE Leap 15.2"
ANSI_COLOR="0;32"
CPE_NAME="cpe:/o:opensuse:leap:15.2"
BUG_REPORT_URL="https://bugs.opensuse.org"
HOME_URL="https://www.opensuse.org/"

0a5ec012802e:/ # zypper --version
zypper 1.14.38
Commande etc. Explication
-i Obtenez l'entrée standard (STDIN) du conteneur. Une entrée standard sera possible dans le conteneur.
-t Attribuez un pseudo terminal à l'intérieur du conteneur.-En combinant avec t, vous pouvez entrer des commandes comme un terminal normal (bien que je ne sache pas ce que vous pouvez faire comme d'habitude).

Puisque systemctl et localectl ne peuvent pas être utilisés sur CentOS, traitez-le.

J'ai également construit et utilisé un conteneur CentOS, mais c'était ennuyeux de voir `ne peut pas définir la locale; assurez-vous que $ LC_ * et $ LANG sont corrects ', donc quand j'ai essayé de changer la locale,

System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to create bus connection: Host is down

Est affiché. Systemd ne peut pas fonctionner parce que le shell utilise PID1?

[root@15900d9cd863 /]bash# ps
  PID TTY          TIME CMD
    1 pts/0    00:00:00 bash
  162 pts/0    00:00:00 ps

Je l'ai résolu en suivant cet article. Hyakuzo's Room "Lorsque systemctl ne peut pas être utilisé avec le conteneur CentOS 7"

docker run -itd --image privilégiée/sbin/init

docker exec -il conteneur/bin/bash

[root@d7a7f918cfde /]bash# ps
PID    TTY       TIME CMD
119    pts/1     00:00:00 bash
15560  pts/1     00:00:00 ps

Commande etc. Explication
--privileged Accordez des privilèges étendus (tous les privilèges) au conteneur. Vous pouvez vous connecter à d'autres conteneurs et vous connecter à tous les périphériques de l'hôte.
/sbin/init Avec un lien symbolique vers systemd--En utilisant avec des privilèges/sbin/init fonctionne et systemctl etc. peut être exécuté
docker exec [option]Commande conteneur[argument...] Exécutez la commande dans le conteneur en cours d'exécution. Cette fois, lorsque vous exécutez la commande dans le conteneur,/bin/Cela signifie "commande bash"?

Au fait, cadre local. Après le réglage, il devrait être reflété dans source / etc / locale.conf (la commande ci-dessus n'est pas exécutée car elle est sortie du conteneur par redémarrage).

[root@d7a7f918cfde /]bash# localectl
   System Locale: LANG=en_US.UTF-8
       VC Keymap: us
      X11 Layout: n/a
[root@d7a7f918cfde /]bash# localectl list-locales
C.utf8
[root@d7a7f918cfde /]bash# dnf -y install langpacks-ja
[root@d7a7f918cfde /]bash# localectl list-locales
C.utf8
ja_JP.eucjp
ja_JP.utf8
[root@d7a7f918cfde /]bash# localectl set-locale LANG=ja_JP.utf8
[root@d7a7f918cfde /]bash# localectl
   System Locale: LANG=ja_JP.utf8
       VC Keymap: us
      X11 Layout: n/a

Coloration rapide

Je veux rendre la partie de l'invite plus facile à comprendre, je vais donc la colorier. Site de référence: Tohoho's WWW "Introduction to Shell".

#Confirmation Shell
$ echo $SHELL
#Modifier le fichier de paramètres. Colorez-le en vert pour afficher l'heure.
$ vi /etc/bashrc
export PS1="\[\e[1;32m\][\u@\h \w][\t]\[\e[0m\]\s\ $"
#Réfléchir
$ source /etc/bashrc

Paramètres de temps

Lorsque j'ai affiché l'heure sur l'invite, ce n'était pas le Japon, alors changez-le en Japon.

[root@f95fa15cf5fb /][13:26:29]bash#timedatectl 
               Local time:Dim 2020-11-01 13:26:37 UTC
           Universal time:Dim 2020-11-01 13:26:37 UTC
                 RTC time:Dim 2020-11-01 13:26:37
                Time zone: UTC (UTC, +0000)
System clock synchronized: no
              NTP service: n/a
          RTC in local TZ: no

[root@f95fa15cf5fb /][13:26:37]bash#timedatectl set-timezone Asia/Tokyo
       
[root@f95fa15cf5fb /][22:27:03]bash#timedatectl 
               Local time:Dim 2020-11-01 22:27:07 JST
           Universal time:Dim 2020-11-01 13:27:07 UTC
                 RTC time:Dim 2020-11-01 13:27:07
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: no
              NTP service: n/a
          RTC in local TZ: no

C'était gênant car la fonction de complétion n'était souvent pas activée, alors activez-la. Ce n'est pas joli, mais après avoir exécuté la commande suivante, je suis sorti du conteneur, j'ai engagé le conteneur pour créer une image et ai fait de l'image un conteneur pour activer la fonction de complétion.

[root@f95fa15cf5fb /][22:32:18]bash#yum info bash-completion
Last metadata expiration check: 1:18:08 novembre le 01 novembre 2020 21:24:15.
Available Packages
Name         : bash-completion
Epoch        : 1
Version      : 2.7
Release      : 5.el8
Architecture : noarch
Size         : 274 k
Source       : bash-completion-2.7-5.el8.src.rpm
Repository   : BaseOS
Summary      : Programmable completion for Bash
URL          : https://github.com/scop/bash-completion
License      : GPLv2+
Description  : bash-completion is a collection of shell functions that take advantage
             : of the programmable completion feature of bash.

[root@f95fa15cf5fb /][22:42:23]bash#yum install bash-completion

Recommended Posts

Un mémorandum lors de l'installation de Docker et de la construction d'un conteneur Linux
Commencer par installer Docker sur EC2 et exécuter Yellowfin dans un conteneur
Construire un pipeline CICD à l'aide de Docker (mémorandum personnel)
Mémo ponctuel lors de la création d'un conteneur Docker créé par un collègue
Emplacement des paramètres de l'espace de travail lors de la connexion à distance avec VSCode et du travail sur un conteneur Docker
Introduction à Linux Container / Docker (Partie 2)
Exécuter PureScript sur un conteneur Docker
[Linux] Démarrer le conteneur Apache avec Docker
À propos de Docker, faux serveur et conteneur
Clonez votre propre application Web sur GitLab lors de la création d'une image Docker
Installez docker et docker-compose sur Alpine Linux
Construction de Rails 6 et environnement PostgreSQL avec Docker
Lancer un conteneur docker sur EC2 (mémorandum personnel)
Mémorandum Docker
Comment obtenir un heapdump à partir d'un conteneur Docker
Créer une application Kotlin à l'aide du conteneur OpenJDK Docker
Mémo lors du tâtonnement et du développement à l'aide de JavaFX
J'ai créé un conteneur Docker pour exécuter Maven
Créer un conteneur pour Docker x Laravel phpMyAdmin
Préparer un environnement de scraping avec Docker et Java
L'extraction du conteneur Docker a une limite de débit appliquée
Un mémorandum lorsque CentOS est installé dans VirtualBox et que les paramètres de base sont définis [macOS]
[Docker] Comment mettre à jour à l'aide d'un conteneur dans Heroku et comment gérer l'erreur de migration