Wind River LinuxではじめるDocker入門
本記事では、Wind River LinuxでDockerを使う方法についてご紹介します。最新のWind River LinuxはDockerを標準でサポートしていますので、バイナリイメージであるWind River Linux Distroをダウンロードするだけで、すぐにDockerを使い始めることができます。本記事ははじめに、Wind River Linux Distro を例にDockerの操作方法を解説します。次に、LATを使ってコンテナを実行できる最小構成のLinuxディストリビューションを作成する方法を紹介します。最後に、アプリケーションに最適なカスタマイズされたコンテナイメージを作成し、ローカルサーバーでイメージを公開し、コンテナを実行する方法を解説いたします。
Wind River Linuxにコンテナイメージをインストールし、
コンテナを実行する
docker hubにて配布されているDockerコンテナイメージをWind River Linux上に取得するには、docker imageコマンドを使います。今回はWind River Linux Distroのfull imageをベースOSとして利用しています。Wind River Linux Distroの実行方法は「ビルド無し!バイナリ配布で簡単にはじめるYoctoベースの組込みLinuxディストリビューション」をご参照ください。
図1:Wind River Linux DistroでDockerを利用する手順
1) Wind River Linux Ditstroをダウンロード
2) 起動したWind River Linux上でコンテナが利用するネットワークを設定
3) Docker hubからコンテナイメージ取得
4) コンテナを実行
ベースとなるOSの準備
まず、Dockerを実行するためのベースとなるOSを準備します。ここでは、Wind River Linux Distroのfull imageを利用します。ホストPCと同じネットワークにQEMU上のWind River Linux が接続できるよう、ipコマンドを使ってブリッジを生成し、qemu実行時に"-netdev bridge,id=hn0 -device virtio-net-pci,netdev=hn0,id=br0,mac=00:16:3e:3f:a3:9c"を指定し、ネットワークを有効化します。Wind River Linuxが起動した後に、ホストと同じネットワークのIPアドレスが付与されていることを確認してください。
ホストPC上での操作
$ tar jxvf target-full-bcm-2xxx-rpi4.tar.bz2
$ cd target-full-bcm-2xxx-rpi4
$ qemu-img create -f raw ./img 8G
$ zcat wrlinux-image-full-bcm-2xxx-rpi4.ustart.img.gz | sudo dd of=./img conv=notrunc
$ ip addr
2: enp0s31f6:
...
$ sudo ip address flush dev enp0s31f6
$ sudo ip link add br0 type bridge
$ sudo ip link set br0 up
$ sudo ip link set enp0s31f6 master br0
$ bridge link show
2: enp0s31f6: mtu 1500 master br0 state forwarding priority 32 cost 4
$ sudo dhclient -v br0
$ ip addr
3: br0: ...
link/ether d0:50:99:85:14:58 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.25/24 brd 192.168.100.255 scope global dynamic br0
valid_lft 604788sec preferred_lft 604788sec
$ sudo mkdir -p /etc/qemu
$ sudo vi /etc/qemu/bridge.conf
allow virbr0
allow br0
$ sudo su
# qemu-system-aarch64 -machine virt -cpu cortex-a57 -netdev bridge,id=hn0 -device virtio-net-pci,netdev=hn0,id=br0,mac=00:16:3e:3f:a3:9c -m 512 -bios qemu-u-boot-bcm-2xxx-rpi4.bin -device virtio-gpu-pci -serial stdio -device qemu-xhci -device usb-tablet -device usb-kbd -drive id=disk0,file=./img,if=none,format=raw -device virtio-blk-device,drive=disk0
Wind River Linux上での操作
bcm-2xxx-rpi4 login: root
New password:
Retype new password:
# ip addr
2: eth0: mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:16:3e:3f:a3:9c brd ff:ff:ff:ff:ff:ff
inet 192.168.100.16/24 brd 192.168.100.255 scope global dynamic noprefixroute eth0
コンテナが利用するネットワークを構築
次に、起動したWind River Linux上でDockerがインストールされていることをdocker imagesコマンドで確認します。確認後、コンテナが利用するネットワークを準備します。本手順では、ベースとなるOS(Wind River Linux)と同じネットワークに、コンテナが参加できるよう、設定しています。
Wind River Linux上での操作
# docker network create -d macvlan --subnet=192.168.100.0/24 --gateway=192.168.100.1 -o parent=eth0 corplan
a8adf511f536229263d53716d6dffd4d82bbb5567ca06c142ab1e191f0e9a5ae
# docker network ls
NETWORK ID NAME DRIVER SCOPE
89337f803b94 bridge bridge local
a8adf511f536 corplan macvlan local
2805632ea3d4 host host local
2afd1563e98f none null local
コンテナイメージのインストールと実行
続いてdocker pullコマンドを実行してdocker hubからコンテナイメージを入手します。入手したコンテナイメージはdocker imagesコマンドで確認することができます。コンテナイメージを入手したらdocker runコマンドでコンテナを実行します。実行中のコンテナはdocker psコマンドで確認することができます。以下のコマンドを実行することにより、Wind River Linux上に、Ubuntu、CentOS、Wind River Linux、3種類のコンテナイメージを取り込み、それぞれを実行、各コンテナ内でそれぞれのソフトウェアプラットフォームが機能し、ネットワークに接続されていることを確認することができます。
Wind River Linux上での操作
# docker pull windriver/wrlx-image
# docker pull ubuntu
# docker pull centos
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
windriver/wrlx-image latest 9a151b78ca87 4 days ago 105MB
ubuntu latest a7870fd478f4 3 weeks ago 69.2MB
centos latest e6a0117ec169 9 months ago 272MB
# docker run -d -it --network corplan --ip 192.168.100.101 --name wrlexec windriver/wrlx-image /bin/bash
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ffe81c663f16 windriver/wrlx-image "/bin/bash" 26 seconds ago Up 10 seconds
# docker attach ffe81c663f16
※Wind River Linuxが時刻同期できていない場合はdocker pullでcertificate has expired or is not yet validというエラーになります。
コンテナ上での操作
sh-5.1# ip addr
1: lo: ...
5: eth0@sit0: …
link/ether 02:42:c0:a8:64:65 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.101/24 brd 192.168.100.255 scope global eth0
valid_lft forever preferred_lft forever
コンテナの操作方法
コンテナから抜けるには「Ctrl+P」を押し、続けて「Ctrl+Q」を入力してください。 再度、実行中のコンテナに入るにはdocker psコマンドで確認したコンテナIDに対して、docker attachコマンドを使います。docker execコマンドを使うとコンテナに入ることなく、コマンドのみを実行することができます。 使用しないコンテナは、docker rmコマンドで削除します。不要になったコンテナイメージは、docker rmiコマンドで削除することができます。
コンテナ上での操作
sh-5.1# ls /
「Ctrl+P」「Ctrl+Q」でDockerコンテナからログアウトする
Wind River Linux上での操作
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0e1041ec91d3 windriver/wrlx-image "/bin/sh" 20 seconds ago Up 12 seconds vigilant_lehmann
# docker attach 0e1041ec91d3
コンテナ上での操作
sh-5.1# ls /
「Ctrl+P」「Ctrl+Q」でDockerコンテナからログアウトする
Wind River Linux上での操作
# docker stop 0e1041ec91d3
# docker rm 0e1041ec91d3
# docker rmi windriver/wrlx-image
LATを利用してコンテナを実行できる
最小構成のLinuxディストリビューションを作成する
先の例ではWind River Linux Distroのfull imageを利用しました。LATを使うことにより、Wind River Linux Distroのminimal imageをベースとしながらも、コンテナを実行できるDockerを備えた最小構成のLinuxディストリビューションを作成することも可能です。Linux Assembly Tools(LAT)の詳細な利用方法は、WIND RIVER LINUX DISTRO DEVELOPER'S GUIDE, LTS 22をご覧ください。
Linux Assembly Tools(LAT)の詳細な利用方法
「WIND RIVER LINUX DISTRO DEVELOPER'S GUIDE, LTS 22(日本語版)」
図2:Wind River LinuxのLATを使って、コンテナを実行できる最小構成のLinuxディストリビューションを作成する
まず、ホストPCにSDKをセットアップして、LATをインストールします。次にappsdk examplesyamlコマンドを実行し、最小構成のLinuxディストリビューションを作成するためのyaml設定ファイル「core-image-minimal-bcm-2xxx-rpi4.yaml」を入手します。その後、LinuxディストリビューションにDockerをインストールするために、yaml設定ファイルのpackagesにdockerを追記します。最後に、appsdk genimageコマンドを実行しLinuxディストリビューションを作成します。作成されたLinuxディストリビューションでコンテナを実行することができます。
ホストPC上での操作
# appsdk exampleyamls
$ mkdir mkimg
$ cd mkimg
$ appsdk exampleyamls
$ vi exampleyamls/core-image-minimal-bcm-2xxx-rpi4.yaml
name: core-image-minimal
machine: bcm-2xxx-rpi4
image_type:
- ostree-repo
- ustart
…
packages:
- alsa-utils
- ca-certificates
- crda
- glib-networking
…
- docker
$ appsdk genimage exampleyamls/core-image-minimal-bcm-2xxx-rpi4.yaml
$ cd deploy
$ qemu-img create -f raw ./img 8G
$ zcat core-image-minimal-bcm-2xxx-rpi4.ustart.img.gz | sudo dd of=./img conv=notrunc
$ sudo su
# qemu-system-aarch64 -machine virt -cpu cortex-a57 -netdev bridge,id=hn0 -device virtio-net-pci,netdev=hn0,id=br0,mac=00:16:3e:3f:a3:9c -m 512 -bios qemu-u-boot-bcm-2xxx-rpi4.bin -device virtio-gpu-pci -serial stdio -device qemu-xhci -device usb-tablet -device usb-kbd -drive id=disk0,file=./img,if=none,format=raw -device virtio-blk-device,drive=disk0
Wind River Linux上での操作
bcm-2xxx-rpi4 login: root
root@bcm-2xxx-rpi4:~#
# ip addr
1: lo: ...
2: eth0: mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:16:3e:3f:a3:9c brd ff:ff:ff:ff:ff:ff
inet 192.168.100.16/24 brd 192.168.100.255 scope global dynamic noprefixroute eth0
valid_lft 604660sec preferred_lft 529060sec
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
# docker network create -d macvlan --subnet=192.168.100.0/24 --gateway=192.168.100.1 -o parent=eth0 corplan
fc835b57c368c2a1c0c24ca60511230ef3ca68ed0e9a5b71a77d320ed09ecd52
# docker network ls
NETWORK ID NAME DRIVER SCOPE
971273bb535b bridge bridge local
fc835b57c368 corplan macvlan local
24ad33065d23 host host local
b72bf599a528 none null local
# docker pull windriver/wrlx-image
# docker run -d -it --network corplan --ip 192.168.100.101 --name wrlexec windriver/wrlx-image /bin/bash
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5d4a35aea5ab windriver/wrlx-image "/bin/bash" 12 seconds ago Up 3 seconds
# docker attach 5d4a35aea5ab
コンテナ上での操作
sh-5.1# ip addr
1: lo: mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: sit0@NONE: mtu 1480 qdisc noop qlen 1000
link/sit 0.0.0.0 brd 0.0.0.0
5: eth0@sit0: mtu 1500 qdisc noqueue
link/ether 02:42:c0:a8:64:65 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.101/24 brd 192.168.100.255 scope global eth0
valid_lft forever preferred_lft forever
「Ctrl+P」「Ctrl+Q」でDockerコンテナからログアウトする
Wind River Linux上での操作
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5d4a35aea5ab windriver/wrlx-image "/bin/bash" About a minute ago Up About a minute
# docker stop 5d4a35aea5ab
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5d4a35aea5ab windriver/wrlx-image "/bin/bash" 2 minutes ago Exited (137) 6 seconds ago wrlexec
# docker rm wrlexec
# docker rmi windriver/wrlx-image
LATを利用してコンテナイメージを作成後、
ローカルサーバーでイメージを公開し、コンテナを実行する
LATを使うことにより、カスタマイズしたWind River Linuxのコンテナイメージを作成し、作成したコンテナイメージをローカルサーバーにて公開、カスタマイズされたコンテナをダウンロードして実行することができます。
Linux Assembly Tools(LAT)の詳細な利用方法
「WIND RIVER LINUX DISTRO DEVELOPER'S GUIDE, LTS 22(日本語版)」
図3:LATを利用してコンテナイメージを作成後、ローカルサーバーで公開し、コンテナを実行するまでの流れ
1) Yaml設定ファイルを基にコンテナイメージを作成する
2) コンテナイメージをローカルサーバーに公開する
3) 組込みシステムはコンテナイメージをダウンロードする
4) ダウンロードしたコンテナイメージを実行する
yaml設定ファイルを利用してコンテナイメージを作成する
まず、ホストPCにSDKをセットアップして、LATをインストールします。次にappsdk examplesyamlコマンドを実行し、コンテナイメージを作成するためのyaml設定ファイル"container-base-bcm-2xxx-rpi4.yaml"を入手します。続いて、"container-base-bcm-2xxx-rpi4.yaml"にコンテナへインストールしたいパッケージ名を追記します。ここではHTTPサーバ機能を提供するnginxを追記しました。その後、appsdk gencontainerコマンドを実行し、コンテナイメージを作成します。作成されたコンテナイメージはdeployディレクトリにtar.gz形式で格納されます。pythonを利用してローカルサーバー上でコンテナイメージを公開し、ベースOSとなるWind River Linux上でwgetによりコンテナイメージを取得し、docker loadコマンドでコンテナイメージを取り込みます。
ホストPC上での操作
$ mkdir mkcon
$ cd mkcon
$ appsdk exampleyamls
$ vi exampleyamls/container-base-bcm-2xxx-rpi4.yaml
name: container-base
machine: bcm-2xxx-rpi4
image_type:
- container
package_feeds:
…
packages:
...
- nginx
$ appsdk gencontainer exampleyamls/container-base-bcm-2xxx-rpi4.yaml
$ cd deploy
$ pwd
/home/shino/mkcon/deploy
$ python3 -m http.server 8888 --directory /home/shino/mkcon/deploy &
図4:ローカルサーバー上に公開されたコンテナイメージ
Wind River Linux上での操作
# wget http://192.168.100.25:8888/container-base-bcm-2xxx-rpi4-20220703105510.docker-image.tar.bz2
# ls
container-base-bcm-2xxx-rpi4-20220703105510.docker-image.tar.bz2
# docker load -i container-base-bcm-2xxx-rpi4-20220703105510.docker-image.tar.bz2
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
container-base-bcm-2xxx-rpi4 latest 0460b561428f 6 minutes ago 151MB
# docker run -d -it --network corplan --ip 192.168.100.151 --name wrlnginx container-base-bcm-2xxx-rpi4 /bin/bash
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
83077d1c76cd container-base-bcm-2xxx-rpi4 "/bin/bash" 19 seconds ago Up 11 seconds wrlnginx
# docker attach 83077d1c76cd
コンテナ上でアプリケーションを実行する
最後に、作成したコンテナイメージにインストールされているnginxを実行してみましょう。
コンテナ上での操作
sh-5.1# mkdir /var/log/nginx
sh-5.1# mkdir /run/nginx
sh-5.1# nginx
sh-5.1# wget http://127.0.0.1/
--2022-07-03 11:04:58-- http://127.0.0.1/
Connecting to 127.0.0.1:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 612 [text/html]
Saving to: 'index.html'
index.html 100%[===================>] 612 --.-KB/s in 0s
2022-07-03 11:04:58 (2.13 MB/s) - 'index.html' saved [612/612]
sh-5.1# ip addr
1: lo:
...
5: eth0@if2: mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:c0:a8:64:97 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.100.151/24 brd 192.168.100.255 scope global eth0
valid_lft forever preferred_lft forever
図5:Dockerコンテナ内部のnginxにより、WEBコンテンツの配信に成功!
前記事「はじめてのDocker-コンテナのメリットと活用方法をマスターする」にて、組込みシステムにDockerを活用することの魅力とDockerの特徴を、本記事にてその使い方について解説しました。特にLAT利用することにより、簡単にカスタマイズしたコンテナイメージを作成後、イメージの公開まで行えることは Wind River Linuxならではの魅力です。LATはホストPCにダウンロードするだけですぐに利用いただけます。是非お手元でお試しください!