Dockerでubuntu22のリモートデスクトップ接続できるコンテナ(Dockerfile追記とマルチステージビルド)

dockerコンテナでxrdpするものをローカルlinuxとmacの中のminikubeとgoogle cloud(GCP)では日常的に使ってる。

GCPの中ではvscode使って、コンテナ稼働させてるgitlabにpythonソースとか、運用スクリプトとかを更新して保管してる。

普段はローカルのmacとwindowsのofficeあるから、GCPでexcelとかpdfとか確認するのはほんの少し。
そのためだけにwindowsの仮想マシン使うのはちょっとなぁ。

GCPの中でwindowsホストを使うと、ライセンス料とかいるから高めになる。
それやったらxrdpコンテナ使ってたほうがええ。

xrdpコンテナにはapt/apt-getしていろいろ入れたいから、全部やないけど30個ぐらいの自分のメモ見ながら設定してる。

dockerイメージ大きくなってほしくないけど、たぶん増えてく。
ときどきコンテナ作り直すことあるから、毎回の再設定が面倒になってきた。

ブラウザの表示色合い設定とか、デスクトップの壁紙設定とか手動でやらなアカンもんもあるけど、コンテナ作り直して全部手動でapt-getとかalias設定やるのは苦しいから、書いて設定できるものはdockerfileに追記した。

元のファイル

元のファイルはこんなの。
danchitnisさんのものを流用させてもらってる。

# https://github.com/danchitnis/container-xrdp

FROM ubuntu:22.04

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 \
    ibus \
    ibus-mozc \
    language-pack-ja-base \
    language-pack-ja \
    fonts-noto-cjk \
    fonts-noto-color-emoji && \
    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

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イメージのサイズは5GBぐらいまでなら、ええかと思ってる。
libreofficeとかvscode使うし。

最初のFROMに名前をつけて、元の記述の最後のほうにある「Docker config」のコメント手前に自分用の設定入れてる。

多いなぁ。⭐️で用途書いといたら忘れんかな。

FROM ubuntu:22.04 AS ububase    ⭐️名前つけといて後のほうで使う

ENV DEBIAN_FRONTEND noninteractive

:(中略)
    sed -i "s/xrdp\/xorg/xorg/g" /etc/xrdp/sesman.ini && \
    echo "xfce4-session" >> /etc/skel/.Xsession

##############
## For gvis
##############

RUN apt-get -y upgrade  ⭐️お決まり

RUN apt-get install -y \
    fonts-ipafont \
    git \               ⭐️gitクライアント使うのに要る
    curl \              ⭐️モジュールのダウンロードにに要る
    featherpad \        ⭐️メモ帳として使うのに要る
    gvfs-backends \     ⭐️smbサーバ参照に要る
    nmon \              ⭐️CPU/メモリとかリソース状態参照に要る
    vim \               ⭐️テキストファイル編集に要る
    dnsutils \          ⭐️nslookup利用に要る
    iputils-ping \      ⭐️ping利用に要る
    net-tools \         ⭐️非推奨っぽいけどifconfig使うのに要る
    mysql-client \                  ⭐️mariadbの接続確認とテーブル存在確認に要る
    libreoffice \                   ⭐️office利用に要る
    libreoffice-l10n-ja \           ⭐️office利用に要る
    libreoffice-dmaths \            ⭐️office利用に要る
    libreoffice-ogltrans \          ⭐️office利用に要る
    libreoffice-writer2xhtml \      ⭐️office利用に要る
    libreoffice-pdfimport \         ⭐️office利用に要る
    libreoffice-help-ja \           ⭐️office利用に要る
    evince \                        ⭐️pdf閲覧に要る
    software-properties-common \    ⭐️firefoxインストールに要る
    gnome-calculator && \           ⭐️電卓利用に要る
    apt autoremove -y && \
    rm -rf /var/cache/apt /var/lib/apt/lists

RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
RUN install -o root -g root -m 644 microsoft.gpg /etc/apt/trusted.gpg.d/
RUN /usr/bin/sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list'
RUN apt install apt-transport-https
RUN apt update
RUN apt install code                ⭐️vscodeのインストール

RUN apt remove snap
## RUN apt-get install software-properties-common
RUN add-apt-repository ppa:mozillateam/ppa
RUN echo "Package: firefox*"                 >  /etc/apt/preferences.d/mozillateamppa
RUN echo "Pin: release o=LP-PPA-mozillateam" >> /etc/apt/preferences.d/mozillateamppa
RUN echo "Pin-Priority: 1001"                >> /etc/apt/preferences.d/mozillateamppa
RUN apt-get -y update 
RUN apt-get -y upgrade
RUN apt install firefox xul-ext-ubufox  ⭐️fireroxのインストール

## RUN curl https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
## RUN echo 'deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main' | sudo tee /etc/apt/sources.list.d/google-chrome.list
## RUN apt-get -y update 
## RUN apt-get -y upgrade
## RUN apt install google-chrome-stable libu2f-udev ⭐️chromeのインストール

RUN echo "alias sc='cd /gvis/script'"              >> /root/.bashrc
RUN echo "alias tree=\"pwd;find . | sort | sed '1d;s/^\.//;s/\/\([^/]*\)$/|--/;s/\/[^/|]*/|  /g'" \" >> /root/.bashrc
RUN echo "alias dff='df -h | grep -v DockerSys | grep -v "dev/loop"' "                                 >> /root/.bashrc
RUN echo "PATH=/gvis/script/proc:$PATH:$HOME/bin"  >> /root/.bashrc
RUN echo "export PATH"                             >> /root/.bashrc ⭐️rootユーザのbashrc設定

RUN useradd -m -s /usr/bin/bash -u 1000 nari        ⭐️普段使うユーザを作る

RUN sudo su - nari
RUN echo "alias sc='cd /gvis/script'"              >> /home/nari/.bashrc
RUN echo "alias tree=\"pwd;find . | sort | sed '1d;s/^\.//;s/\/\([^/]*\)$/|--/;s/\/[^/|]*/|  /g'" \" >> /home/nari/.bashrc
RUN echo "alias dff='df -h | grep -v DockerSys | grep -v "dev/loop"' "                                 >> /home/nari/.bashrc
RUN echo "PATH=/gvis/script/proc:$PATH:$HOME/bin"  >> /home/nari/.bashrc
RUN echo "export PATH"                             >> /home/nari/.bashrc ⭐️普段使うユーザのbashrc設定

FROM ububase    ⭐️レイヤのまとめ

# Docker config
EXPOSE 3389
ENTRYPOINT ["/usr/bin/run.sh"]

以下、留意点。

  1. 最初の1行目でやってるFROMでは名前をつけて、最後のほうのFROM ububaseでイメージのサイズをできるだけ縮める
  2. libreofficeはapt install libreoffice*ってやったら一発で終わるはずなんやけど、エラー出るようになったから1個ずつ書いてる
  3. software-properties-commonはfirefox入れるのに使ってるけど、前でやってるapt-getに入れとかなエラーになる
  4. chromeはGCPのxrdpでだけ使うからローカルlinuxでは入れない
  5. chromeとfirefoxは、ビルド途中見てるとモジュール導入の「提案」って出てくるから、それぞれ「xul-ext-ubufox/libu2f-udev」を一緒に入れないとエラーになる
  6. alias設定のtreeの設定はダブルクオートで囲む箇所はエスケープする
  7. EXPOSEする直前にFROMをもう1回書いておいて、最初に宣言した名前を参照する

dockerはイメージ取扱いの際にレイヤーを使う。
RUN COPYとかRUN apt-getとか、dockerfileに書いた1つ1つのステップにレイヤが作られるように見える。

