Dockerでubuntu22のリモートデスクトップ接続できるコンテナ

ubuntu20をubuntu22へ切り替えしてったんやけど、dockerコンテナのもやりたいなって思ったのでやってみた。

ubuntu22の親ホストで動くdockerコンテナとしてxrdpd稼働させて、リモートデスクトップ接続可能なubuntu22コンテナを作る。

結論

dockerhubにあったxrdpコンテナのdockerfileをベースにして自分用に改造し、ubuntu22.04LTSにしたxrdpコンテナが起動できて、windowsから接続できるようになった。

macからもつないで使える(妄想)。

まずは、ビルドして起動した直後。
他にもdjangoやらldapsサーバやらredhat8/9クローンを動かしてる。

GUI含むので、dockerfile使ってビルドするのは20分ぐらい待つ。
ssd使うようにしても、それなりに時間はかかる。

gvis-docker-ubu22xrdp

リモートデスクトップ接続して、マウントした永続化領域を開いたとこ。
ubuntu22のJammy jellyfishってなってるし、右上の日付表示も日本語で、タイムゾーンもJSTになってる。

gvis-docker-ubu22xrdp

自分向けお決まりの入力をaliasに登録したところ。
source .bashrcってするか、ログインしなおしたらaliasが有効になる。

キーボードレイアウトを日本語にするため「設定マネージャー」を起動してみる。
GUIで見えてるポップアップツリーも、めっちゃ日本語表示してくれてる。

gvis-docker-ubu22xrdp

レイアウト変更は「japanese」って表記じゃなくて、いちばん下のほうにある「日本語」ってのを選ぶ。これでレイアウトを「OADG109A」にして「Generic105-KEY PC」ってキーボード選ぶと「@」とか「:」が日本語レイアウトで使える(特にコロンが入力できないとvimでツライ)。

dockerコンテナの再起動したらlibreofficeの中でもちゃんと記号使えた。

gvis-docker-ubu22xrdp

コマンドラインで、パネルの日時表示設定とか日本語キーボード設定やらなあかんのかなぁって思ってたらスンナリ使えるようになった。

あとはベース機能をubuntuで最初にaptした内容を使ってvscodeとchrome入れたらこうなった。

gvis-docker-ubu22xrdp

これで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の中とかスクリプトの中を見るとイマイチわからんかった箇所もある。

Docker

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さんありがとう。たいへん参考になりました。

Docker

このxrdpコンテナにあるdockerfileを書き換え、日本語ロケール設定とか入れたらええんとちゃうかって考え始めた。

dockerコマンドライン起動で動いたけど・・・

説明はdanchitnisさんの登録されたgithubに書いてあった。

GitHub - danchitnis/container-xrdp: Docker container for xrdp
Docker container for xrdp. Contribute to danchitnis/container-xrdp development by creating an account on 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:とか書いたらええんかもしらんけど、やる気になれんかった。

Compose ファイル・リファレンス — Docker-docs-ja 1.12.RC2 ドキュメント

もっと直観的にわかって、楽にシンプルにできるんとちゃうか。

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入れたらホイホイ使えるようになった。

gvis-docker-ubu22xrdp

日本語入力できるから処理内にコメントも書ける。

日本語入力

windows使うときは「半角/全角」って左上のキーを使うけど、mac/linuxを使ってると「super + space」って組み合わせを使う。

フルスクリーンでrdp接続すると問題ないけど、解像度を少し下げて1600×900とかの少し小さめスクリーンにすると、windowsやmacがキーストロークを先に拾ってしまうのでubuntu22コンテナの日本語はマウスで切り替えなきゃいけない。

google cloudの中でも同じことやってみた

ローカルPCでできたんやから、そりゃできるわな。

vscodeからgitlabへドキュメント更新のコミット&プッシュして完了。

以下、プッシュしたドキュメントをgit cloneしてるとこ。

gvis-docker-ubu22xrdp

基礎確認でgoogle cloudのネットワークの速度計ってみたら、ダウンロード側が3000Mbps超えてた。

ubuntu22とは関係ないけど、なんちゅう速さやねん・・・。

Googleセグメント-linuxVM-netspeed

とりあえず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だったらいいのかっていうと、そうじゃない。
より良いもの出てきたらそっちに変えていく。

タイトルとURLをコピーしました