Orange Pi 3 docker Ubuntu desktop

今回はubuntu IMAGEから前回のdebian同様に学習用desktopコンテナを作成してみたいと思います。

今回からは一般ユーザーを登録して通常のPC同様に作成したユーザーでログインすることにしました。取り扱い、設定の上でもこのほうが自然でいいと思います。

Orange Pi 3

$ uname -a
Linux orangepi3 5.1.16-sunxi64 #5.91.190708 SMP Tue Jul 9 00:38:37 CEST 2019 aarch64 GNU/Linux
$ docker -v
Docker version 19.03.0, build aeac949

armbianではこのところ更新が止まっていますね。190705busterベースのdebian ubuntuとも起動はするのですがハングアップしてしまいます。cpuクロック制御(?)に苦心していると睨んでいます。
このためstretchイメージをインストール/bootのsun50i-h6-orangepi-3.dtbを5.1.5.img(190601)のものと置き換えてアップグレードしています。(apt-mark hold sun50i-h6-orangepi-3.dtbしておく)
stretchは安定していてコンテナを起動してもアイドル時はcpu 480MHz Load averageは0.0n台に治まっています。(デバイスのサポートはまだまだですが)

ubuntu openssh server

ubuntuもdebianベースなので前回debianの手法でインストールしていきます。
Dockerfile

$ docker build -t ubuntu-sshserver ./

rootとuser(pi)のパスワードは適当に。user idは1000番から割り当てられます。
ホストのuserと合わせるときは useradd -u 1001 username のように!

FROM ubuntu:latest
RUN apt-get update && apt-get -y upgrade && \
apt-get -y install apt-utils openssh-server locales tzdata vim sudo language-pack-ja
RUN mkdir /var/run/sshd
RUN echo "root:xxxxxxxx" | chpasswd
RUN useradd pi -p raspberry
RUN sed -i "33i PermitRootLogin yes" /etc/ssh/sshd_config
RUN cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
update-locale LANG=ja_JP.UTF-8 && update-locale LANGUAGE=ja_JP.UTF-8 && update-locale LC_ALL=ja_JP.UTF-8
CMD ["/usr/sbin/sshd", "-D"]

ubuntu-sshserverをsystemdでrun

$ docker container run -it --name ubuntu_sshserver --cap-add SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro ubuntu-sshserver /bin/systemd

[  OK  ] Started Update UTMP about System Runlevel Changes.

上記のところで止まるのでコンテナリスタートsshで確認(systemd有効)

$ docker container restart ubuntu_sshserver
$ ssh root@172.17.0.2

登録したユーザーのホームディレクトリは特にDockerfileのuseraddで指定していませんが後から簡単にコピーできるので次に進みます。
コミット

$ docker container commit ubuntu_sshserver ubuntu/openssh-server

Tigervnc server

ubuntuのイメージではTigervnc 1.7.0系がインストールされます。debianの1.9.0は動きませんが1.7.0は動きます。

$ docker build -t ubuntu-tiger ./

Dockerfile
WMはdwmとopenboxで動作確認しています。

FROM ubuntu/openssh-server:latest

RUN apt-get update && apt-get -y upgrade && \
apt-get -y install xserver-xorg x11-xserver-utils xterm dwm \
tigervnc-standalone-server tigervnc-common

CMD ["/bin/systemd"]

run

$ docker container run -it --name ubuntu-X --cap-add SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro ubuntu-tiger /bin/systemd
[  OK  ] Started Update UTMP about System Runlevel Changes.

$ docker container restart ubuntu-X

ホストでユーザー用のディレクトリを作成して使いやすい設定ファイル(.bashrc vncbootなど)を用意してコピーします。vncserverの設定があればコピー可

$ docker cp pi ubuntu-X:/home

sshでログインして必要な設定をします。最低必要なものはユーザーディレクトリとvncserverの設定です。

$ ssh root@172.17.0.2

