Orange Pi 3 docker (debian stretch desktop)

docker debian stretchでdocker desktopを作成してみました。

現在docker hubにはdebian busterが登録されていますが当サイトの環境(OrangePi3 armbian stretch)ではbusterをうまく動作させることができませんでした。
最新のarmbianもbusterがリリースされていますがOSは起動はするもののtigervncserverがこけてしまいます。この現象はdockerのbusterも同じです。
またdocker busterはsystemdを有効にしてrunしても直後は正常にデーモンが起動しますがコンテナを再スタートするとsystemdが有効になっていないようです。(なにか変わった?)
この辺はOrangePi3を含めて少し様子をみたいと思います。

IMAGE ID 0b6ef40e3f79 (debian_version 9.9)を使いました。(現在入手方法は?)

流れとしてはdebian(stretch)からコンテナdebian2を作成、必要なパッケージをインストール、イメージdebian2をコミット、イメージdebian2からsystemdを有効にしてコンテナdebian3を作成、設定して最後に保存したいイメージstretch、コンテナstretchを作成します。(nameは適当です)

debian2

OrangePi3からはtigervncserverに接続します。tightvncのウインドウサイズ固定に対してtigervncはある程度dwmのウインドウに自動で合わせてくれます。
WMはopenboxにあとlxpanelを追加しました。

$ docker container run --name debian2 -it 0b6ef40e3f79 /bin/bash

# apt update && apt -y upgrade
# apt -y install tcsh lv vim less procps \
xserver-xorg xterm \
tigervnc-standalone-server tigervnc-common \
openbox lxpanel leafpad \
locales dialog systemd-sysv

日本語入力 (uim-anthy) — 必要なら
/root/font_set/font_set.sh

#!/bin/sh
apt install -y fonts-ipafont fonts-ricty-diminished
apt install -y uim uim-anthy
cp /root/font_set/*conf /etc/fonts/conf.avail
cd /etc/fonts/conf.d
ln -s ../conf.avail/65-fonts-ipa-mincho.conf
ln -s ../conf.avail/65-fonts-ipa-pgothic.conf
ln -s ../conf.avail/65-fonts-monospace.conf

実行

# sh font_set.sh


65xxxconfは過去記事のどこかにあります。(検索可)
予めホスト側で作成してdocker cpでコピーするのが簡単だと思います。
漢字を有効にするには.bashrcに追記しても有効にすることはできませんでした。
当サイトではtcshをインストール、~/.cshrcに記載しています。

デフォルトのshellはbashでOK
tigervncserverではxstartupもsh.cshどちらでもOKのようです。
/root/.cshrc

setenv  LANG   ja_JP.UTF-8
setenv  XMODIFIERS @im=uim
setenv  GTK_IM_MODULE uim
setenv  QT_IM_MODULE uim

vncboot
このファイルも用意しておきます。vncboot

# chmod 755 vncboot
# cp /etc/init.d

作業が終わったら # exit してコミットします。
最初のcommitはファイルが大きくなっているので少し時間がかかります。

$ docker container commit debian2 debian2

コンテナdebian3作成

$ docker container run --privileged -d -p 5902:5902 --name debian3 debian2 /bin/systemd

debian3

$ docker container exec -it debian3 /bin/bash

ロケールの設定

# dpkg-reconfigure locales


raspbianでは馴染みのあるダイアログですね。
最初の画面でja_JP.UTF-8を選択して次にこの画面でja_JP.UTF-8を有効にします。

タイムゾーンの設定

# timedatectl set-timezone Asia/Tokyo

 

vncserver

コンテナ起動時vncserverを有効にします。

# systemctl daemon-reload
# systemctl enable vncboot
# systemctl start vncboot
# systemctl status vncboot

vncserverが起動していたらkillしてパスワード設定

# vncserver -kill :2
# vncpasswd

/root/.vnc/vnc.conf
tigervncserverはlocalhost=noを指定しないと外部から接続できません。

$geometry     = "846x502";
$depth        = 24;
$desktopName  = "debian";
$localhost    = "no";

/root/.vnc/xstartup

#!/bin/sh
xrdb $HOME/.Xresources
xsetroot -solid gray15
vncconfig nowin=1 &
uim-xim &
lxpanel &
sleep 1
cd && xterm -geometry 80x24+180+110 &
openbox &
sleep 5
uim-toolbar-gtk &

xtermを使う場合は~/.Xresourcesを適切に設定しておきます。
準備ができたらvncserver起動

# vncserver :2

クライアントから接続

$ vncviewer -SecurityTypes VncAuth,TLSVnc -passwd ~/.vnc/passwd 172.17.0.2:2


クライアント(OrangePi3)にはtigervncviewerをインストールしています。
OrangePi3もtigervncserverのホストとして稼働しています。同じパスワードを設定していいれば自身のパスワードを-passwdスイッチとして使用できます。
ここでコンテナをリスタートして問題なく接続できることを確認。debian busterではリスタート後ここで接続できませんでした。


lxpanelの体裁を好みのスタイルに合わせてここでコミットします。

$ docker container commit debian3 stretch

docker networkを作成

$ docker network create orangepi3-network
$ docker network inspect orangepi3-network
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"

コミットしたイメージからnetworkを付加して新たにコンテナを作成

$ docker container run --net=orangepi3-network --ip=172.18.0.9 --privileged -d -p 5902:5902 --name stretch stretch /bin/systemd

問題なく起動するようであれば不要なコンテナを削除

$ docker container rm debian3
$ docker container rm debian2


作成したイメージ(stretch)は940MBになりました。起動は約10秒位かかります。
stretchは先に作成したdebian3の差し分けになっているはずなのでイメージdebian3をrmするとタグが外れています。(削除はできません)
パッケージはpcmanfmとlxappearanceを追加しています。
pcmanfmからはホストのドライブが全部見えています。rootでログインしているので扱い注意です。

ボタン(OrangePi3から実行)

# Button debian
def debian():
    subprocess.run("docker container start stretch", shell=True)
    time.sleep(10)
    subprocess.run("vncviewer -SecurityTypes VncAuth,TLSVnc -passwd ~/.vnc/passwd 172.18.0.9:2 &", shell=True)
    root.quit()
icon3 = PhotoImage(file='~/.icons/64x64/debian.png')
button3 = ttk.Button(
    frame1,
    image=icon3,
    command=debian)
button3.grid(row=2,column=1)

lxpanelはpulseaudioを依存でインストールします。mplayerなどをインストールするとコンテナからホストを通してpulseaudio serverに接続可能になります。
smtubeのコンパイルやあまり重くない動画の再生もOKです。
終了はターミナルからpoweroffでコンテナstopします。
ホストにインストールする前のテストやコンテナで処理しても問題ないような用途に使っていきたいと思います。