コンテナ配布シナリオ
閉域環境でのコンテナ配布シナリオを考える。
何ができるか?
- 実行環境を含む、アプリケーションを配布することができる
- 環境構築なしで、アプリケーションを実行することができる(受信者)
- インターネットに接続していなくても、コンテナイメージを作成することができる
配布者は、アプリケーションに必要なパッケージや、ライブラリ等の実行環境をコンテナイメージに含める。それにより、コンテナイメージの受信者は、アプリケーションをすぐに使用することができる。アプリケーションに必要な環境は、イメージ内に含まれているため、アプリケーションに合わせて、環境構築をする必要がない。
自作のコンテナイメージは、維持管理にコストがかかるため、特別な理由が無ければ、本手順は推奨されない。
配布者
- プレーンのコンテナイメージを作成
- コンテナイメージに色付け
- コンテナをイメージとして使用できるようにファイルエクスポート
- ファイルの配布
受信者
- ファイルの受信
- 受信したファイルをイメージとして取り込み
- コンテナ起動
配布者:プレーンなコンテナイメージの作成
閉域環境を想定し、パッケージレポジトリは、自前または、ISO/DVDを使用する。事前に準備が必要である。
dnf -y install podman podman-docker
ctrt=podman
contdir=/tmp/root
imagename=alma9
mkdir ${contdir}
dnf --installroot=${contdir} --exclude=*-firmware --releasever=9 install -y @core
cd ${contdir}/dev
#mknod -m 666 null c 1 3
mkdir -m 1777 shm
mkdir -m 755 pts
mknod -m 600 console c 5 1
mknod -m 600 initctl p
mknod -m 666 full c 1 7
mknod -m 666 ptmx c 5 2
mknod -m 666 random c 1 8
mknod -m 666 tty c 5 0
mknod -m 666 tty0 c 4 0
mknod -m 666 tty1 c 4 1
mknod -m 666 tty2 c 4 2
mknod -m 666 tty3 c 4 3
mknod -m 666 tty4 c 4 4
mknod -m 666 urandom c 1 9
mknod -m 666 zero c 1 5
tar -C ${contdir} -c . | ${ctrt} import - ${imagename}
cid=$(${ctrt} run -d --privileged ${imagename} /sbin/init)
# dbus.service、systemd-journald.service以外全て落とす
cat << 'SYSCOM' | xargs -I@ ${ctrt} exec -it $cid /bin/bash -c @
systemctl stop systemd-logind.service
systemctl disable systemd-logind.service
systemctl stop system-getty.slice
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl stop rsyslog.service
systemctl disable rsyslog.service
systemctl stop systemd-hostnamed.service
systemctl disable systemd-hostnamed.service
systemctl stop NetworkManager.service
systemctl disable NetworkManager.service
systemctl stop crond.service
systemctl disable crond.service
systemctl stop sshd.service
systemctl disable sshd.service
systemctl stop systemd-udevd-control.socket
systemctl stop systemd-udevd-kernel.socket
systemctl stop systemd-udevd.service
systemctl disable systemd-udevd-control.socket
systemctl disable systemd-udevd-kernel.socket
systemctl disable systemd-udevd.service
SYSCOM
${ctrt} commit $cid ${imagename}
イメージへ色付け
コマンド単発実行
cmd='dnf -y install ruby'
${ctrt} exec -it ${cid} /bin/bash -c "${cmd}"
実際、コマンド単発実行でのイメージ構築は考えにくい。
インタラクティブに打鍵する場合
${ctrt} exec -it ${cid} /bin/bash
閉域環境と考え、レポジトリには直接繋がらないため、パッケージインストールを行う場合は、ネットワーク内にレポジトリまたは、メディアが必要となる。
ISOファイルがある場合やホストでマウントしている場合
現在、起動しているコンテナを停止し、ISO/DVDをマウントした状態で、コンテナを起動する。dnf/yumの参照レポジトリをISO/DVDに変更して、パッケージインストールを実施する。
${ctrt} stop $cid
mount -o loop *.iso /media # ISOファイルの場合
mount /dev/dvd /media # DVDマウントの場合
# マウントのマウントを避けるためコピーする
cp -pr /media/* /media2
cid=$(${ctrt} run -d -v /media2:/media:Z ${imagename})
# 他に、ファイルが必要な場合は、ボリュームを追加して、起動する
${ctrt} exec -it ${cid} /bin/bash
mkdir ~/repos
mv /etc/yum.repos.d/* ~/repos
# 必要なパッケージのディレクトリに合わせる(Minimalの例)
cat <<DVDREPO >/etc/yum.repos.d/dvd.repo
[DVD-REPO]
name=DVD
baseurl=file:///media/Minimal/
enabled=1
gpgcheck=1
gpgkey=file:///media/RPM-GPG-KEY-AlmaLinux-9
DVDREPO
# コンテナへの色付け作業
# dnf -y install ruby
exit
デーモンを扱うコンテナイメージ作成は割愛する。
コンテナをイメージとして使用できるようにファイルへエクスポート
${ctrt} export ${cid} > ~/${imagename}.tar
ls ~
${ctrt} stop ${cid}
イメージファイルの配布
エクスポートで出力したファイルを配布する。
受信者:エクスポートされたファイルを使用したコンテナイメージの使用
dnf -y install podman podman-docker
ctrtcmd=podman # podman
reponame=myalma:latest # 好きな名前
imagenamefile=alma9.tar # 受信したファイル名を指定
# ファイルをイメージとして取り込み
cat ${imagenamefile} | ${ctrtcmd} import - ${reponame}
イメージチェック/イメージの使用
## test
${ctrtcmd} run --rm ${reponame} /bin/bash -c 'ruby -v'
# => ruby 3.0.4p208
## test 2
${ctrtcmd} run -it --rm ${reponame} /bin/bash
Environment
[root@localhost ~]# cat /etc/redhat-release
AlmaLinux release 9.3 (Shamrock Pampas Cat)
[root@localhost ~]#
Reference
Docker向けのコンテナをゼロから作ってみよう | さくらのナレッジ
◀︎ Docker+Act | Podmanコマンド・使用例 ▶︎