Dockerはbusyboxを使用してベースイメージを作成します

Dockerはbusyboxを使用してベースイメージを作成します

Docker イメージの最初の行は FROM alpine などのイメージで始まりますが、最初のベース イメージはどのように作成されるのでしょうか。この記事では、busybox を使用してベース イメージを作成します。このプロセスで、Docker に関連するいくつかの概念をさらに理解できるようになると思います。

ベースイメージとは何ですか?

簡単に言えば、ベース イメージとは、From または FROM スクラッチで開始されない Dockerfile によって構築されたイメージです。例えば、アルパイン、この非常に小さなLinuxイメージはわずか4M程度です

[root@kong ~]# docker イメージ |grep alpine
docker.io/alpine-latest 3fd9065eaf02 4 か月前 4.15 MB
[root@kong ~]#

Dockerfile は非常にシンプルで、基本的なイメージである 3 行だけです。

ゼロから
rootfs.tar.xz を追加 /
コマンド ["/bin/sh"]

次の記事では、alpine のような独自のベースイメージを作成します。

ビジーボックス

まとめ

Busybox は、組み込み Linux のスイス アーミー ナイフと呼ばれています。この文は、busybox が自己紹介したときに提唱されました (組み込み Linux のスイス アーミー ナイフ)。 busybox は、Unix の多くの小さな共通機能を小さな実行ファイルに統合します。つまり、Unix または Linux でよく使用されるすべての機能をここで見つけることができますが、busybox の目標である組み込み Linux にとって、サイズは busybox にとって非常に重要な最適化要因であり、制限です。これらの機能は削減される可能性がありますが、一般的なニーズには十分です。 Alpine は、busybox をベースに独自のパッケージ管理ツール apk やその他の機能を追加し、小型で人気のあるイメージを作成します。 BusyboxはGPLに基づいてC言語で開発されたオープンソースプロジェクトです。現在の安定バージョンは1.28.4です。

ホストマシン

[root@kong ~]# uname -a
Linux kong 3.10.0-693.el7.x86_64 #1 SMP 火曜 8月 22日 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
[root@kong ~]# cat /etc/redhat-release 
CentOS Linux リリース 7.4.1708 (コア) 
[root@kong ~]#

ビジーボックスをダウンロード

最新のバイナリバージョンは 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
busybox.net (busybox.net) を解決しています... 140.211.167.122
busybox.net (busybox.net)|140.211.167.122|:443 に接続しています... 接続されました。
HTTP リクエストが送信されました。応答を待っています... 200 OK
長さ: 1001112 (978K)
保存先: 'busybox-x86_64'
100%[=======================================================================================================================================================================>] 1,001,112 30秒で19.3KB/秒  
2018-05-25 04:51:57 (32.4 KB/秒) - 'busybox-x86_64' が保存されました [1001112/1001112]
[root@kong ~]#

ビジーボックスの設定

[root@kong ~]# cp busybox-x86_64 /usr/local/bin/busybox
[root@kong ~]# chmod +x /usr/local/bin/busybox
[root@kong ~]# どのビジーボックス
ローカル
[root@kong ~]#

バージョン確認

busybox と入力すると、バージョンと使い慣れた Linux ツールが表示されます。よく見ると、busybox が自らをスイス アーミー ナイフと呼ぶのは誇張ではないことがわかります。逆に、スイス アーミー ナイフが Linux で敢えて busybox を名乗ると、論争を引き起こす可能性があります。

[root@kong ~]# ビジーボックス
BusyBox v1.28.1 (2018-02-15 14:34:02 CET) マルチコールバイナリ。
BusyBox は、1998 年から 2015 年まで多くの著者によって著作権が保護されています。
GPLv2ライセンス。詳細についてはソース配布を参照してください。
著作権表示。
使用法: busybox [関数 [引数]...]
  または: busybox --list[-full]
  または: busybox --install [-s] [DIR]
  または: 関数 [引数]...
  BusyBoxは、多くの一般的なUnixの
  ユーティリティを1つの実行ファイルにまとめます。ほとんどの人は
  使用したい機能ごとにbusyboxへのリンクとBusyBox
  呼び出されたときと同じように動作します。