だからそのステップが多いほどレイヤが使われるみたいなんやけど、マルチステージビルドってのがあってレイヤを1つにできるらしい。

マルチステージビルドの利用
マルチステージイメージを使って、イメージサイズを小さく維持する。

ビルド結果

ビルドがちゃんとできるってことがビルドの検証でわかってたら、なるべく1つにしてまうことでディスクの消費がおさえられるっぽい。
作り直す前で5.28GB。
毎月apt updateとかした後にdocker commitしてるから、少しずつ大きくなってる。

nari@nafslinux-ubu22:~$ docker images
REPOSITORY              TAG          IMAGE ID       CREATED        SIZE
gvis-ubu22              22gvis       7240c73b66ea   44 hours ago   5.28GB
:(中略)

マルチステージビルドで作り直してみた。

5分程度待つ。

nari@nafslinux-ubu22:/docker/nariDockerDat/cl_ubun22/download/container-xrdp$ docker build -f ./ubuntu-xfce/Dockerfile-gvis -t ubu:22gvis .
 => [ububase  1/34] FROM docker.io/library/ubuntu:22.04@sha256:ec050c32e4a6085b423d  1.7s
 => => resolve docker.io/library/ubuntu:22.04@sha256:ec050c32e4a6085b423d36ecd025c0  0.0s.
 => => sha256:ec050c32e4a6085b423d36ecd025c0d3ff00c38ab93a3d71a460f 1.13kB / 1.13kB  0.0s
 => => sha256:56887c5194fddd8db7e36ced1c16b3569d89f74c801dc8a5adbf48236 424B / 424B  0.0s.
 => => sha256:01f29b872827fa6f9aed0ea0b2ede53aea4ad9d66c7920e81a8db 2.30kB / 2.30kB  0.0s
 => => sha256:b237fe92c4173e4dfb3ba82e76e5fed4b16186a6161e07af158 29.54MB / 29.54MB  0.7s
 => => extracting sha256:b237fe92c4173e4dfb3ba82e76e5fed4b16186a6161e07af15814cb40e  0.9s
 => [internal] load build context                                                    0.0s
 => => transferring context: 1.69kB                                                  0.0s
 => [ububase  2/34] RUN apt-get -y update                                            4.9s
 => [ububase  3/34] RUN apt-get -y upgrade                                           3.5s
 => [ububase  4/34] RUN apt-get install -y     xfce4     xfce4-clipman-plugin       60.1s
 => [ububase  5/34] RUN apt-get install -y     sudo     wget     xorgxrdp     xrdp  22.3s
 => [ububase  6/34] RUN locale-gen ja_JP.UTF-8     && echo 'LC_ALL=ja_JP.UTF-8' > /  1.0s
 => [ububase  7/34] RUN cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime     && ech  0.4s
 => [ububase  8/34] COPY ./build/ubuntu-run.sh /usr/bin/                             0.0s
 => [ububase  9/34] RUN mv /usr/bin/ubuntu-run.sh /usr/bin/run.sh                    0.4s
 => [ububase 10/34] RUN chmod +x /usr/bin/run.sh                                     0.3s
 => [ububase 11/34] RUN mkdir /var/run/dbus &&     cp /etc/X11/xrdp/xorg.conf /etc/  0.3s
 => [ububase 12/34] RUN apt-get -y update                                            5.1s
 => [ububase 13/34] RUN apt-get -y upgrade                                           1.2s
 => [ububase 14/34] RUN apt-get install -y     fonts-ipafont     git     curl       59.1s
 => [ububase 15/34] RUN curl https://packages.microsoft.com/keys/microsoft.asc | gp  0.6s
 => [ububase 16/34] RUN install -o root -g root -m 644 microsoft.gpg /etc/apt/trust  0.3s
 => [ububase 17/34] RUN /usr/bin/sh -c 'echo "deb [arch=amd64] https://packages.mic  0.3s
 => [ububase 18/34] RUN apt install apt-transport-https                              0.4s
 => [ububase 19/34] RUN apt update                                                   5.4s
 => [ububase 20/34] RUN apt install code                                            11.2s
 => [ububase 21/34] RUN apt remove snap                                              1.3s
 => [ububase 22/34] RUN add-apt-repository ppa:mozillateam/ppa                       7.5s
 => [ububase 23/34] RUN echo "Package: firefox*"                 >  /etc/apt/prefer  0.4s
 => [ububase 24/34] RUN echo "Pin: release o=LP-PPA-mozillateam" >> /etc/apt/prefer  0.3s
 => [ububase 25/34] RUN echo "Pin-Priority: 1001"                >> /etc/apt/prefer  0.3s
 => [ububase 26/34] RUN apt-get -y update                                            2.0s
 => [ububase 27/34] RUN apt-get -y upgrade                                           1.4s
 => [ububase 28/34] RUN apt install firefox xul-ext-ubufox                          16.2s
 => [ububase 29/34] RUN curl https://dl.google.com/linux/linux_signing_key.pub | su  0.7s
 => [ububase 30/34] RUN echo 'deb [arch=amd64] http://dl.google.com/linux/chrome/de  0.4s
 => [ububase 31/34] RUN apt-get -y update                                            2.3s
 => [ububase 32/34] RUN apt-get -y upgrade                                           1.4s
 => [ububase 33/34] RUN apt install google-chrome-stable libu2f-udev                 9.4s
 => [ububase 34/34] RUN useradd -m -u 1000 nari                                      0.3s
 => exporting to image                                                               4.6s
 => => exporting layers                                                              4.6s
 => => writing image sha256:8d3505028865ad177f1a4bc67f91de7c4b1e302168de1e404a9ea77  0.0s
 => => naming to docker.io/library/ubu:22gvis                                        0.0s
