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

ここではvscode設定とかsmb接続の認証情報を保存して、他の細かい設定もやっとく。
macのminikubeの中で動いているxrdpコンテナ
ローカルlinuxで動くコンテナの背景色をグレーにして動かしておいて、docker save
して作ったイメージをmacのminikubeに持ってきて、それをPodとして動かす。

こっちもmacのminikubeにあるxrdpポッドからmysqlクライアント起動して、ローカルlinuxのmariadbへ接続できてる。
ローカルlinuxのdockerコンテナからできてるから、時計表示のカスタマイズもできてるし、smb接続認証情報もちゃんと同じものが再現される。
しっかしガッキーは美人やなぁ。

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

firefoxの細かい設定(ダークモード表示とか)も維持できてるし、ちゃんとイントラのwebも見えてる。
結果
ビルドしなおした後、1時間ぐらいかけてvscodeとかfirefoxとか設定してたのが15分ぐらいでできるようになった。
apt-getでモジュール更新の積み重ねで肥大化するけど、dockerイメージも3.5GBぐらいにできた。
次は半年後にまたやってみよっか。