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ディストリビューション」をご参照ください。

hypervisor
図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 /usr/local/oe-sdk-hardcoded-buildpath/sysroots/x86_64-wrlinuxsdk-linux/etc/qemu/ 
$ sudo vi /usr/local/oe-sdk-hardcoded-buildpath/sysroots/x86_64-wrlinuxsdk-linux/etc/qemu/bridge.conf 
$ 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


コンテナ上での操作 

# 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 21(日本語版)をご覧ください。

Linux Assembly Tools(LAT)の詳細な利用方法
「WIND RIVER LINUX DISTRO DEVELOPER'S GUIDE, LTS 21(日本語版)」

hypervisor
図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


コンテナ上での操作

# 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 21(日本語版)」

hypervisor
図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 & 


hypervisor
図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を実行してみましょう。

コンテナ上での操作

# mkdir /var/log/nginx 
# mkdir /run/nginx 
# nginx 
# 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] 
 
# 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


hypervisor
図5:Dockerコンテナ内部のnginxにより、WEBコンテンツの配信に成功!




前記事「はじめてのDocker-コンテナのメリットと活用方法をマスターする」にて、組込みシステムにDockerを活用することの魅力とDockerの特徴を、本記事にてその使い方について解説しました。特にLAT利用することにより、簡単にカスタマイズしたコンテナイメージを作成後、イメージの公開まで行えることは Wind River Linuxならではの魅力です。LATはホストPCにダウンロードするだけですぐに利用いただけます。是非お手元でお試しください!


リソース