nari@nafslinux-ubu22:/docker/nariDockerDat/cl_ubun22/download/container-xrdp$

サイズ確認してみる。

nari@nafslinux-ubu22:~$ docker images
REPOSITORY              TAG          IMAGE ID       CREATED        SIZE
gvis-ubu22              22gvis       7b8f0240f10a   2 days ago     3.48GB
:(中略)

3.48GB程度に縮んでくれた。
半年ぐらいしたら、またサイズ増えた頃にビルドしよ。

ローカルlinuxのxrdpコンテナ

普通にrdp接続して開く。右下の小さなコンソールで、ちゃんとmariadbにつながってる。

gvis-docker-ubu22xrdp

ここではvscode設定とかsmb接続の認証情報を保存して、他の細かい設定もやっとく。

macのminikubeの中で動いているxrdpコンテナ

ローカルlinuxで動くコンテナの背景色をグレーにして動かしておいて、docker saveして作ったイメージをmacのminikubeに持ってきて、それをPodとして動かす。

gvis-docker-ubu22xrdp

こっちもmacのminikubeにあるxrdpポッドからmysqlクライアント起動して、ローカルlinuxのmariadbへ接続できてる。

ローカルlinuxのdockerコンテナからできてるから、時計表示のカスタマイズもできてるし、smb接続認証情報もちゃんと同じものが再現される。

しっかしガッキーは美人やなぁ。

gvis-docker-ubu22xrdp

vscode使ってdjangoのソースもちゃんといじれる。
linuxの場合は~/.vscode/extensionsを維持したら、いつものプラグインとか設定を維持できる。

gvis-docker-ubu22xrdp

firefoxの細かい設定(ダークモード表示とか)も維持できてるし、ちゃんとイントラのwebも見えてる。

結果

ビルドしなおした後、1時間ぐらいかけてvscodeとかfirefoxとか設定してたのが15分ぐらいでできるようになった。

apt-getでモジュール更新の積み重ねで肥大化するけど、dockerイメージも3.5GBぐらいにできた。

次は半年後にまたやってみよっか。

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