コンテナ技術を活用し、複数の機能をひとつのハードウェア上に手早く統合できるソフトウェア・プラットフォーム「Docker」をご存知でしょうか。ひとつの組み込みLinuxシステム上に複数のアプリケーションを統合するためには、開発されたLinuxディストリビューションの違いや、実装された時期(Linuxディストリビューションのバージョン)の違い、ネットワークをはじめとする各種環境設定を揃えなければならないことから、移植作業や実行環境移行作業として大きな開発工数が発生します。Dockerは、アプリケーションと実行環境をペアで管理し、セットでデプロイすることのできる「コンテナ」を提供するソフトウェアです。Dockerを採用することにより、異なるLinuxディストリビューション、異なるバージョン、異なる実行環境で動作しているLinuxアプリケーションを、ひとつのハードウェア上へ簡単に統合することができます。
今回の初心者講座では、組み込みシステムにDockerを採用することのメリットと、その活用例を前半で紹介。後半はWind River Linux開発環境におけるDockerの使い方を解説いたします。
8本すべて無料!組み込みLinuxウェビナー
組み込みLinuxの基礎知識から、Docker/コンテナ技術の開発方法、さらには起動シーケンスを理解し、実際のLinuxアプリ開発も学べる。開発デモはRaspberry Pi 4を使用しているので、受講後すぐにお試しいただくことで可能です。
視聴申込はこちらから
はじめてのDocker|仕組みとメリット
Docker/コンテナ技術が求められる背景
組み込みシステムの1つの機能の裏には、1つのLinuxアプリケーションが動作しています。そしてLinuxアプリケーションの動作は、アプリケーションに加えて、そのアプリケーションを実行するLinuxディストリビューションの構成や設定によって決まります。そのため、アプリケーションが同じであっても、Linuxディストリビューションが異なれば、動作が変化します。ひとつ例を挙げると、WEB機能を提供するアプリケーションは、ネットワーク設定が異なれば外部からのアクセス方法が変化しますし、ストレージ内に保管されているデータが異なればサービス利用者から見えるコンテンツが変化します(図1)。
近年、あらゆる分野への活用が期待されているエッジコンピューティング/機械学習系のアプリケーションの多くは、PythonやPythonのライブラリの支援を強く受け、様々なファイルと連動しています。そのため、実行環境の変化に影響を受けやすいアプリケーションといえます。こうしたアプリケーションを検証する場合は、出来る限り本番環境と同等の実行環境を早くから準備・構築し、Linuxディストリビューションの構成変化に対して細心の注意を払って開発する必要があります。
以上の理由から、異なるLinuxディストリビューション上で動作していた複数のアプリケーションを、ひとつのLinuxディストリビューション上に統合する移植作業が大変な作業となることがままあります。同じLinuxディストリビューション間(例:CentOS)の移植であったとしても、バージョンの異なるCentOS7.xとCentOS6.xでは管理機能や各種ライブラリのバージョンが異なるため、アプリケーションが同じ動作をする保証はありません。とりわけ、“過去の開発資産を流用するだけ“と考えているコンポーネントの開発には注意が必要です。特に近年の組み込みシステムは高度化/高付加価値化が進んでおり、多数のLinuxアプリケーションを同梱することから、見えない開発工数が無数に潜んでいると言えます(図2)。そのため、組み込みシステムをスムーズに開発してより早くリリースするためには、Linuxを採用することに加え、開発効率を向上させるための策が必要です。
こうした課題を解決するソフトウェア・プラットフォームがDockerです。Dockerは、アプリケーションと実行環境をペアで管理する「コンテナ」を提供するソフトウェア・プラットフォームです。コンテナには実行環境が含まれているため、アプリケーションの動作を変化させることなく、Dockerがサポートするすべてのシステムへ簡単に移植することができます(図3上)。
図3で、Dockerを使ってアプリケーションを移植する流れを説明いたします。まず、①Dockerを使ってアプリケーションの実行に必要なソフトウェア基盤「Dockerコンテナイメージ」を取得し、開発者が移植したいアプリケーションを封入します。Dockerコンテナイメージはクラウド・サービスから入手することもできますし、自身で構築することも可能です。この手順で作成したDockerコンテナイメージを実行環境へ移植します。実行環境では、②Dockerの実行を管理する「Dockerエンジン」がDockerコンテナイメージをホストとなるLinux上に展開、③「Dockerコンテナ」が起動します。④Dockerコンテナ内のアプリケーションがアクションを起こすと、対応するホストLinuxの機能が実行されます。⑤コンテナは、それぞれがアプリケーションの動作に最適な実行環境と設定値を保持しているため、各コンテナは別のコンテナの影響を受けることなく動作します。これにより、⑥すべてのコンテナをひとつのLinuxディストリビューション、ひとつのハードウェア上で実行することができます。
組み込みLinux入門に最適な1冊
「市場投入までの期間の短縮」「サポートとメンテナンスコストの削減」「コンプライアンス問題への対応」「クラウドネイティブアーキテクチャとコンテナ技術」など、気になるTopicsを網羅したeBookが無料でダウンロードできます。是非ご覧ください。 無料のeBookをダウンロード
Dockerを導入する大きなメリット
続いて、組み込みシステムにDockerを導入することの大きなメリットを2つピックアップして紹介いたします。
CentOSやUbuntu用のアプリを組み込みデバイスへ簡単に統合できる
オープンコミュニティが活発化している現在、著名なLinuxディストリビューションであるCentOSやUbuntu向けに、様々なアプリケーションが開発されています。Dockerは、CentOSやUbuntuに相当する実行環境として、Dockerコンテナイメージ「CentOS」「Ubuntu」をオンラインのパブリック・リポジトリ「Docker Hub」にて配布しています。これらのDockerコンテナイメージはダウンロードするだけですぐに利用可能です。またソフトウェアプラットフォームの役割を担うnginxやMongoDBといったDockerコンテナイメージも配布されています。まずアプリケーションの実行環境に適したDockerコンテナイメージを入手し、これらの上で動作するアプリケーションを組み込むことにより、どの環境にも持ち運ぶことができるアプリケーションのコンテナを作成することができます(図4)。
本記事の後半にて紹介するWind River LinuxによるDockerの実行環境を構築することにより、Wind River Linuxが生成したLinuxディストリビューション上で動作していたアプリケーションはもちろんのこと、CentOS上で動作していたアプリケーションと、Ubuntu上で動作していたアプリケーションを移植作業や設定作業なしに、ひとつのLinuxディストリビューション上に共存させることができます(図5)。
試作・テスト・本番環境のすべてにおいてミスなくアプリケーションを検証・運用できる
先に述べたように、Linuxアプリケーションの挙動は実行環境の違いによって変化します。そのため、試作、開発、品質保証、テストにおいてはアプリケーションのソースコードに加えて、実行環境の設定や構成を正しく設定し、すべてを記録して、次の開発フェーズへと引き継ぐ必要があります。Docker以前の環境では、それぞれの開発フェーズにて開発者が設定値を個々に設定していましたが、最新の注意を払っていたとしてもミスが発生することはあります(図6上)。Dockerを活用することにより、アプリケーションに加えて、その実行環境の設Docker以前の環境では、それぞれの開発フェーズで開発者が設定値を個々に設定していたため、最新の注意を払っていたとしてもミスが発生していました(図6上)。そこで、Dockerを活用することにより、アプリケーションに加えて、その実行環境の設定値までを含んだ構成をDockerコンテナイメージとして確定させ、試作環境・開発環境・テスト環境・本番環境のすべてに対して、ミスなく同じ構成をデプロイすることができます。繰り返しの環境設定作業、設定値の検証漏れ、デプロイ時の設定間違いといった雑多な問題に振り回されることなく、スムーズに開発を進めることができるのです(図6下)。
Dockerの活用事例|こんなに便利!
組み込みシステムにDockerを利用することによって、別々の環境で動作していたアプリケーションやユーティリティを統合し高機能な組み込みシステムを実現します。例えば、Python2.x系で動作するハードウェア制御アプリケーションと、Python3.x系で動作する機械学習アプリケーション、加工したデータを保持するMongoDBを使ったデータベース、ユーザにリッチなUIを提供するNginxベースのWEBアプリケーションをひとつの環境に統合し、高機能なエッジコンピューティング・デバイスを短期間で開発できるようになります。
Dockerを利用することにより、Pythonの環境を合わせなければならないといった制約や、各アプリケーションが依存するライブラリが異なる場合も、それらの違いを意識することなく統合可能です(図7)。また、Dockerコンテナイメージを取得するだけで各アプリケーションを実行できることから、機械学習の知識は備えているがデータベースの環境構築をしたことがないといった開発メンバーも、手順を誤ることなく手早くデータベース・アプリケーションを起動することができます。
他のアプリケーション統合手法との違い
異なるOS環境で動作しているアプリケーションをひとつのハードウェア上へと統合する手法のひとつに、仮想マシンを使ったコンソリデーションと呼ばれる手法があります。仮想マシンは、仮想的なハードウェアを生成し、そのハードウェア上でOSを実行、アプリケーションを個々のOS環境上で実行、他のアプリケーション実行環境と隔離しながら複数の実行環境を共存させる技術です。仮想マシンを使うことにより、アプリケーション間の分離性を高く保ち、幅広いOS環境で動作しているアプリケーションを共存させることができます。一方でアプリケーションを実行するためだけに、ホストOSとは別にゲストOSの処理や仮想化デバイス、また一部のHWのエミュレーション処理等があるため、コンテナと比較すると処理にかかるオーバヘッドや各種リソースの消費量が大きくなる傾向にあります。一般的にDockerが生成するコンテナはOSのインタフェースと直接やり取りするため、仮想マシン方式と比較して実行オーバヘッドやリソースの消費量を抑えることが可能です(図8)。
Raspberry Pi 4の組み込みLinux上でDockerを実行する
ここからは、Wind River Linuxを使ってDockerを内蔵したLinuxディストリビューションを実行し、Docker Hubより入手したOS環境を提供するDockerコンテナイメージを、コンテナとして実行する手順を解説いたします。すべての手順は動画でも紹介しています。併せてご覧ください。
Docker実行環境の概要
Wind River Linuxが生成するLinuxディストリビューションにDockerを組み込むことは非常に簡単です(図9)。①Wind River Linuxは 第4回で解説したWRTEMPLATE機能 により、設定ファイルに「feature/docker
」と追記するだけで、生成するLinuxディストリビューションにDockerをインストールすることができます。設定ファイルの変更後、bitbakeコマンドによりDocker入りのLinuxディストリビューションを生成し、ビルド結果をデプロイします。今回はターゲットとしてRaspberry Pi 4を使いますので、起動用micro SDカードにDocker入りのLinuxディストリビューションをデプロイします。その後、②実行したいDockerコンテナイメージを「docker image pull
」コマンドを使って入手し、③最後に「docker container run
」すると、④DockerコンテナイメージのインスタンスとしてDockerコンテナを実行することができます。
Wind River Linuxの生成する組み込みLinuxディストリビューションにDockerをインストールする
Raspberry Pi 4起動用のmicro SDカードを準備する
最初に、Raspberry Pi 4用の起動用micro SDカードを準備します。Raspberry Pi 4向けmicro SDカードの初期化方法は「micro SDの初期化方法」をご参照ください。
Wind River Linux開発環境を入手する
続いて、開発用PC上にWind River Linux開発環境をダウンロードします。下記のコマンドを実行してください。
# 現在の作業ディレクトリ $ pwd /home/aps/my-project # bcm-2xxx-rpi4を指定しRaspberry Pi専用ソースコードを取得する $ ./wrlinux-x/setup.sh --machines bcm-2xxx-rpi4 # Raspberry Pi向けLinuxディストリビューションの開発を開始する $ . ./environment-setup-x86_64-wrlinuxsdk-linux # プロジェクト「cui-docker」を作成する(名前は任意) $ . ./oe-init-build-env cui-docker # 自動的にプロジェクトディレクトリに移動する $ pwd /home/aps/my-project/cui-docker # ディレクトリには設定ファイルが含まれている $ ls conf bblayers.conf local.conf templateconf.cfg
設定ファイルを変更し、Dockerを含むLinuxディストリビューションを生成する
次に、Wind River Linuxのコンフィグファイル(conf/local.conf
)を変更し、生成されるLinuxディストリビューションにDockerが含まれるよう設定します。
$ vi conf/local.conf (以下の3行を更新する) # (3) 必要なパッケージをネットワークを使ってダウンロードする BB_NO_NETWORK ?= '1' → BB_NO_NETWORK ?= '0' # (1) グラフィックユーザーインタフェースの機能を追加する WRTEMPLATE ?= "" → WRTEMPLATE ?= "feature/docker" # (2) ベースとなるディストリビューションを選択する DISTRO ??= "wrlinux"
上記の設定後、コマンド「bitbake wrlinux-image-glibc-std
」を実行し、Raspberry Pi 4向けのLinuxディストリビューションを生成します。生成されたLinuxディストリビューションは「tmp-build/deoloy/image
」フォルダへ格納されます。「 micro SDへのイメージ書き込み」を参考に、LinuxディストリビューションをRaspberry Pi 4起動用micro SDカードへインストールしてください。
Raspberry Pi上で起動した組み込みLinuxに、Dockerがインストールされていることを確認する
Raspberry Pi 4にmicro SDカードを挿入しボードへ給電すると、起動画面の後、ターミナルが表示されます。ユーザー名はデフォルト値の「root」パスワードは無しでログインすることができます。まず、ログインしたターミナルでDockerが正しくインストールされているかを確認します。コマンド「docker info
」と「docker version
」を実行するとインストールされているDockerの情報を取得できます(図10)。なお、conf/local.conf
にfeature/docker
を指定せずbitbakeを実行した場合は、LinuxディストリビューションにDockerが組み込まれないためdocker
コマンドはエラーとなります。
Wind River Linux × Docker環境で CentOS、UbuntuのDockerコンテナを起動する
以上の手順で組み込みLinux上にDockerをインストールすることができました。続いて、LinuxディストリビューションであるCentOS/UbuntuをDockerコンテナとして実行してみましょう。
Dockerコンテナイメージを入手して実行する
Dockerを使ってアプリケーションの実行環境を整備するには、はじめにアプリケーションの実行プラットフォームとなるDockerコンテナイメージを入手します。まず、実行プラットフォームとして「CentOS」と「Ubuntu」のDockerコンテナイメージを入手し、実行してみましょう。 Docker Hubを使って検索したCentOSとUbuntuのDockerコンテナイメージを「docker image pull
」コマンドを使って取得します。取得後、「docker container run
」コマンドによりコンテナとして起動します。これにより、世界中で無数に配布されているCentOSやUbuntuの開発資産を、手間なくRaspberry Pi 4上で実行できます。
# CentOS/UbuntuのDockerコンテナイメージをDocker Hubから取得する $ docker image pull centos $ docker image pull ubuntu # CentOSのコンテナを2個、Ubuntuのコンテナを1個生成する # [Ctrl+Alt+F1] でターミナルを切り替える $ docker container run -it --name MyCentOS1 centos /bin/bash # [Ctrl+Alt+F2] でターミナルを切り替える $ docker container run -it --name MyCentOS2 centos /bin/bash # [Ctrl+Alt+F3] でターミナルを切り替える $ docker container run -it --name Ubuntu1 centos /bin/bash # [Ctrl+Alt+F3] で動作中のコンテナを終了する $ exit #[Ctrl+Alt+F6] でターミナルを切り替える $ docker ps # MyCentOS1、MyCentOS2のコンテナが表示される $ docker ps -a # MyCentOS1、MyCentOS2のコンテナに加え、終了したUbuntu1が表示される
CUIモードのLinuxで複数のターミナルを開くには
「docker container run...
」の実行中に「docker ps
」等のコマンドでコンテナの状態を確認するには、複数のターミナルが必要となります。GUI版のLinuxディストリビューションでは右クリックで複数のターミナルを立ち上げることができます。CUI版のLinuxディストリビューションを利用している場合は「Ctrl+Alt+F1」〜「Ctrl+Alt+F6」を入力することにより最大6個のターミナルを切り替えて使うことができます(図11)。
コンテナを終了し、Dockerコンテナイメージを削除する
コンテナを終了した後に、下記のコマンドを実行することでDockerコンテナイメージを削除できます。Docker Hubより様々なDockerコンテナイメージをダウンロードし、試し、自社の開発にフィットしなければ削除、といった流れで自社製品に最適なコンテナ環境を選択していきましょう。
# 実行中のコンテナを表示する $ docker container ls # 終了済みのコンテナを含めて表示する $ docker container ls -a # コンテナを削除する $ docker container rm <コンテナID> # Dockerコンテナイメージ「ubuntu」を削除する $ docker image rm ubuntu
Wind River Linux × Docker環境で Wind River LinuxのDockerコンテナを起動する
本初心者講座にて扱っているWind River LinuxもDockerコンテナイメージとしてDocker Hubにて配布されており、簡単に利用可能です。これにより、Wind River Linuxをベースに開発されたアプリケーションも、コンテナ化して、優れた移植性を達成可能です。Wind River LinuxのDockerコンテナイメージはDocker Hubにて「wrlx-image」として配布されています(図12)。
Wind River LinuxのDockerコンテナイメージ|Docker Hub
$ docker pull windriver/wrlx-image:full-rpi4-10.20.33.0 $ docker run -i -t windriver/wrlx-image:full-rpi4-10.20.33.0 /bin/bash ... bash-5.0# cat /etc/os-release ID=wrlinux-graphics NAME="Wind River Linux development" VERSION="10.20.33.0" VERSION_ID=10.20.33.0 PRETTY_NAME="Wind River Linux development 20.33"
組み込みLinux入門に最適な1冊
「市場投入までの期間の短縮」「サポートとメンテナンスコストの削減」「コンプライアンス問題への対応」「クラウドネイティブアーキテクチャとコンテナ技術」など、気になるTopicsを網羅したeBookが無料でダウンロードできます。是非ご覧ください。 無料のeBookをダウンロード
まとめ
今回の初心者講座では、組み込み開発の現場でリアルな課題となっている「ソフトウェアの移植性の向上」「環境構築コストの削減」に焦点を当て、コンテナ技術を活用したソフトウェア・プラットフォーム「Docker」による解決策を紹介しました。Wind River Linuxは各製品に最適なLinuxディストリビューションを生成できるため、Dockerを使って世界中の開発資産を取り込みながら、必要な機能以外を削除しコンパクトで軽量に動作する組み込みLinux製品を簡単に実現可能です。是非、製品に導入する機能のひとつとして検討してみてください。
次回の初心者講座では、Linuxの起動シーケンスを解説。Wind River Linux上で動作するアプリケーションの実装方法について紹介いたします。
Wind River Linuxについて
Wind River Linux®は、商用組み込みLinuxマーケットシェアNo.1!※の業界最先端の組み込みLinux開発プラットフォームです。最大15年の長期サポートや継続的デリバリーにも対応し、信頼性の高いエッジデバイスの開発を支援します。
※出典:VDC Reserch The Global Market IoT & Embedded Operating Systems (2018)
Wind River Linux 製品ウエブサイト Wind River Linux 製品カタログ Wind River Linux ダウンロード
Wind River Linux インタビュー記事
Wind River Linuxが誕生して15年となる。Wind River Linux誕生の背景やこれまでの取り組み、採用事例などについて話を聞いた。
Wind River Linux インタビュー記事
- CentOSは、CentOS ltd.の商標または登録商標です。
- Debianは、Software in the Public Interest, Inc. の登録商標です。
- Docker は、米国およびその他の国における Docker Inc.の登録商標又は商標です。
- Linuxは、Linus Torvaldsの米国およびその他の国における商標または登録商標です。
- MongoDBは、MongoDB Inc.の商標または登録商標です。
- Raspberry PiはRaspberry Pi財団の登録商標です。
- Ubuntuは、Canonical Ltd.の商標または登録商標です。
- Wind RiverおよびVxWorksはWind River Systems, Inc.の登録商標です。
- その他記載の会社名、製品名は、それぞれの会社の商標または登録商標です。
こちらも是非
“もっと見る” 初心者講座
はじめての公開鍵署名|署名検証のプログラムをサクッと試してみる
公開鍵署名(Public Key Signature)は、デジタル署名の一種で、公開鍵暗号方式を用いた署名方法です。公開鍵署名は、電子メールのセキュリティ、ソフトウェアやファームウェアに対する署名、オンライン取引など、多くのセキュリティが必要なアプリケーションで広く使用されています。