現在定義されている関数:
  [, [[, acpid, add-shell, addgroup, adduser, adjtimex, arch, arp, arping, ash, awk, base64, basename, beep, blkdiscard, blkid,
  blockdev、bootchartd、brctl、bunzip2、bzcat、bzip2、cal、cat、chat、chattr、chgrp、chmod、chown、chpasswd、chpst、chroot、chrt、
  chvt、cksum、clear、cmp、comm、conspy、cp、cpio、crond、crontab、cryptpw、cttyhack、cut、date、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、find、findfs、flock、fold、free、freeramdisk、fsck、
  fsck.minix、fsfreeze、fstrim、fsync、ftpd、ftpget、ftpput、fuser、getopt、getty、grep、groups、gunzip、gzip、halt、hd、hdparm、
  head、hexdump、hexedit、hostid、hostname、httpd、hush、hwclock、i2cdetect、i2cdump、i2cget、i2cset、id、ifconfig、ifdown、
  ifenslave、ifplugd、ifup、inetd、init、insmod、install、ionice、iostat、ip、ipaddr、ipcalc、ipcrm、ipcs、iplink、ipneigh、
  iproute、iprule、iptunnel、kbd_mode、kill、killall、killall5、klogd、last、less、link、linux32、linux64、linuxrc、ln、loadfont、
  loadkmap、logger、login、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、その他、mount、mountpoint、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、
  remove-shell、renice、reset、resize、resume、rev、rm、rmdir、rmmod、route、rpm、rpm2cpio、rtcwake、run-init、run-parts、
  runlevel、runsv、runsvdir、rx、script、scriptreplay、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、
  時間、タイムアウト、トップ、タッチ、tr、traceroute、traceroute6、true、切り捨て、tty、ttysize、tunctl、ubiattach、ubidetach、ubimkvol、
  ubirename、ubirmvol、ubirsvol、ubiupdatevol、udhcpc、udhcpd、udpsvd、uevent、umount、uname、unexpand、uniq、unix2dos、unlink、
  unlzma、unshare、unxz、unzip、uptime、users、usleep、uudecode、uuencode、vconfig、vi、vlock、volname、w、wall、watch、watchdog、
  wc、wget、which、who、whoami、whois、xargs、xxd、xz、xzcat、yes、zcat、zcip
[root@kong ~]

ルートファイルシステムを作成する

この図はミラーリングの基本を紹介するときに何度も見てきました。rootfsはLinuxでは重要な概念であり、alpineにもADD rootfs.tar.xzのような文があります。次に、簡単なrootfsを生成する方法を学びます。

ディレクトリを作成して入力

[root@kong ~]# mkdir rootfs
[root@kong ~]# cd rootfs/
[root@kong rootfs]#

ルートファイルシステムを作成する

次の文を実行します

`busybox --list-modules` のモジュールの場合
する
 mkdir -p `dirname "$module"`
 ln -sf /bin/busybox "$module"
終わり

実行ログ

[root@kong rootfs]# `busybox --list-modules` 内のモジュール
> 行う
> mkdir -p `dirname "$module"`
> ln -sf /bin/busybox "$module"
> 完了
[root@kong rootfs]#

結果確認

[root@kong rootfs]# ls
bin linuxrc sbin usr
[root@kong rootfs]# find . -type d
。
./usr
./usr/bin
./usr/sbin
./sbin
./bin
[root@kong rootfs]#

新しく作成した./binディレクトリにbusyboxをコピーします。

このように、上記コマンドのリンクオブジェクトが存在する

[root@kong rootfs]# cp /usr/local/bin/busybox bin/
[root@kong rootfs]# ls -l bin/busybox
-rwxr-xr-x. 1 ルート ルート 1001112 5月25日 05:27 bin/busybox
[root@kong rootfs]#

rootfs.tarを作成する

ここで相対パスに注意してください。以降の相対パスは / に展開され、新しいシステムの rootfs が作成されます。これも Linux をゼロから構築する上で重要な操作の 1 つです。

[root@kong rootfs]# tar cpf rootfs.tar .
tar: ./rootfs.tar: ファイルはアーカイブであり、ダンプされません
[root@kong rootfs]#

簡単な説明: busybox –list-modules は、busybox のすべてのモジュールを一覧表示し、これに基づいて小さな rootfs を作成します。
[root@kong rootfs]# busybox –list-modules |wc -l
389
[root@kong rootfs]#

Dockerfileを準備する

1行のDockerfileを準備する

[root@kong rootfs]# vi Dockerfile
[root@kong rootfs]# cat Dockerfile 
ゼロから
[root@kong rootfs]#

ベースイメージを作成します。特定のコンテンツが見つからなかったため、特定のイメージは作成されませんでした。また、デモンストレーションの便宜上、この記事ではここで直接 Dockerfile を作成していますが、これは良いアイデアではありません。実際にはこれを行わないでください。現在のディレクトリに 100G のファイルがある場合、非常に遅くなり、非標準的になり、無関係な項目をクリアする必要があります。

[root@kong rootfs]# docker build -t busyboxbase:latest .
ビルド コンテキストを Docker デーモンに送信しています 2.415 MB
ステップ 1/1: 最初から
 ---> 
イメージは生成されませんでした。Dockerfile は空ですか?
[root@kong rootfs]# docker イメージ |grep busyboxbase
[root@kong rootfs]#

ゼロから

From があります。この傷は引っ張れるのでしょうか? 現在のバージョンでは名前として予約されています。

[root@kong rootfs]# docker search scrap |grep 'an 明示的に空'
docker.io docker.io/scratch 明示的に空のイメージを作成します。特に... 407 [OK]    
[root@kong rootfs]# docker pull スクラッチ
デフォルトタグの使用: 最新
デーモンからのエラー応答: 'scratch' は予約名です
[root@kong rootfs]#

このDockerfileに、実用的な効果のない行を追加して、スクラッチが何であるかを確認します。

[root@kong rootfs]# vi Dockerfile 
[root@kong rootfs]# cat Dockerfile 
ゼロから
メンテナー LiuMiao <[email protected]>
[root@kong rootfs]#

ビルド後、0バイトのイメージファイルが生成されることが分かりましたが、これはスクラッチの本来の意味と一致しています。

[root@kong rootfs]# docker build -t busyboxbase:latest .
ビルド コンテキストを Docker デーモンに送信しています 2.415 MB
ステップ 1/2: 最初から
 ---> 
ステップ 2/2: メンテナー LiuMiao <[email protected]>
 ---> b118fd7c73a7 で実行中
 ---> 2074dc76c09e
中間コンテナ b118fd7c73a7 を削除しています
2074dc76c09e の構築に成功しました
[root@kong rootfs]# docker イメージ |grep busyboxbase
busyboxbase 最新 2074dc76c09e 14 秒前 0 B
[root@kong rootfs]#

この時点で、from scrapでは何も追加されないことがわかります。次に、alpineのような次の2つの文を追加します。

rootfs.tar を追加します /
コマンド ["/bin/sh"]

私たちのDockerfileにはほぼ同じ3行があります

[root@kong rootfs]# cat Dockerfile 
ゼロから
rootfs.tar を追加します /
コマンド ["/bin/sh"]
[root@kong rootfs]#

これにより、1Mのbusyboxベースのイメージが作成されます。

[root@kong rootfs]# docker build -t busyboxbase:latest .
ビルド コンテキストを Docker デーモンに送信しています 2.415 MB
ステップ 1/3: 最初から
 ---> 
ステップ 2/3: rootfs.tar を追加する /
 ---> 0fbb0c8c7579
中間コンテナ 8311e96f456c を削除しています
ステップ 3/3: CMD /bin/sh
 ---> efb85c4526bf で実行中
 ---> 02270c80a4e4
中間コンテナ efb85c4526bf を削除しています
02270c80a4e4 の構築に成功しました
[root@kong rootfs]# docker イメージ |grep busyboxbase
busyboxbase 最新 02270c80a4e4 9 秒前 1.01 MB
[root@kong rootfs]#

実行して使用する

docker runを使用すると、このイメージによって起動されたコンテナには異常がないことがわかります。

[root@kong rootfs]# docker run --rm -it busyboxbase sh
/# ホスト名
b7f9e9646746
/ # uname -a
Linux b7f9e9646746 3.10.0-693.el7.x86_64 #1 SMP 火曜 8月22日 21:09:27 UTC 2017 x86_64 GNU/Linux
/ #

まとめ

この記事では、busybox をスクラッチ メカニズムと組み合わせて使用​​して基本的な Docker イメージを作成する方法と関連する原則について説明します。この記事では、busybox バージョン 1.28.1 を使用して、1.01M の使用可能な基本イメージを作成します。スイス アーミー ナイフからスイス ネイル クリッパーに至るまで、数 K まで最適化を続けることができます。ただし、10M 未満の場合は、その後のスケーラビリティと機能性の要素を考慮する必要があります。しかし、別の観点から見ると、非常に多くの機能を統合する一方で、これらの機能の不安定な要素も統合されています。ゼロからのメカニズムを使用すると、依存関係の少ない小さなコンテキスト環境を作成するのに非常に便利です。

参考文献

https://docs.docker.com/develop/develop-images/baseimages/

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。

以下もご興味があるかもしれません:
  • alpineをベースにdockerfileで作成したtomcatイメージの実装
  • alpineをベースにdockerfileで作成したクローラーScrapyイメージの実装
  • SSHサービスをサポートするDockerイメージを作成する方法
  • Dockerイメージを作成する方法
  • DockerでMariaDBイメージを作成する方法
  • DockerでRedisイメージを作成する方法
  • Dockerでイメージを作成するためのDockerfile命令の詳細な説明
  • 公式Dockerイメージをダウンロードし、Dockerfileを使用してイメージを作成する方法
  • Docker でプライベートイメージリポジトリを作成する方法のチュートリアル
  • Dockerのローカルイメージ作成方法の分析

<<:  MySQL マスタースレーブレプリケーションの読み書き分離構造の詳細な説明

>>:  Vue でログインと登録テンプレートを実装するためのサンプルコード

推薦する

JavaScript での AOP プログラミングの基本実装

AOP の紹介AOP (アスペクト指向プログラミング) の主な機能は、コアビジネスロジックモジュール...

完全なMySQL学習ノート

目次MyISAM と InnoDBパフォーマンスの低下と SQL の速度低下の理由: MySQL 実...

相対幅と絶対幅が競合する場合の HTML+CSS div ソリューション

相対幅と絶対幅が競合する場合のdivソリューション概要: 一般的に、絶対幅を使用する場合は px を...

IE8はマルチ互換モードを使用してWebページを正常に表示します

IE8には複数の互換モードがあります。 IE プラットフォームの設計者である Chris Wilso...

HTMLウェブページのMETAタグのコンテンツを書く際のポイント

META タグは、HTML 言語のヘッダー領域にある補助タグです。作成者、日時、Web ページの説明...

Dockerコンテナのデータを復元する方法

プロジェクトのテスト環境データベースのデータが失われてしまったので、記録しておきたいと思います。当時...

Dockerイメージのインポートとエクスポートの実装

GitLabのDocker使用法gitlab ドッカー起動コマンド docker run -d -p...

Linux で Tomcat を実行するいくつかの方法の説明

Linux での Tomcat の起動とシャットダウンLinux システムでは、コマンド操作を使用し...

DockerでPython環境をパッケージ化するプロセスの詳細な説明

docker パッケージング Python 環境の手順は次のとおりです。 1 pip listの下に...

Vue elementUI フォームのネストされたテーブルと各行の検証の詳細な説明

目次エフェクト表示コードリンクキーコード表形式データコンポーネントのネスト検証方法リセット方法完全な...

Vue3 (パート 2) Ant Design Vue の統合

目次1. Ant Design Vueを統合する2. コンポーネントの使用1. 完全な引用2. コン...

Dockerは起動されていないコンテナの設定情報を変更します

私が初めてdockerを使用したときは、dockerfileやdocker-composeを使用して...

Linux での MySQL 5.7.16 無料インストール バージョンのグラフィック チュートリアル

この記事では、参考までにMySQL 5.7.16の無料インストール版のチュートリアルを紹介します。具...

Vue ページでよりエレガントに画像を紹介する方法

目次エラーのデモンストレーション計算により画像が変わらない場合は直接インポートするCSS変数による画...

海外でダウンロードできる25個の新鮮で便利なアイコンセット

1. Eコマースアイコン2. アイコンスイーツ2 3. 携帯電話アイコンパック4. 旗アイコンセット...