Die erste Zeile eines Docker-Images beginnt mit einem Image wie FROM alpine, aber wie wird das anfängliche Basisimage erstellt? In diesem Artikel wird eine Busybox verwendet, um ein Basisimage zu erstellen. Ich glaube, dass Sie in diesem Prozess ein tieferes Verständnis einiger Docker-bezogener Konzepte erlangen werden. Was ist ein Basisimage? Einfach ausgedrückt ist ein Basis-Image ein Image, das von einer Docker-Datei erstellt wurde und nicht mit „From“ oder „FROM Scratch“ beginnt. Beispielsweise ist Alpine, dieses sehr kleine Linux-Image, nur etwa 4M groß [root@kong ~]# Docker-Bilder |grep alpine docker.io/alpine-latest 3fd9065eaf02 vor 4 Monaten 4,15 MB [root@kong ~]# Das Dockerfile ist sehr einfach und besteht aus nur drei Zeilen. Es handelt sich um ein Basis-Image. VON Grund auf Füge rootfs.tar.xz hinzu / CMD ["/bin/sh"] Im nächsten Artikel werden wir unser eigenes Basisimage wie Alpine erstellen. beschäftigtbox Zusammenfassung Busybox wird als das Schweizer Taschenmesser des Embedded Linux bezeichnet. Dieser Satz wurde bei der Selbstvorstellung von Busybox verwendet (Das Schweizer Taschenmesser des Embedded Linux). busybox integriert viele kleine, gängige Funktionen unter Unix in eine kleine ausführbare Datei. Kurz gesagt, Sie finden hier alle unter Unix oder Linux häufig verwendeten Funktionen, aber für das Ziel von busybox: eingebettetes Linux ist die Größe ein sehr wichtiger Optimierungsfaktor und eine Einschränkung für busybox. Diese Funktionen sind möglicherweise kastriert, reichen jedoch für allgemeine Anforderungen aus. Alpine fügt sein eigenes Paketverwaltungstool apk und andere auf Busybox basierende Funktionen hinzu, um ein kleines und beliebtes Image zu erstellen. Busybox ist ein Open-Source-Projekt, das in der Programmiersprache C unter GPL entwickelt wurde. Die aktuelle stabile Version ist 1.28.4 Host-Computer [root@kong ~]# uname -a Linux kong 3.10.0-693.el7.x86_64 #1 SMP Dienstag, 22. August 2017, 21:09:27 UTC x86_64 x86_64 x86_64 GNU/Linux [root@kong ~]# cat /etc/redhat-release CentOS Linux Version 7.4.1708 (Core) [root@kong ~]# Busybox herunterladen Die neueste Binärversion ist 1.28.1. [root@kong ~]# wget https://busybox.net/downloads/binaries/1.28.1-defconfig-multiarch/busybox-x86_64 --2018-05-25 04:51:20-- https://busybox.net/downloads/binaries/1.28.1-defconfig-multiarch/busybox-x86_64 Auflösen von busybox.net (busybox.net)... 140.211.167.122 Verbindung zu busybox.net (busybox.net)|140.211.167.122|:443... wird hergestellt. HTTP-Anfrage gesendet, warte auf Antwort ... 200 OK Länge: 1001112 (978K) Speichern unter: „busybox-x86_64“ 100 %[==================================================================================================================>] 1.001.112 19,3 KB/s in 30 s 25.05.2018 04:51:57 (32,4 KB/s) – „busybox-x86_64“ gespeichert [1001112/1001112] [root@kong ~]# Einrichten von Busybox [root@kong ~]# cp busybox-x86_64 /usr/local/bin/busybox [root@kong ~]# chmod +x /usr/local/bin/busybox [root@kong ~]# welche Busybox /usr/local/bin/busybox [root@kong ~]# Versionsbestätigung Geben Sie busybox ein, um die Version und die bekannten Linux-Tools anzuzeigen. Wenn Sie genau hinsehen, werden Sie verstehen, dass es keine Übertreibung ist, wenn busybox sich selbst das Schweizer Taschenmesser nennt. Im Gegenteil, wenn das Schweizer Taschenmesser es wagt, sich in Linux als Busybox zu bezeichnen, könnte dies zu Kontroversen führen. [root@kong ~]# Busybox BusyBox v1.28.1 (15.02.2018, 14:34:02 MEZ) Multi-Call-Binärdatei. BusyBox ist zwischen 1998 und 2015 durch viele Autoren urheberrechtlich geschützt. Lizenziert unter GPLv2. Siehe Quellverteilung für detaillierte Copyright-Hinweise. Verwendung: Busybox [Funktion [Argumente]...] oder: busybox --list[-full] oder: busybox --install [-s] [DIR] oder: Funktion [Argumente]... BusyBox ist eine Multi-Call-Binärdatei, die viele gängige Unix- Dienstprogramme in eine einzige ausführbare Datei. Die meisten Leute erstellen eine Link zur Busybox für jede Funktion, die sie nutzen möchten, und BusyBox wird sich so verhalten, wie es aufgerufen wurde. Aktuell definierte Funktionen: [, [[, acpid, add-shell, addgroup, adduser, adjtimex, arch, arp, arping, ash, awk, base64, basisname, beep, blkdiscard, blkid, blockdev, bootchartd, brctl, bunzip2, bzcat, bzip2, cal, cat, chat, chattr, chgrp, chmod, chown, chpasswd, chpst, chroot, chrt, chvt, cksum, löschen, cmp, comm, conspy, cp, cpio, crond, crontab, cryptpw, cttyhack, ausschneiden, datum, dc, dd, deallocvt, delgroup, deluser, depmod, devmem, df, dhcprelay, diff, dirname, dmesg, dnsd, dnsdomainname, dos2unix, dpkg, dpkg-deb, du, dumpkmap, dumpleases, echo, ed, egrep, eject, env, envdir, envuidgid, ether-wake, expand, expr, factor, fakeidentd, fallocate, false, fatattr, fbset, fbsplash, fdflush, fdformat, fdisk, fgconsole, fgrep, finden, findfs, flock, falten, frei, freeramdisk, fsck, fsck.minix, fsfreeze, fstrim, fsync, ftpd, ftpget, ftpput, fuser, getopt, getty, grep, Gruppen, gunzip, gzip, halt, hd, hdparm, Kopf, Hexdump, Hexedit, Host-ID, Hostname, httpd, Hush, Hwclock, i2cdetect, i2cdump, i2cget, i2cset, ID, ifconfig, ifdown, ifenslave, ifplugd, ifup, inetd, init, insmod, installieren, ionice, iostat, ip, ipaddr, ipcalc, ipcrm, ipcs, iplink, ipneigh, iproute, iprule, iptunnel, kbd_mode, kill, killall, killall5, klogd, letztes, weniger, Link, linux32, linux64, linuxrc, ln, loadfont, loadkmap, Logger, Anmeldung, Logname, Logread, losetup, lpd, lpq, lpr, ls, lsattr, lsmod, lsof, lspci, lsscsi, lsusb, lzcat, lzma, lzop, makedevs, makemime, man, md5sum, mdev, mesg, microcom, mkdir, mkdosfs, mke2fs, mkfifo, mkfs.ext2, mkfs.minix, mkfs.vfat, mknod, mkpasswd, mkswap, mktemp, modinfo, modprobe, mehr, mount, Einhängepunkt, mpstat, mt, mv, nameif, nanddump, nandwrite, nbd-client, nc, netstat, nice, nl, nmeter, nohup, nproc, nsenter, nslookup, ntpd, nuke, od, openvt, partprobe, passwd, paste, Patch, pgrep, pidof, Ping, Ping6, Pipe_Progress, Pivot_Root, Pkill, Pmap, Popmaildir, Poweroff, Powertop, Printenv, Printf, PS, pscan, pstree, pwd, pwdx, raidautorun, rdate, rdev, readahead, readlink, readprofile, realpath, reboot, reformime, Shell entfernen, neu einrichten, zurücksetzen, Größe ändern, fortsetzen, rev, rm, rmdir, rmmod, Route, rpm, rpm2cpio, rtcwake, Init ausführen, Teile ausführen, Runlevel, Runsv, Runsvdir, RX, Skript, Skriptwiedergabe, Sed, Sendmail, Seq, Setarch, Setconsole, Setfattr, Setfont, Setkeycodes, setlogcons, setpriv, setserial, setsid, setuidgid, sh, sha1sum, sha256sum, sha3sum, sha512sum, showkey, shred, shuf, slattach, sleep, smemcap, softlimit, sort, split, ssl_client, start-stop-daemon, stat, strings, stty, su, sulogin, sum, sv, svc, svlogd, swapoff, swapon, switch_root, sync, sysctl, syslogd, tac, tail, tar, taskset, tcpsvd, tee, telnet, telnetd, test, tftp, tftpd, Zeit, Timeout, oben, berühren, tr, Traceroute, Traceroute6, wahr, abschneiden, tty, ttysize, tunctl, ubiattach, ubidetach, ubimkvol, ubirename, ubirmvol, ubirsvol, ubiupdatevol, udhcpc, udhcpd, udpsvd, uevent, umount, uname, unexpand, uniq, unix2dos, unlink, unlzma, unshare, unxz, entpacken, Betriebszeit, Benutzer, usleep, uudecode, uuencode, vconfig, vi, vlock, volname, w, wall, watch, watchdog, wc, wget, welches, wer, whoami, whois, xargs, xxd, xz, xzcat, ja, zcat, zcip [Wurzel@kong ~] Root-Dateisystem erstellen Dieses Bild wurde unzählige Male gesehen, als die Grundlagen der Spiegelung vorgestellt wurden. Rootfs ist ein wichtiges Konzept in Linux, und es gibt auch einen Satz wie ADD rootfs.tar.xz in Alpine. Als Nächstes lernen wir, wie man ein einfaches Rootfs generiert Erstellen Sie ein Verzeichnis und geben Sie ein [root@kong ~]# mkdir rootfs [root@kong ~]# cd rootfs/ [root@kong rootfs]# Root-Dateisystem erstellen Führen Sie die folgende Anweisung aus für Modul in „busybox --list-modules“ Tun mkdir -p `Verzeichnisname "$module"` ln -sf /bin/busybox "$module" Erledigt Ausführungsprotokoll [root@kong rootfs]# für Modul in „busybox --list-modules“ > tun > mkdir -p `Verzeichnisname "$module"` > ln -sf /bin/busybox "$module" > erledigt [root@kong rootfs]# Ergebnisbestätigung [root@kong rootfs]# ls bin linuxrc sbin usr [root@kong rootfs]# finde . -Typ d . ./usr ./usr/bin ./usr/sbin ./sbin ./bin [root@kong rootfs]# Kopieren Sie busybox in das neu erstellte Verzeichnis ./bin Auf diese Weise entsteht das Linkobjekt des obigen Befehls [root@kong rootfs]# cp /usr/local/bin/busybox bin/ [root@kong rootfs]# ls -l bin/busybox -rwxr-xr-x. 1 root root 1001112 25. Mai 05:27 bin/busybox [root@kong rootfs]# Erstellen Sie rootfs.tar Beachten Sie den relativen Pfad hier. Die nachfolgenden relativen Pfade werden zu / erweitert, wodurch das Root-Dateisystem des neuen Systems erstellt wird. Dies ist auch eine der wichtigen Operationen beim Erstellen von Linux von Grund auf. [root@kong rootfs]# tar cpf rootfs.tar . tar: ./rootfs.tar: Datei ist das Archiv; nicht gesichert [root@kong rootfs]#
Dockerfile vorbereiten Bereiten Sie eine einzeilige Docker-Datei vor [root@kong rootfs]# vi Docker-Datei [root@kong rootfs]# cat Docker-Datei Von Grund auf [root@kong rootfs]# Erstellen Sie ein Basisbild. Da kein spezifischer Inhalt gefunden wurde, wurde kein spezifisches Bild erstellt. Darüber hinaus wird in diesem Artikel zur Vereinfachung der Demonstration direkt eine Docker-Datei erstellt, was keine gute Idee ist. Bitte tun Sie dies in der Praxis nicht. Wenn sich im aktuellen Verzeichnis 100G-Dateien befinden, ist dies extrem langsam und nicht standardmäßig, und irrelevante Elemente müssen gelöscht werden. [root@kong rootfs]# docker build -t busyboxbase:latest . Senden des Build-Kontexts an den Docker-Daemon 2,415 MB Schritt 1/1: VON Grund auf ---> Es wurde kein Image generiert. Ist Ihr Dockerfile leer? [root@kong rootfs]# Docker-Bilder |grep busyboxbase [root@kong rootfs]# von Grund auf Da steht From. Kann dieser Kratzer gezogen werden? Die aktuelle Version hat es als Namen reserviert. [root@kong rootfs]# Docker-Suche Scratch |grep 'ein explizit leeres' docker.io docker.io/scratch ein explizit leeres Image, insbesondere für ... 407 [OK] [root@kong rootfs]# Docker zieht Scratch Standard-Tag verwenden: latest Fehlerantwort vom Daemon: „Scratch“ ist ein reservierter Name [root@kong rootfs]# Fügen Sie diesem Dockerfile eine Zeile hinzu, die keine praktische Auswirkung hat, um zu sehen, was Scratch ist [root@kong rootfs]# vi Docker-Datei [root@kong rootfs]# cat Docker-Datei Von Grund auf WARTUNGSPERSÖNLICHKEIT LiuMiao <[email protected]> [root@kong rootfs]# Nach dem Erstellen wurde festgestellt, dass eine 0-Byte-Bilddatei generiert wurde, was mit der ursprünglichen Bedeutung von Scratch übereinstimmt. [root@kong rootfs]# docker build -t busyboxbase:latest . Senden des Build-Kontexts an den Docker-Daemon 2,415 MB Schritt 1/2: VON Grund auf ---> Schritt 2/2: MAINTAINER LiuMiao <[email protected]> ---> Läuft in b118fd7c73a7 ---> 2074dc76c09e Zwischenbehälter entfernen b118fd7c73a7 Erfolgreich erstellt 2074dc76c09e [root@kong rootfs]# Docker-Bilder |grep busyboxbase busyboxbase latest 2074dc76c09e vor 14 Sekunden 0 B [root@kong rootfs]# An diesem Punkt verstehen wir, dass from scratch nichts weiter hinzufügt. Als nächstes fügen wir die folgenden zwei Sätze hinzu wie alpine Füge rootfs.tar hinzu / CMD ["/bin/sh"] Unser Dockerfile hat fast die gleichen drei Zeilen [root@kong rootfs]# cat Docker-Datei Von Grund auf Füge rootfs.tar hinzu / CMD ["/bin/sh"] [root@kong rootfs]# Dadurch wird ein 1M Busybox-basiertes Bild erstellt [root@kong rootfs]# docker build -t busyboxbase:latest . Senden des Build-Kontexts an den Docker-Daemon 2,415 MB Schritt 1/3: VON Grund auf ---> Schritt 2/3: rootfs.tar hinzufügen / ---> 0fbb0c8c7579 Zwischenbehälter entfernen 8311e96f456c Schritt 3/3: CMD /bin/sh ---> Wird ausgeführt in efb85c4526bf ---> 02270c80a4e4 Zwischenbehälter entfernen efb85c4526bf Erfolgreich erstellt 02270c80a4e4 [root@kong rootfs]# Docker-Bilder |grep busyboxbase busyboxbase latest 02270c80a4e4 vor 9 Sekunden 1,01 MB [root@kong rootfs]# Ausführen und Verwenden Bei Verwendung von Docker Run wird festgestellt, dass der von diesem Image gestartete Container nichts Ungewöhnliches enthält [root@kong rootfs]# docker run --rm -it busyboxbase sh /# Hostname b7f9e9646746 / # uname -a Linux b7f9e9646746 3.10.0-693.el7.x86_64 #1 SMP Dienstag, 22. August 2017, 21:09:27 UTC x86_64 GNU/Linux / # Zusammenfassung Dieser Artikel stellt die Verwendung von Busybox in Kombination mit dem „From Scratch“-Mechanismus zum Erstellen eines grundlegenden Docker-Images und die zugehörigen Prinzipien vor. Dieser Artikel verwendet Busybox Version 1.28.1, um ein brauchbares Basisimage von 1,01 M zu erstellen. Vom Schweizer Taschenmesser bis zum Schweizer Nagelknipser können Sie die Optimierung auf mehrere K fortsetzen. Wenn es jedoch unter 10 M liegt, sollten Sie die nachfolgenden Skalierbarkeits- und Funktionsfaktoren berücksichtigen. Aus einer anderen Perspektive betrachtet werden bei der Integration so vieler Funktionen jedoch auch die instabilen Faktoren dieser Funktionen integriert. Mit dem „From Scratch“-Mechanismus können Sie sehr gut kleine Kontextumgebungen mit wenigen Abhängigkeiten erstellen. Verweise https://docs.docker.com/develop/develop-images/baseimages/ Zusammenfassen Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM. Wenn Sie mehr darüber erfahren möchten, schauen Sie sich bitte die folgenden Links an Das könnte Sie auch interessieren:
|
<<: Vue basierend auf einer Element-Button-Berechtigungsimplementierungslösung
Inhaltsverzeichnis 1. Grundlegende Theorie 1.1 Tr...
Vorwort Apropos Textsuchtools: Jeder sollte grep ...
Inhaltsverzeichnis 1. Projektanforderungen 2. Dok...
In diesem Artikel wird der spezifische Code von R...
Methode 1: GLOBAL festlegen general_log = "A...
Vor ein paar Tagen habe ich auf Codepen ein Beisp...
Inhaltsverzeichnis MySQL Shell import_table Daten...
Wichtige Daten müssen gesichert werden, und zwar ...
Das neueste Tutorial zur Installation von MySQL 8...
HTML-Style-Tag Stil-Tag - Verwenden Sie dieses Ta...
1. Einführung in Varnish Varnish ist ein leistung...
Inhaltsverzeichnis MySQL-Indexoptimierung – Pagin...
Inhaltsverzeichnis 01 Einführung in GTID 02 Wie G...
1. Typeinführung 1.1 Domänenbasiertes virtuelles ...
Historische Befehle anzeigen und bestimmte Befehl...