次の疑問3では、試しにDockerコンテナtest0001上で「yum update -y」を実行し、Dockerコンテナ内のパッケージを更新してみましょう。以下は、Dockerコンテナ上で操作します。
bash-4.1# yum update -y ... ... libgcc_s.so.1(GCC_3.0) is needed by (installed) groff-1.18.1.4-21.el6.i686 libgcc_s.so.1(GCC_3.3.1) is needed by (installed) libnih-1.0.1-7.el6.i686 You could try running: rpm -Va --nofiles --nodigest Your transaction was saved, rerun it with: yum load-transaction /tmp/yum_save_tx-2016-02-17-05-43JuAfXA.yumtx
なにやらrpmコマンドに関連する警告メッセージのようなものが表示され、パッケージが更新できないはずです。64ビットのホストOS上で動く32ビットのOS環境のコンテナにおいてyumコマンドでパッケージをアップデートしようとすると、yumコマンドは、アーキテクチャが32ビットと64ビット両方に対応できるようになっている設定ファイルの仕組みによって、64ビット版のパッケージを入手しようとするため、パッケージが対応するCPUアーキテクチャに不一致が起こり、yumコマンドが終了してしまうのです。
64ビットのホストOS上で稼働する32ビット版のCentOSのDockerコンテナにおいて、アプリケーションを32ビットとして実行するには、「linux32」コマンド(linux32は、setarchコマンドのシンボリックリンク)を先頭に付与し、32ビットアーキテクチャを明示的に指定する必要があります。では、yumコマンドにlinux32を付与して実行し、確認してみます。
bash-4.1# linux32 yum update -y Loaded plugins: fastestmirror ... ... Complete! bash-4.1#
無事、32ビット版のRPMパッケージをインターネットから入手し、稼働中の32ビット版のCentOS 6のDockerコンテナのパッケージをアップデートできました。このように、linux32を付与すれば、64ビットのホストOS上でも、32ビット版のDockerコンテナで32ビット版のコマンドを実行できます。linux32(実体はsetarchコマンド)は、unameコマンドの出力を変更するユーティリティであり、Docker環境に限らず、64ビット環境で32ビットアプリを実行する場合に利用されます。
旧システムからの移行や古いアプリを稼働させる場合、できるだけ手間を省いて改変を少なくしたいものです。このままでは、linux32コマンドを付与するようにアプリやスクリプトを改変する必要があります。これでは、移行に関する手間が非常に増えてしまいます。
そこで、以下のように、Dockerコンテナの起動時に、「/bin/bash」を起動するのではなく、「/usr/bin/linux32 /bin/bash」を指定します。これにより、32ビットのDockerコンテナ内でlinux32コマンドを付与せずに、CPUアーキテクチャに依存するコマンドを実行できます。
# docker run -it --rm --name test0002 tenforward/centos-i386 /usr/bin/linux32 /bin/bash bash-4.1# getconf LONG_BIT 32 bash-4.1# yum update -y ... ... Complete! bash-4.1#
Dockerコンテナの起動時にCPUアーキテクチャを明示的に指定するlinux32を付与すれば、Dockerコンテナのユーザー側に対して、CPUアーキテクチャに依存する追加の操作やスクリプト、アプリの改変の負担を減らせます。
Copyright © ITmedia, Inc. All Rights Reserved.