ubuntu20をubuntu22へ切り替えしてったんやけど、dockerコンテナのもやりたいなって思ったのでやってみた。
ubuntu22の親ホストで動くdockerコンテナとしてxrdpd稼働させて、リモートデスクトップ接続可能なubuntu22コンテナを作る。
その後、ubuntu24での稼働に切り替えた。
結論
dockerhubにあったxrdpコンテナのdockerfileをベースにして自分用に改造し、ubuntu22.04LTSにしたxrdpコンテナが起動できて、windowsから接続できるようになった。
macからもつないで使える(妄想)。
まずは、ビルドして起動した直後。
他にもdjangoやらldapsサーバやらredhat8/9クローンを動かしてる。
GUI含むので、dockerfile使ってビルドするのは20分ぐらい待つ。
ssd使うようにしても、それなりに時間はかかる。
リモートデスクトップ接続して、マウントした永続化領域を開いたとこ。
ubuntu22のJammy jellyfishってなってるし、右上の日付表示も日本語で、タイムゾーンもJSTになってる。
自分向けお決まりの入力をaliasに登録したところ。source .bashrc
ってするか、ログインしなおしたらaliasが有効になる。
キーボードレイアウトを日本語にするため「設定マネージャー」を起動してみる。
GUIで見えてるポップアップツリーも、めっちゃ日本語表示してくれてる。
レイアウト変更は「japanese」って表記じゃなくて、いちばん下のほうにある「日本語」ってのを選ぶ。これでレイアウトを「OADG109A」にして「Generic105-KEY PC」ってキーボード選ぶと「@」とか「:」が日本語レイアウトで使える(特にコロンが入力できないとvimでツライ)。
dockerコンテナの再起動したらlibreofficeの中でもちゃんと記号使えた。
コマンドラインで、パネルの日時表示設定とか日本語キーボード設定やらなあかんのかなぁって思ってたらスンナリ使えるようになった。
あとはベース機能をubuntuで最初にaptした内容を使ってvscodeとchrome入れたらこうなった。
これでdjangoのソースいじったり、ローカル環境で必要なときにテストできる。
ついでにlibre officeも最後に入れた。
docker-composeには、こう書いた。
dockerhubにあったxrdpコンテナを扱ってるサイトでベースになるものを引き当てて、ubuntu20で使ってる記述をベースに★箇所について改造して利用。
### git clone https://github.com/danchitnis/container-xrdp.git
### cd container-xrdp
###
### docker build -f ./ubuntu-xfce/Dockerfile -t ubu:22gvis .
### docker run -it -v /docker/nariDockerDat/cl_ubun22:/gvis -p 33389:3389 ubu:22gvis nari xxxxxxxx yes
cl_ubu22:
image: ubu:22gvis
privileged: true ★お決まりの記述
hostname: clubu22
ports:
- "33389:3389" ★windowsからは33389ポートで接続させる
volumes:
- ./nariDockerDat/cl_ubun22:/gvis ★永続化領域をつないで使う
tty: true
shm_size: 512m ★この記述がないとchromeでページ表示の際にエラー出る
depends_on:
- "sv_ldap-admin" ★このコンテナより後に起動して欲しいので書いた
ubuntu20の頃
yama07さんが作っておられてて、ubuntu20の頃はこれ使わせてもらってた。
めっちゃ楽にコンテナ作れたけど、dockerfileの中とかスクリプトの中を見るとイマイチわからんかった箇所もある。
ubuntu22が出てしばらく経ったら22のをリリースしてくれるんかなぁってしばらく待ったけど、すぐには出なさそう。
んじゃ自分で作ってみるかってことにした。
最初に挑戦したこと
さっきのyama07さんのdockerfileの1行目を「FROM ubuntu:22.04」って書き換えてビルドしてみたけどあっさり撃沈。
とほほ、やっぱり楽やないなぁ。
ログは捨てたけど、「gosu」ってモジュールのあたりでコケてた。
goはたぶんgo言語のことで、suするときの何かなんかなぁ。
昔centosでxrdpが動くコンテナを作ったことがあるけど、gosuなんてモジュール使わんかったけどなぁ。
深追いするとハマりそうな気がしたからやめといた。
docker hubの中探してみる
dockerhubには世界中のコンテナ作者が登録してくれてる。
イマイチなコンテナもあるけど、xrdpをfedora/centos/amazonlinux/ubuntuのどれでも動かすコンテナってのを作ってる人がいた。
たぶん汎用的に作ってビルドできるようになってるんやろな。
ubuntuはわかるけど、centosとamazonlinuxでも使えるってのは便利そう。
danchitnisさんありがとう。たいへん参考になりました。
このxrdpコンテナにあるdockerfileを書き換え、日本語ロケール設定とか入れたらええんとちゃうかって考え始めた。
dockerコマンドライン起動で動いたけど・・・
説明はdanchitnisさんの登録されたgithubに書いてあった。
なるほど、docker exec
してコマンドラインにユーザ名とパスワードと、sudoできるかどうかのyesを書いて起動すればええみたい。
そのままやってみたら、一発で起動できた。
ネズミの壁紙のデスクトップが見えた。
書いてあるとおりやればええんやから、そりゃ起動できるわなぁ。
せやけどこれdocker-compose.ymlに何て書いたらええんかなぁ。
他にもコンテナ使ってるから、起動順位とかコントロールしたいんやけどなぁ。
日本語扱えるようにするのと、ロケールでJST設定
dockerfileに追加して書く。
★印の箇所をいじってった。
追記する内容は、yama07さんのdockerfileにあったapt対象を参考にさせてもらった。
FROM ubuntu:22.04 ★latestってあったのをバージョン番号直指定した
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get -y update
RUN apt-get -y upgrade
RUN apt-get install -y \
xfce4 \
xfce4-clipman-plugin \
xfce4-cpugraph-plugin \
xfce4-netload-plugin \
xfce4-screenshooter \
xfce4-taskmanager \
xfce4-terminal \
xfce4-xkb-plugin
RUN apt-get install -y \
sudo \
wget \
xorgxrdp \
xrdp \
tzdata \ ★足した for JST
ibus \ ★足した for 日本語入力
ibus-mozc \ ★足した for 日本語入力
language-pack-ja-base \ ★足した for 日本語表示
language-pack-ja \ ★足した for 日本語表示
fonts-noto-cjk \ ★足した for 日本語表示
fonts-noto-color-emoji && \ ★足した for 日本語表示
apt remove -y light-locker xscreensaver && \
apt autoremove -y && \
rm -rf /var/cache/apt /var/lib/apt/lists
★ロケール設定作る
RUN locale-gen ja_JP.UTF-8 \
&& echo 'LC_ALL=ja_JP.UTF-8' > /etc/default/locale \
&& echo 'LANG=ja_JP.UTF-8' >> /etc/default/locale
★ロケール設定使う
ENV LANG=ja_JP.UTF-8 \
LANGUAGE=ja_JP:ja \
LC_ALL=ja_JP.UTF-8 \
TZ=Asia/Tokyo
★タイムゾーン設定する
RUN cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \
&& echo 'Asia/Tokyo' > /etc/timezone
★ここでubuntu-run.shを使ってるから、その中にある引数指定箇所を変更した
COPY ./build/ubuntu-run.sh /usr/bin/
RUN mv /usr/bin/ubuntu-run.sh /usr/bin/run.sh
RUN chmod +x /usr/bin/run.sh
# https://github.com/danielguerra69/ubuntu-xrdp/blob/master/Dockerfile
RUN mkdir /var/run/dbus && \
cp /etc/X11/xrdp/xorg.conf /etc/X11 && \
sed -i "s/console/anybody/g" /etc/X11/Xwrapper.config && \
sed -i "s/xrdp\/xorg/xorg/g" /etc/xrdp/sesman.ini && \
echo "xfce4-session" >> /etc/skel/.Xsession
# Docker config
EXPOSE 3389
ENTRYPOINT ["/usr/bin/run.sh"]
docker-composeで、そのままでは動かん
danchitnisさんのxrdpコンテナをdocker-composeで扱うを考えたけど、引数を書く方法がイマイチわからんかった。
command:
とか書いたらええんかもしらんけど、やる気になれんかった。
もっと直観的にわかって、楽にシンプルにできるんとちゃうか。
dockerfileを見ると、最後に/usr/bin/run.sh
を起動してる。
そのシェルスクリプトの中を見ると、docker exec
で渡ってきた引数を処理してて、3つあるか確認処理してる。
users=$(($#/3))
mod=$(($# % 3))
#echo "users is $users"
#echo "mod is $mod"
if [[ $# -eq 0 ]]; then
echo "No input parameters. exiting..."
echo "there should be 3 input parameters per user"
exit
fi
if [[ $mod -ne 0 ]]; then
echo "incorrect input. exiting..."
echo "there should be 3 input parameters per user"
exit
fi
echo "You entered $users users"
んんん???
見ると/usr/bin/run.sh
じゃなくてubuntu用にubuntu-run.sh
ってのをコピーしてあって、同じことやってる。
引数処理している箇所を、スクリプト内にベタ書きするよう修正したら使えるやん。
改造して自分用に書き換える
まずは、さっきの引数の数をチェックしている箇所はカット。
3つ処理する必要ないから、引数を順番に処理しているループもコメント化。
引数使ってuseraddやらchpasswdしている箇所を書き換えて、スクリプトの中にベタ書きしたものを処理させてみた。
gvis_username=nari
gvis_pass=xxxxxxxx
gvis_sudo=yes
### while [ $# -ne 0 ]; do
addgroup $gvis_username
echo "username is $gvis_username"
useradd -m -s /bin/bash -g $gvis_username $gvis_username
wait
getent passwd | grep $gvis_username
echo $gvis_username:$gvis_pass | chpasswd
wait
echo "sudo is $gvis_sudo"
if [[ $gvis_sudo == "yes" ]]; then
usermod -aG sudo $gvis_username
fi
wait
echo "user '$gvis_username' is added"
# Shift all the parameters down by three
### shift 3
### done
これで、引数でユーザ・パスワード・sudo可否を指定するんじゃなくて、書いたそのままで動くようになる。
念のためビルドやりなおさせた。
dockerイメージは1.2GBぐらいになってubuntu20のときより縮んでた。
どっちでもいいけど、lxdeよりxfceのほうが小さいのかも。
$ docker images | grep ubu
ubu 22gvis d603902ee257 24 hours ago 1.2GB
ubuntu 22.04 27941809078c 2 months ago 77.8MB
ubu 20gvis 04a3d6c21c7a 5 months ago 1.96GB
ubuntu 20.04 54c9d81cbb44 6 months ago 72.8MB
$
起動させてみる
その上でdocker-composeから起動するようにしたら動いた。
ubuntu22ベースなだけで、普段使うツールとかは入ってない。
rdp接続してからapt-getでvim/curl/git/gthumb/geditを入れといた。
ファイルマネージャでsmb://xxx
みたいな書き方したらアドレスバーが赤くなった。
LAN上にsambaサーバあるから、そこからデータ取ってきて編集させたいのに赤くなってつながらんのはアカン。
回避するためにgvfs-backends
ってのも入れた。
あとはいつもの手順から使う箇所だけ選んで、chromeとvscodeとlibre office入れたらホイホイ使えるようになった。
日本語入力できるから処理内にコメントも書ける。
日本語入力
windows使うときは「半角/全角」って左上のキーを使うけど、mac/linuxを使ってると「super + space」って組み合わせを使う。
フルスクリーンでrdp接続すると問題ないけど、解像度を少し下げて1600×900とかの少し小さめスクリーンにすると、windowsやmacがキーストロークを先に拾ってしまうのでubuntu22コンテナの日本語はマウスで切り替えなきゃいけない。
google cloudの中でも同じことやってみた
ローカルPCでできたんやから、そりゃできるわな。
vscodeからgitlabへドキュメント更新のコミット&プッシュして完了。
以下、プッシュしたドキュメントをgit cloneしてるとこ。
基礎確認でgoogle cloudのネットワークの速度計ってみたら、ダウンロード側が3000Mbps超えてた。
ubuntu22とは関係ないけど、なんちゅう速さやねん・・・。
とりあえずubuntu22のxrdpコンテナ使えるようになった。
よかった、よかった。
aptしたときに時間がUTCに戻ってしまう
毎年いろんな脆弱性が出てくる。
よくもまぁそんなにたくさん出てくるもんやと思う。
その中でtzdataってモジュールもときどき変更があって、どうもこのモジュールが更新されると時刻表示がJSTからUTCに変わってまう。
そんなときはこのコマンドラインで戻しておいてdocker-composeからコンテナ再起動するとJSTに戻ってくれる。
cp -p /usr/share/zoneinfo/Asia/Tokyo /etc/localtime echo 'Asia/Tokyo' > /etc/timezone
脆弱性対応めんどくさい。
バグ探しのためだけに集まっておられる方もいるらしくて、そんなんがよくぞお金を産むもんやと思う。
そういう方々やグループがあるおかげで、安全にソフトウェアを使い続けることができるから、とても感謝はしてる。
ただ、「こんなバグあんねん」っていう新着情報を追いかけるのは、流行ってる音楽を追いかけるのと同じで体力いる。
できるだけ楽にこなしたいからaptとかdnfとかがあって更新はそれ一発で終わり。
redhatは8あたりから、dnfで競合発生しやすくなったようになった気がする。
コレめっちゃ面倒やから、個人利用ではredhatとはサヨナラした。
じゃぁubuntuだったらいいのかっていうと、そうじゃない。
より良いもの出てきたらそっちに変えていく。