Dockerfileでuser shellの指定を忘れたのでここで変更します。

# chsh -s /bin/bash pi

vncの設定がない場合はここで設定します。(ユーザーpiで)

$ vncpasswd

パスワードを設定したら起動、当サイトではポート:2(5902)以降

$ vncserver :2 && vncserver -kill :2

ホームディレクトリには~/.vncができます。
vnc.confの作成(geometryは適当にlocalhost=no”必須)
~/.vnc/vnc.conf

$geometry     = "900x520";
$depth        = 24;
$desktopName  = "Ubuntu";
$localhost    = "no";

vncbootの設定、変更箇所(ポート番号は5に設定) 参考 vncboot

USER=pi
HOME=/home/pi
su $USER -c '/usr/bin/vncserver :5'
su $USER -c '/usr/bin/vncserver -kill :5'

編集が済んだら

# chown root:root vncboot
# chmod 755 vncboot
# cp vncboot /etc/init.d
# systemctl enable vncboot

vncserverを起動

$ vncserver :5

vncviewerで確認(ホストから実行)vnc client

$ vncviewer 172.17.0.2:5

その他

# visudo
pi      ALL=(ALL) NOPASSWD:ALL

いつものフォント設定

# sh font_set.sh

コミットしてIPを振って運用するコンテナを新規作成

$ docker container commit ubuntu-X ubuntu/tigervnc
$ docker container run -it --net=orangepi3-network --ip=172.18.0.35 --name ubuntu_dwm --cap-add SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro ubuntu/tigervnc /bin/systemd
$ docker container restart ubuntu_dwm

パスワードをコピーして接続してみます。(~/.vncは作成)

$ docker cp ubuntu_dwm:/home/pi/.vnc/passwd ~/.vnc
$ vncviewer -SecurityTypes VncAuth,TLSVnc -passwd ~/.vnc/passwd 172.18.0.35:5 &


設定ファイルは一度作成すればホームディレクトリごとdocker cpでコピーできるので再利用できます。
dwmはコンパイルしたものを利用しています。当サイトの特殊要件としてdwmからdwmを読んでいるのでキーボードからのウインドウ操作ができません。
最低限のメニューとopenboxをインストールして切り替えてみたいと思います。

# apt install openbox python3-tk leafpad psmisc w3m-img less highlight

ubuntuにはpython3.6が含まれています。

# cd /usr/bin && ln -s python3.6 python


ファイラーにはrangerを入れました。以前のとおりインストールはしないで展開してるだけです。テキストビューはroot権限ではできないようです。一般ユーザーでは問題ありません。
左右の境界線はdwmのコンパイル(config.h)で設定できます。


ウインドウマネージャーをopenboxに切り替えるとこんな感じ、普通に使えます。
切り替えは瞬時に可能ですがdwmに戻るときはメニューが左側の大きいウインドウに移動します。
exitボタンは実行中のxtermを終了します。再度xtermを起動するとメニューは右側に追い払われていきます。通常のdwmの使い方では問題は無いのですが!

現在の~/.vnc/xstartup

#!/bin/sh
xrdb $HOME/.Xresources
xsetroot -solid Black
vncconfig nowin=1 &
~/bin/app.sh &
dwm &

~/bin/app.sh 起動時のアプリケーション設定

#!/bin/sh
~/bin/app.py &
sleep 3
cd && xterm &

app.py 参考 メニュー ~/bin/app.py

w3m-imgをインストールするとrangerで画像のビューが可能になります。


タイトルバーのmoodeをクリックするとフロートに切り替えます。
タイル型のWMは隙間なく埋めてくれるので小さい画面(ウインドウ)でも見やすくなります。dwmの中のdwmはかなり制限がありますがなんとか簡単な作業はできそうです。


cpu状態表示はホスト側と同じです。
メモリ使用量は若干増えますが特に重い作業でもしない限り問題なく使用できそうです。
armbianのbusterも早期に解決するといいのですが!

