Docker verwendet Busybox, um ein Basis-Image zu erstellen

Docker verwendet Busybox, um ein Basis-Image zu erstellen

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]#

Kurzbeschreibung: busybox –list-modules listet alle Module von busybox auf und erstellt dann darauf basierend ein kleines Root-Dateisystem.
[root@kong rootfs]# busybox –list-modules |wc -l
389
[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:
  • Implementierung eines Tomcat-Images, das mit Dockerfile basierend auf Alpine erstellt wurde
  • Implementierung eines Crawler-Scrapy-Image, das von Dockerfile basierend auf Alpine erstellt wurde
  • So erstellen Sie ein Docker-Image, das den SSH-Dienst unterstützt
  • So erstellen Sie ein Docker-Image
  • So erstellen Sie ein MariaDB-Image in Docker
  • So erstellen Sie ein Redis-Image im Docker
  • Detaillierte Erklärung der Dockerfile-Anweisungen in Docker zum Erstellen von Bildern
  • So laden Sie das offizielle Docker-Image herunter und erstellen ein Image mit Dockerfile
  • Tutorial zum Erstellen eines privaten Image-Repositorys mit Docker
  • Analyse der Docker-Methode zum Erstellen lokaler Images

<<:  Vue basierend auf einer Element-Button-Berechtigungsimplementierungslösung

>>:  Detaillierte Erläuterung der Konstruktion der Lese-/Schreibtrennung bei der MySQL-Master-Slave-Replikation

Artikel empfehlen

Das schnellste Textsuchtool von Linux: ripgrep (die beste Alternative zu grep)

Vorwort Apropos Textsuchtools: Jeder sollte grep ...

So zeigen Sie in CocosCreator eine Textur an der Wischposition an

Inhaltsverzeichnis 1. Projektanforderungen 2. Dok...

React implementiert Endlosschleifen-Scrollinformationen

In diesem Artikel wird der spezifische Code von R...

Zusammenfassung der Methoden zum Bereinigen von Mysql general_log

Methode 1: GLOBAL festlegen general_log = "A...

MySQL-Datenbank Shell import_table Datenimport

Inhaltsverzeichnis MySQL Shell import_table Daten...

MySQL 8.0.25 Installations- und Konfigurations-Tutorial unter Linux

Das neueste Tutorial zur Installation von MySQL 8...

Detaillierte Erklärung der HTML-Style-Tags und der zugehörigen CSS-Referenzen

HTML-Style-Tag Stil-Tag - Verwenden Sie dieses Ta...

CentOS 7.5 stellt Varnish-Cache-Serverfunktion bereit

1. Einführung in Varnish Varnish ist ein leistung...

MySQL-Indexoptimierung: Detaillierte Einführung in die Paging-Erkundung

Inhaltsverzeichnis MySQL-Indexoptimierung – Pagin...

Umfassende Zusammenfassung zu MySQL GTID

Inhaltsverzeichnis 01 Einführung in GTID 02 Wie G...

So zeigen Sie historische Befehle in Linux an und führen sie aus

Historische Befehle anzeigen und bestimmte Befehl...