Ein Memorandum bei der Installation von Docker und der Erstellung eines Linux-Containers

Zweck

Wenn Docker nicht installiert ist, installieren Sie Docker und versuchen Sie, den Befehl zypper mit openSUSE auf dem Container zu verwenden. Kombiniert LPIC- und Docker-Lernen.

Umgebung

macOS Catalina (Version 10.15.7) MacBook Pro Docker version 19.03.13

Docker-Installation

Befolgen Sie die Anweisungen in Docker Official und installieren Sie sie von Docker Hub. .. Nach der Installation gab es ein Tutorial. Geben Sie den Befehl wie auf Docker Desktop angegeben ein (klicken Sie auf die Schaltfläche). Was den Inhalt betrifft, ① Erstellen Sie einen Container mit dem Namen "repo" aus dem Bild "alpine / git" und erstellen Sie einen Klon aus dem GitHub-Repository auf dem Container. ② Kopieren Sie die Dateien im Container lokal. ③ Erstellen Sie ein Image aus der Docker-Datei und nennen Sie es "docker101tutorial". ④ Geben Sie dem erstellten Bild den Namen "docker / docker101tutorial", laden Sie es auf Docker Hub hoch und geben Sie es frei.

$ 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

Befehl usw. Erläuterung
docker run [Möglichkeit]Bild[:Tag oder@Digest-Wert] [Befehl] [Streit...] Erstellt eine Containerebene für das angegebene Bild und startet sie.
Führt den gleichen Vorgang aus wie Docker erstellen → Docker starten. Wenn das angegebene Image lokal nicht vorhanden ist, wird es von Docker Hub heruntergeladen, sodass es möglicherweise von einer Docker-Pull-Operation begleitet wird.
Diesmal das angegebene Bild alpin/Ich habe kein Git lokal, also lade ich es von Docker Hub herunter.
--name Geben Sie dem Container einen Namen. Diesmal habe ich es Repo genannt. Standardmäßig wird es aus einer zufälligen Zeichenfolge benannt.
clone Ich klone von GitHub. Da git in ENTRYPOINT angegeben ist, wird der Git-Klon tatsächlich ausgeführt.
cp container: Pfad lokaler Pfad Kopieren Sie den Inhalt des Dateisystems des Containers in Ihren lokalen Pfad.
docker build [Möglichkeit]Pfad oder URL oder- Erstellen Sie ein neues Image aus der Docker-Datei im Pfad.
-t NamensschildGeben Sie den Namen und die optionalen Tags im Format an. Dieses Mal wird nur der Name angegeben und das Tag weggelassen.
docker tag [Möglichkeit]Bild[:Etikett] [Registrierungshost/][Nutzername/]Name[:Etikett] リポジトリ内のイメージにEtikett付。今回はdocker101tutorialZum Bilddockeridok/docker101tutorialというNameをつけている。
docker push [Möglichkeit]Name[:Etikett] Sie können das Image für die Docker Hub-Registrierung oder Ihre eigene Registrierung freigeben.

Dockerfile

Die Docker-Datei, auf der das Bild basiert. Docker liest Anweisungen aus der Docker-Datei und erstellt das Image automatisch. Dieses Mal werden wir unser Verständnis von Docker vertiefen, indem wir die einfache Docker-Datei aus dem offiziellen Website-Tutorial als Beispiel verwenden.

Dockerfile



#Basisbild
FROM node:current-slim

#RUN in Dockerfile angegeben,Geben Sie das Arbeitsverzeichnis an, wenn Sie Anweisungen wie KOPIEREN ausführen
WORKDIR /usr/src/app

#Kopieren Sie die Datei vom Host in den Container.
COPY package.json .

#Führen Sie den Befehl im Image-Dateisystem aus.
RUN npm install

#Lassen Sie den Containeranschluss los.
EXPOSE 8080

#Führen Sie den im Container angegebenen Befehl aus. CMD bietet Standardeinstellungen beim Ausführen des Containers.
CMD [ "npm", "start" ]

#Kopieren Sie alle Dateien usw. in den Container.
COPY . .

Andere verwendete Docker-Befehle

#Container löschen
Docker rm Containername
#Löschen Sie den laufenden Container.--Kraft stoppt den Behälter.
docker rm --Containername erzwingen

#Containerbestätigung
docker ps -a

#Bildlöschung
Docker rmi Bildname
#Löschen Sie alle Bilder.-Die Option q zeigt nur die ID an.
docker rmi `docker images -q`

#Bildbestätigung
docker images

#Starten Sie den Container. Aus dem Tutorial auf der offiziellen Website. Details des Befehls werden später beschrieben.
docker run --publish 8000:8080 --detach --name bb bulletinboard:1.0

#Erstellen Sie ein Bild aus einem Container
docker commit -m "message" -eine verantwortliche Person" \
Container ID hogeuser/opensuse:v2
Befehl usw. Erläuterung
--publish 8000:8080 Veröffentlichen Sie den Container-Port auf der Host-Seite. Leiten Sie den Host-Port 8000 an den Container-Port 8080 weiter.
--detach Führen Sie den Container im Hintergrund aus.
docker commit [Möglichkeit]Container[Repository[:Etikett]] Erstellen Sie ein neues Bild, das die Dateiänderungen und -einstellungen des Containers widerspiegelt.

Installieren Sie das openSUSE-Image, damit Sie Befehle für den Container eingeben können

Nachdem ich eine Vorstellung von Docker habe, werde ich einen openSUSE-Container für das Hauptthema erstellen.

Der Name des openSUSE-Images wurde von DockerHub opensuse / leap gefunden. Sie müssen es also nur ausführen. Wenn Sie nur den Befehl überprüfen, ist er schneller als das Erstellen einer virtuellen Maschine.