Orange Pi 3 docker (debian buster systemd)

やはりdebian busterではsystemdは有効にならないようです。
セキュリティーの観点、運用からもdockerの1プロセス1コンテナ原則のようです。
但しローカル内での学習目的やちょっとした遊びにはsystemdが使えたほうが便利なこともあると思います。
docker hubにはdebian buster systemdのコンテナもあるのですが初心者(当サイト)には使い方がわかりませんでした。
systemdを有効にするためにここのくだりを参考にしました。
https://serverfault.com/questions/607769/running-systemd-inside-a-docker-container-arch-linux

debianの公式イメージには直接適用されないようなので一旦ssh serverコンテナを作成してみます。

openssh server

適当なディレクトリを作成してその中でDockerfileを実行します。

$ docker build -t buster-ssh ./

Dockerfile

FROM debian:latest
RUN apt-get update && apt-get -y upgrade && apt-get -y install openssh-server locales tzdata
RUN mkdir /var/run/sshd
RUN echo "root:xxxxxxxx" | chpasswd
RUN sed -i "33i PermitRootLogin yes" /etc/ssh/sshd_config
RUN localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 && cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
CMD ["/usr/sbin/sshd", "-D"]

イメージbuster-sshができるのでこれをsystemdでrunします。

$ docker container run -it --name openssh-server --cap-add SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro buster-ssh /bin/systemd


起動したままになるので別ターミナルからstop
docker container ls -aからopenssh-serverを確認して再度start
sshで接続

& docker container stop openssh-server
$ docker container start openssh-server
$ ssh root@172.17.0.2


systemdが有効になっていますね。
ロケールとタイムゾーンは設定されているはずです。
ほかに追加したい項目があればここで設定してcommitしておきます。
buster/openssh-server

& docker container stop openssh-server
$ docker container commit openssh-server buster/openssh-server

xorg

作成したbuster/openssh-serverを基にX関連を追加します。
vncはtightvncserver WMはdwmをインストール

$ docker build -t buster-xorg ./

Dockerfile

$ FROM buster/openssh-server:latest
RUN apt-get update && apt-get -y upgrade && \
apt-get -y install xserver-xorg xterm tightvncserver autocutsel dwm vim

CMD ["/bin/systemd"]

上記と同じくsystemdでrun

$ docker container run -it --name buster-X --cap-add SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro buster-xorg /bin/systemd

コンテナをリスタートdocker container execかsshから環境を設定します。

$ docker container stop buster-X
$ docker container start buster-X
$ ssh root@172.17.0.2
# vncpasswd
# vncserver -geometry 600x450 :2

当サイトはvnc接続したOrangePi3に構築しているのでポート番号は2以降を指定しています。

$ vncviewer 172.17.0.2:2


日本語フォントをインストール、fontconfigを設定.Xresourcesなど追加
/root/.vnc/xstartupを設定して最低限の起動画面を作成
ウインドウマネージャーは変更してもいいし後からいつでも変えられます。
設定が済んだらコミットします。

$ docker container commit buster-X buster/xorg

コミットしたbuster/xorgからnetworkを指定して運用するコンテナを作成

$ docker container run -it --net=orangepi3-network --ip=172.18.0.23 --name buster_dwm --cap-add SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro buster/xorg /bin/systemd

作成したコンテナが正常に起動できたらbuster/openssh-server buster/xorg以外の不要なコンテナ、イメージを削除

vncboot

vncbootを有効にしないとコンテナをスタート、ログインしてvncserverを起動しなければvncviewerから接続できません。docker cpでコピーするのが簡単と思います。
パーミッションはroot 実行権限を付けておきます。

$ docker cp vncboot /etc/init.d

ログインしてenable

# systemctl enable vncboot

vncbootにはポート番号が記載されています。2以降の任意の番号に変更するのがいいでしょう。vncviewerからその番号を指定します。

