前回の記事でホストOSのディレクトリをコンテナに見せる方法を紹介しましたが、DockerはOSのベースイメージ以外にも、データ専用のコンテナを作成出来ます。
例えばアプリケーションが参照するデータをデータ専用コンテナに保存しておくことで、以降次々に生成されるコンテナでデータの再利用が出来るようになり、使い勝手が格段に上昇します。
今回は、その手順を紹介します。
データ専用コンテナの作成
データ専用コンテナにはOSイメージではなく、busyboxと呼ばれるイメージを利用します。busyboxは、標準UNIXコマンドの主要コマンド群を単一のbusyboxコマンドにまとめたものであり、必要最低限のシェル環境を提供する場合によく利用されます。
busybox イメージの入手
まず、busyboxのイメージをdocker image pullで入手します。
1 |
# docker image pull busybox:latest |
データ専用コンテナの作成
/data01ディレクトリを提供するコンテナ datacon01 を作成します。
docker run コマンドに -v フラグをつけて実行すると Data Volume が追加されます。なお、今回の説明では一つにしていますが -v フラグは複数指定することが可能で、複数の Data Volume をマウントすることができます。
1 |
# docker container run -it -v /data01 --name datacon01 busybox /bin/sh |
データボリュームについて
以下は、通常のコンテナとデータ専用コンテナのファイル階層の違いと、両者の関係性を簡単に表した図です。
データ専用コンテナを使うことでストレージ・ドライバのオーバーヘッド(余計な処理)をなくすことも出来ます。
busyboxで使えるコマンドの確認
作成したコンテナ上でbusyboxコマンドを入力するとbusyboxで利用できるコマンドの一覧を確認することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
/ # busybox BusyBox v1.31.1 (2019-10-28 18:40:01 UTC) multi-call binary. BusyBox is copyrighted by many authors between 1998-2015. Licensed under GPLv2. See source distribution for detailed copyright notices. Usage: busybox [function [arguments]...] or: busybox --list[-full] or: busybox --show SCRIPT or: busybox --install [-s] [DIR] or: function [arguments]... BusyBox is a multi-call binary that combines many common Unix utilities into a single executable. Most people will create a link to busybox for each function they wish to use and BusyBox will act like whatever it was invoked as. Currently defined functions: [, [[, acpid, add-shell, addgroup, adduser, adjtimex, ar, arch, arp, arping, ash, awk, base64, basename, bc, 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, i2ctransfer, 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, more, mount, mountpoint, mpstat, mt, mv, nameif, nanddump, nandwrite, nbd-client, nc, netstat, nice, nl, nmeter, nohup, nologin, 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, svok, swapoff, swapon, switch_root, sync, sysctl, syslogd, tac, tail, tar, taskset, tc, tcpsvd, tee, telnet, telnetd, test, tftp, tftpd, time, timeout, top, touch, tr, traceroute, traceroute6, true, truncate, ts, tty, ttysize, tunctl, ubiattach, ubidetach, ubimkvol, ubirename, ubirmvol, ubirsvol, ubiupdatevol, udhcpc, udhcpc6, 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 |
これだけ揃っていれば色々な使い道がありますね。後ほどlsやechoコマンドを利用しますが、もちろん含まれています。
テスト用ファイルの作成
作成されたコンテナdatacon01のコマンドライン上で、空の/data01 ディレクトリが自動的に作成されていることを確認し、テスト用のファイルtestfile01.txtを作成します。
1 2 3 |
/ # ls -a /data01 . .. / # echo "This is a test file." > /data01/testfile01.txt |
別のコンテナからディレクトリを参照
データ専用のコンテナdatacon01のコマンドラインをexitコマンドで離脱し、別のコンテナ testcon01からコンテナdatacon01の/data01ディレクトリを利用します。
–volumes-from フラグをつけることで指定したコンテナのボリュームをマウントしてコンテナを起動することができますので、–volumes-from datacon01 が追加されていることに注目してください。
※今回はあらかじめ準備していた、centos イメージを使っていますが、取得していなければ、docker image pull centos:latest で取得してください。
1 2 3 4 5 6 |
/ # exit # docker run -it --volumes-from datacon01 --name testcon01 docker.io/centos:latest /bin/bash [root@680311d61425 /]# cat /data01/testfile01.txt This is a test file. |
別のコンテナからディレクトリ内にデータを作成する
データを作成することが可能なことを確認します。
1 2 3 4 |
[root@680311d61425 /]# echo "This is the second test file." > /data01/testfile02.txt [root@680311d61425 /]# cat /data01/testfile02.txt This is the second test file. |
補足 Read Only にするには
–volumes-from フラグのオプションに :ro を指定することで、ボリュームを読み取り専用としてマウントすることができます
1 |
# docker run -it --volumes-from datacon01:ro --name testcon01 docker.io/centos:latest /bin/bash |
以上でDockerのテクニック、「データ専用コンテナ」の説明を終わります。