% 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
Befehl usw. Erläuterung
-i Holen Sie sich die Standardeingabe (STDIN) des Containers. Standardeingabe ist im Container möglich.
-t Weisen Sie im Container ein Pseudo-Terminal zu.-Durch die Kombination mit t können Sie Befehle wie bei einem normalen Terminal eingeben (obwohl ich nicht weiß, wie viel Sie wie gewohnt tun können).

Da systemctl und localectl unter CentOS nicht verwendet werden konnten, sollten Sie sich damit befassen.

Ich habe auch einen CentOS-Container erstellt und verwendet, aber es war ärgerlich zu sehen, dass das Gebietsschema nicht festgelegt werden kann. Stellen Sie sicher, dass $ LC_ * und $ LANG korrekt sind. Als ich also versuchte, das Gebietsschema zu ändern

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

Wird angezeigt. Kann systemd nicht funktionieren, weil die Shell PID1 verwendet?

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

Ich habe es gelöst, indem ich diesem Artikel gefolgt bin. Hyakuzo's Room "Wenn systemctl nicht mit CentOS 7-Containern verwendet werden kann"

docker run -itd --privilegiertes Bild/sbin/init

docker exec -es Container/bin/bash

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

Befehl usw. Erläuterung
--privileged Geben Sie dem Container erweiterte Berechtigungen (alle Berechtigungen). Sie können eine Verbindung zu anderen Containern und zu allen Geräten auf dem Host herstellen.
/sbin/init Mit einem symbolischen Link zu systemd--Durch die Verwendung mit privilegierten/sbin/init works und systemctl etc. können ausgeführt werden
docker exec [Möglichkeit]Container-Befehl[Streit...] Führen Sie den Befehl im laufenden Container aus. Wenn Sie diesmal den Befehl im Container ausführen,/bin/Es bedeutet "Bash-Befehl"?

Übrigens lokale Einstellung. Nach dem Einstellen sollte es in source / etc / locale.conf wiedergegeben werden (der obige Befehl wird nicht ausgeführt, da er durch reboot aus dem Container kam).

[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

Schnelle Färbung

Ich möchte das Eingabeaufforderungsteil verständlicher machen, damit ich es einfärben kann. Referenzseite: Tohohos WWW "Einführung in Shell".

#Shell-Bestätigung
$ echo $SHELL
#Einstellungsdatei bearbeiten. Färbe es grün, um die Zeit anzuzeigen.
$ vi /etc/bashrc
export PS1="\[\e[1;32m\][\u@\h \w][\t]\[\e[0m\]\s\ $"
#Reflektieren
$ source /etc/bashrc

Zeit Einstellungen

Als ich die Uhrzeit an der Eingabeaufforderung anzeigte, war es nicht Japan, also ändern Sie sie in Japan.

[root@f95fa15cf5fb /][13:26:29]bash#timedatectl 
               Local time:So 2020-11-01 13:26:37 UTC
           Universal time:So 2020-11-01 13:26:37 UTC
                 RTC time:So 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:So 2020-11-01 22:27:07 JST
           Universal time:So 2020-11-01 13:27:07 UTC
                 RTC time:So 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

Dies war problematisch, da die Abschlussfunktion häufig nicht aktiviert war. Aktivieren Sie sie daher. Es ist nicht schön, aber nachdem ich den folgenden Befehl ausgeführt habe, bin ich aus dem Container ausgestiegen, habe den Container verpflichtet, ein Bild zu erstellen, und das Bild zu einem Container gemacht, um die Abschlussfunktion zu aktivieren.

[root@f95fa15cf5fb /][22:32:18]bash#yum info bash-completion
Last metadata expiration check: 1:18:Vor 08 am 01. November 2020 um 21:24:15 Uhr.
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

Ein Memorandum bei der Installation von Docker und der Erstellung eines Linux-Containers
Beginnen Sie mit der Installation von Docker auf EC2 und dem Ausführen von Yellowfin in einem Container
Erstellen einer CICD-Pipeline mit Docker (persönliches Memorandum)
Punktnotiz beim Erstellen eines Docker-Containers, der von einem Kollegen erstellt wurde
Speicherort für die Einstellung des Arbeitsbereichs, wenn Sie eine Remoteverbindung mit VSCode herstellen und an einem Docker-Container arbeiten
Einführung in Linux Container / Docker (Teil 2)
Führen Sie PureScript auf einem Docker-Container aus
[Linux] Starten Sie den Apache-Container mit Docker
Über Docker, gefälschten Server und Container
Klonen Sie Ihre eigene Web-App auf GitLab, wenn Sie ein Docker-Image erstellen
Installieren Sie Docker und Docker-Compose unter Alpine Linux
Erstellen einer Rails 6- und PostgreSQL-Umgebung mit Docker
Starten Sie einen Docker-Container auf EC2 (persönliches Memorandum)
Docker Memorandum
So erhalten Sie einen Heapdump aus einem Docker-Container
Erstellen Sie eine Kotlin-App mit dem OpenJDK Docker-Container
Memo beim Tappen und Entwickeln mit JavaFX
Ich habe einen Docker-Container erstellt, um Maven auszuführen
Erstellen Sie einen Container für Docker x Laravel phpMyAdmin
Bereiten Sie eine Scraping-Umgebung mit Docker und Java vor
Für Docker Container Pull ist ein Ratenlimit festgelegt
Ein Memorandum, wenn CentOS in VirtualBox installiert ist und Grundeinstellungen vorgenommen werden [macOS]
[Docker] Wie man mit einem Container in Heroku aktualisiert und wie man mit Migrate Error umgeht