vncserverはtightvncserverをインストールしています。
tigervncserverはbuster(ARM64?)では起動しません。これはdebian系のbugのようです。
https://github.com/TigerVNC/tigervnc/issues/800
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=923962
現package versionも変更が無いことからまだ解決には至ってないようです。

buster_dwm


dwmをコンパイルしたdwm6.2に変更しています。
dwmは実行ファイル(59Kb)も小さく依存するファイルも必要ないことから/usr/local/binに放り込んでおくだけで問題なく使えます。dmenuは追加でインストールできます。
Xの確認また操作にある程度慣れていればそのまま十分実用になります。
但し今回はホストのOrangePi3でdwmを使っているためキーバインドは全てホスト側に摂られています。実質xstartup,xtermからのみコントロールすることになります。

buster_openbox

$ docker container run -it --net=orangepi3-network --ip=172.18.0.24 --name buster_openbox --cap-add SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro buster/xorg /bin/systemd


起動時メモリ消費量はdwm 30MB openbox+lxpanelで45MB位になるようです。
起動するアプリケーショやデーモンがあるとどんどん増えていきます。
pcmanfmからはドライブが見えなくなっています。


buster_dwmにsurfをインストール、xstartupから起動してmoode player,radikoを表示させてみました。
動作としては問題ないのですがraspbianに比べてメモリ消費量が大きくなるようです。
Xコンテナも用途によって使い分けたり新しくしたほうがいいようです。

buster_openssh

今回作成したコンテナはssh接続も可能ですがrunするとXも起動するためメモリ消費が多くなります。cliでssh接続するためbuster_opensshからコンテナを作成します。

$ docker container run -it --net=orangepi3-network --ip=172.18.0.22 --name buster_ssh --cap-add SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro buster/openssh /bin/systemd


各コンテナの起動タイミングはメモリの状況やOSなどの条件で接続はそれぞれ違ってきます。一つのボタンでコンテナをrunそして接続することは無理があります。
alpineだけはsleepに3秒入れておけば繋がるのですがほかのOSは初回起動時と以降の差が大きいのでsleepに1を入れて1回失敗させ(runだけしといて)再度間合いをおいて接続するようにしています。
この辺はもう少しスマートな方法がないか考えてみたいと思います。

docker kill(stop)ボタン
起動中の全コンテナを安全にストップします。

subprocess.run("docker container stop $(docker ps -q)", shell=True)

docker restart ボタン
作業中時折agettyを握って一つのcpuが100%に張り付いてしまうことがあります。
dockerをrestartしても直らないのですがagettyをkillするついでにdockerもrestartしています。

subprocess.run("sudo killall agetty", shell=True)
subprocess.run("sudo systemctl restart docker", shell=True)

コンテナの停止時間を充分見ていれば大丈夫かな(?)

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します。
ホストにインストールする前のテストやコンテナで処理しても問題ないような用途に使っていきたいと思います。

Orange Pi 3 docker (CentOS)

前回のalpineに続いて学習用CentOSのコンテナを作成してみました。

CentOSではsystemdを使いたいので–privilegedオプションでコンテナを作成、sshからログインすることにしました。

CentOSは使い慣れていないOSでそれもdockerコンテナということもありlocaleの設定で躓いてしまいました。

CentOS

docker hubからpull run(–name centos-opi3 適当)

$ docker pull centos
$ docker container run --privileged -d --name centos-opi3 centos /sbin/init

ホストから.bashrcをコピー、コンテナに入ります。

$ docker cp .bashrc centos-opi3:/root
$ docker container exec -it centos-opi3 /bin/bash

アップデート

# yum -y update

localeの確認

# localectl                              
   System Locale: LANG=en_US.UTF-8
       VC Keymap: us
      X11 Layout: us
# localectl list-locales | grep -i ja
なし
# locale -a
C
POSIX
# locale                               
LANG=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

localeの設定

何度かコンテナを作り直して結果的に下記の方法でうまくいきました。

# localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
# localectl set-locale LANG=ja_JP.UTF-8
# source /etc/locale.conf

設定後

# localectl
   System Locale: LANG=ja_JP.UTF-8
       VC Keymap: us
      X11 Layout: us
# localectl list-locales | grep -i ja
ja_JP.utf8
# locale -a
C
POSIX
ja_JP.utf8

localeはコマンドラインからexport

# export LANG=ja_JP.UTF-8
# locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=

localeはユーザー設定になると思うのでコンテナに直接入った場合は読み込まないようです。適切なユーザーでログイン.bashrc(.cshrc)などから設定を読み込む。

タイムゾーンの設定

# date
2019年  7月  7日 日曜日 03:18:21 UTC
# timedatectl set-timezone Asia/Tokyo
# date
2019年  7月  7日 日曜日 12:20:11 JST

ツールのインストール

# yum -y install tcsh less file bind-utils whois iproute wget

openssh-server

sshd_configはPermitRootLogin yesを有効にしてroot passwordを設定しておきます。

# yum -y install openssh-server openssh-clients
/etc/ssh/sshd_config
PermitRootLogin yes
# systemctl enable sshd
# systemctl start sshd
# passwd
Changing password for user root.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

ホストから別ターミナルを開いてsshからログインできることを確認

$ ssh root@172.17.0.2
root@172.17.0.2's password:
# date
2019年  7月  7日 日曜日 12:52:48 JST

コミット

コンテナから抜けてここでコミット、新しいコンテナ(centos)を作成
コンテナをstopするとexecでアクセスすることは不可になります。

$ docker container stop centos-opi3
$ docker container commit centos-opi3 centos-ssh
$ docker container run --privileged -d --name centos centos-ssh /sbin/init
$ docker container rm centos-opi3

コンテナスタート

$ docker container start centos


poweroffでコンテナstop
ターミナルをexitで抜けるとコンテナは起動したままになっています。


webではCentOSベースの記事が多いですね。少し使ってみたいと思います。
CentOSと比べるとalpineのベースイメージの小ささがよくわかります。少し詰め込むと大きくなりますが特定の用途や実験などにはいいかもしれません。

起動ボタン

# Button centos
def centos():
    subprocess.run("docker container start centos", shell=True)
    time.sleep(3)
    subprocess.run("xterm -e ssh root@172.17.0.2 &", shell=True)
icon2 = PhotoImage(file='~/.icons/64x64/centos.png')
button2 = ttk.Button(
    frame1,
    image=icon2,
    command=centos)
button2.grid(row=1,column=2)

rangerは前回のalpineの要領で入れています。(pythonはベースイメージにインストール済)
現状はdocker networkを構成していないのでalpineを先に起動するとipが(172.17.0.3)となってボタンの指定とずれてしまいます。(今後の勉強次第ですね)

Orange Pi 3 Docker-CE (Alpine Linux)

Orange Pi 3(ARM64/AARCH64)もraspbian同様Docker-CEを簡単にインストールできるようです。
https://tomono.tokyo/2019/04/22/7578/

目的はコンテナを作成するにあたりOSの学習用またdockerの練習用として気軽に試せる環境を作成しようと思います。
今回はまずalpineコンテナを作成してみます。

ホスト

$ uname -a
Linux orangepi3 5.1.15-sunxi64 #5.90.190703 SMP Thu Jul 4 00:31:21 CEST 2019 aarch64 GNU/Linux

Docker-CEのインストール

$ curl -fsSL get.docker.com -o get-docker.sh

ホームディレクトリで実行するとスクリプト(get-docker.sh)がダウンロードされます。

$ sudo sh get-docker.sh
----
Client:
 Version:           18.09.7
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        2d0083d
 Built:             Thu Jun 27 17:56:21 2019
 OS/Arch:           linux/arm64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.7
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.8
  Git commit:       2d0083d
  Built:            Thu Jun 27 17:23:19 2019
  OS/Arch:          linux/arm64
  Experimental:     false
---

ユーザー権限で実行する

sudo usermod -aG docker your-user

Alpine Linux

docker hubからalpineをpull

$ docker pull alpine
$ docker image ls
alpine     latest       e67514d6f5dd        2 weeks ago         5.33MB

コンテナ作成 –name alpine3(適当)

$ docker container run --name alpine3 -it alpine /bin/sh
/ # ls
bin   dev   etc   home   lib   media  mnt   opt   proc   root   run   sbin   srv   sys   tmp   usr   var

exitして再度コンテナに入る

/ # exit
$ docker container start -i alpine3

リポジトリを追加

# vi /etc/apk/repositories
http://dl-cdn.alpinelinux.org/alpine/edge/community/

アップデート、ツールをadd 日付はJST

# apk update && apk upgrade
# apk add bash tcsh tzdata openrc bind-tools
# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# date
Sat Jul  6 20:17:18 JST 2019

python3のインストール
python3をaddしてpythonにリンク(python3.7)

# apk add python3 file
# cd /usr/bin
# ln -s python3.7 python
# ls -la python*
lrwxrwxrwx    1 root     root             9 Jul  5 16:14 python -> python3.7*
lrwxrwxrwx    1 root     root             9 Jul  5 16:10 python3 -> python3.7*
-rwxr-xr-x    2 root     root          5744 May  1 23:04 python3.7*
-rwxr-xr-x    2 root     root          5744 May  1 23:04 python3.7m*
# python --version
Python 3.7.3

rangerの導入

# wget https://ranger.github.io/ranger-stable.tar.gz
# tar -xvf ranger-stable.tar.gz
# cd ranger-1.9.2
# ./ranger.py

# ./ranger.pyで実行 終了はq
rangerは特にインストールしないで展開したファイルから実行します。
デフォルトの設定ファイルは展開したファイルの中にあります。
正規にインストールした場合と同じように使えます。

ホストから設定ファイル(~/.config/ranger)をコピー

$ docker cp ~/.config/ranger alpine3:/root/.config

ホストから.bashrcと.cshrcをコピー

$ docker cp .bashrc alpine3:/root
$ docker cp .cshrc alpine3:/root

.bashrcと.cshrcにaliasを設定

~ # vi ~/.bashrc
alias ranger='~/ranger-1.9.2/ranger.py'
# vi ~/.cshrc
alias ranger  ~/ranger-1.9.2/ranger.py
alias r       ~/ranger-1.9.2/ranger.py
# exit

alpine3をコミット(イメージ作成)コンテナalpine3を削除

$ docker container commit alpine3 alpine3-img
$ docker container rm alpine3

作成したイメージ(alpine3-img)から新たにコンテナalpineを作成
当サイトではメインのshellをtcshで作成しています。(.cshrcは必須)

$ docker run --name alpine -it alpine3-img /bin/bash

exitして再度スタート

$ docker container start -i alpine

イメージサイズはOS学習用なのであまり気にしないことにします。

$ docker image ls
alpine3-img         latest     9bfd90814cbe        30 hours ago        86.3MB
alpine              latest     e67514d6f5dd        2 weeks ago         5.33MB


rangerを起動
残念ながらテキストのオートプレビューはできないようです。
但し”i”キーでプレビューは可能です。
ディレクトリranger-1.9.2は.config以下に移動しています。aliasも変更

ホスト(OrangePi3)から使いやすくするため起動ボタンを作成しています。

# Button alpine
def alpine():
    subprocess.run("xterm -e docker container start -i alpine &", shell=True)
icon1 = PhotoImage(file='~/.icons/64x64/alpine.png')
button1 = ttk.Button(
    frame1,
    image=icon1,
    command=alpine)
button1.grid(row=1,column=1)

CentOSとdebianは今のところボタンだけですが次はCentOSにチャレンジしてみようと思います。

Top