DockerもいいけどLXDもね 1 〜LXDEデスクトップ環境の構築〜
コンテナっていえばDockerみたいな風潮あるけど
LXDも便利ですよって話。
コンテナ界隈は小難しい話が多くてさっぱり付いていけませんが
軽量なVMが欲しい=LXD
ホストOSから隔離した環境でアプリ動かしたい=Docker
っていう感じで使ってます。
Dockerだとサービス起動とか難しいけどLXDは普通に最初から起動してて便利だね!
ってノリです
実行環境に関してはこっち見て下さい
インストールしてみる
snapモジュールで提供されています。
Linux Mintの人はsnapdを有効化するのにちょっと工夫が必要ですが。。。
snap install lxd
sudo lxd init --auto
でインストール完了です。
init時の--autoを外すと初期値の設定を色々自分でいじれます。
私はここ弄ったこと無いのでautoにしてます。
lxcとかlxdコマンドはlxdグループのメンバなら弄れますので
sudo面倒な場合は作業ユーザをlxdグループに所属させればOKです。
私はもう所属させちゃってますのでsudo省いてますが
所属させてない人はsudo付けてやってくださいね。
使えるイメージを探す
とりあえず使えるイメージの一覧はこれで取得出来ます。
# Ubuntuイメージサーバ上のイメージリスト
lxc image list ubuntu: amd64
# その他イメージサーバ上のイメージリスト
lxc image list images: amd64
一杯あるので自分の使ってるCPUのamd64アーキテクチャで絞っています。
興味がアレばamd64を消してどんなのがあるか確認してもいいですね。
とりあえずUbuntu21.04を使ってみる
lxc launch images:ubuntu/21.04 containername
images:ubuntu/21.04のimagesがイメージサーバの名前で:の後ろがイメージ名です
containernameがhost名になりますが省略するとランダムに割り当てられます。
イメージをダウンロードし終えたら起動するので確認してみましょう。
$ lxc list
+---------------+---------+----------------------+----------------------------------------------+-----------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+---------------+---------+----------------------+----------------------------------------------+-----------+-----------+
| containername | RUNNING | 10.116.214.82 (eth0) | fd42:d878:2ae:7d9e:216:3eff:fee5:7f32 (eth0) | CONTAINER | 0 |
+---------------+---------+----------------------+----------------------------------------------+-----------+-----------+
RUNNINGになってますね。
コンテナの中に入って何が動いているか見てみましょう
$ lxc shell containername
root@containername:~# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 01:14 ? 00:00:00 /sbin/init
root 43 1 0 01:14 ? 00:00:00 /lib/systemd/systemd-journald
root 78 1 0 01:14 ? 00:00:00 /lib/systemd/systemd-udevd
systemd+ 91 1 0 01:14 ? 00:00:00 /lib/systemd/systemd-networkd
root 107 1 0 01:14 ? 00:00:00 /usr/sbin/cron -f -P
message+ 108 1 0 01:14 ? 00:00:00 @dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
root 111 1 0 01:14 ? 00:00:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
syslog 112 1 0 01:14 ? 00:00:00 /usr/sbin/rsyslogd -n -iNONE
root 113 1 0 01:14 ? 00:00:00 /lib/systemd/systemd-logind
systemd+ 114 1 0 01:14 ? 00:00:00 /lib/systemd/systemd-resolved
root 123 1 0 01:14 pts/0 00:00:00 /sbin/agetty -o -p -- \u --noclear --keep-baud console 115200,38400,9600 linux
root 230 0 0 01:17 pts/0 00:00:00 bash
root 241 230 0 01:18 pts/0 00:00:00 ps -ef
なんということでしょう最低限のデーモンが稼働してます!
私みたいにDockerでやるべき事じゃないのにこれと同じようなこと実現しようとして涙ぐましい努力した人達なら血の悔し涙を流すレベルですね🙀
そしておもむろにGUIを構築
こんな豪華な環境なのにCUIでカチャカチャやるのってDockerやってるのと変わらなくてつまらないですよね?
とりあえずコンテナにGUI環境とVNCサーバをインストールしましょう
途中gdmかlightdmか聞かれたりしますがどっちでもいいです。
apt update -y
apt install -y lxde tightvncserver
ここで私は生粋の日本人なので日本語環境を入れます。
時間かかるので英語に自信ありな方々には不要ですので読み飛ばしてOKです。
apt install -y gnupg wget
wget -q https://www.ubuntulinux.jp/ubuntu-ja-archive-keyring.gpg -O- | apt-key add -
wget -q https://www.ubuntulinux.jp/ubuntu-jp-ppa-keyring.gpg -O- | apt-key add -
wget https://www.ubuntulinux.jp/sources.list.d/focal.list -O /etc/apt/sources.list.d/ubuntu-ja.list
apt update -y && apt upgrade -y && apt install -y ubuntu-defaults-ja
dpkg-reconfigure tzdata
update-locale LANG=ja_JP.UTF-8
デフォルトで存在するubuntuユーザでVNCサーバを起動します。
su ubuntu -c 'vncserver :1 -geometry 1920x1080 -depth 24'
geometryの引数がVNCの画面解像度になります。
フルスクリーンで使う場合は
xdpyinfo |grep dim
で現在の画面サイズを取得して同じものを設定すると良いと思います。
初回起動時だけVNC接続する時のPWを聞かれますので設定しましょう。
さてこれだけでもうデスクトップ環境は完成しています。
ホストOSに戻ってVNCで接続する為のクライアントをインストールしましょう。
すでに別のクライアント入ってるとか違うクライアントがいい人はそっち使って下さい。
apt install remmina remmina-plugin-vnc
そして起動したら
こんな感じで保存して接続します。
パスワードはvnc起動時に設定したものを入れて下さい。
avahiが最初から動いてるから
host名.localで繋がるね素敵だね
DockerだとInspectしてIP拾ったりって面倒だもんね!
Yahoo!😆
Dockerでこれやったことある人なら膝から崩れ落ちるレベルで簡単だったね!
自作を諦めて他人が作ったDockerfileさえ無い中身何されてるかわからないイメージをDockerhubから落として使ってる人もこれなら出来るよね!
ここからは普通にこの環境の上で好きに作業すると良いと思うよ!
で、一通り遊んだら止めようか
su ubuntu -c 'vncserver -kill :1'
exit
これでコンテナから抜けてホストOSに戻って
lxc stop containername
これで止まったよ!
また続きから始めたいと思ったら
lxc start containername
でコンテナが起動するのでvncを再度起動するんだけどコンテナ入るのも面倒だから直接打ち込んじゃおう
lxc exec containername -- su ubuntu -c 'vncserver :1 -geometry 1920x1080 -depth 24'
ほらRemminaからつないでご覧?
つながったでしょ😁
止める時も同じようにすればわざわざコンテナ入る必要もないよ便利だね!
。。。
まぁでももっと便利にしたいよね?
systemdあるんだからサービスに登録しちゃおう!
とりあえずコンテナに入ってサービスファイルを作ろう
lxc exec containername -- bash
vi /etc/systemd/system/vncserver@:1.service
viでに以下をコピペ
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target
[Service]
Type=forking
User=ubuntu
PAMName=login
PIDFile=/home/ubuntu/.vnc/%H%i.pid
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/bin/vncserver %i -geometry 1920x1080 -depth 24
ExecStop=/usr/bin/vncserver -kill %i
[Install]
WantedBy=multi-user.target
保存したらサービスに登録して一旦コンテナを止めよう
systemctl enable vncserver@:1
exit
lxc stop containername
これでサービスに登録されたので今度からはコンテナのstartする時に自動で起動してくるよ
やってみよう
lxc start containername
でワクワクしながらremminaからつないでみると。。。
つながったね😆
これでコンテナ起動するだけで使えるデスクトップの完成だ😎
ちなみにこれの使いどころだけど私みたいな低賃金傭兵の遊軍みたいな仕事の仕方してると
急に全然関係ない案件することになったりするのでこういう環境で開発したりしてるよ。
それでは最後にどれくらいの容量を使ってるか確認してみましょうホストOSで以下のコマンドを打つと出てきます。
lxc info containername
私の環境では
Disk usage:
root: 1.63GB
って出てましたDockerで同じような環境必死こいて作ってもそんなに変わらない容量取られるのでこんな簡単にデスクトップ環境構築できるなら断然こっち使ったほうがいいですね😻
それでは良いLinuxライフを!
昔こっぽり、てんぽろりん
P.S.
しかし職業的にはプログラマのはずなのに全然そっち方面の情報書いてないな。。。
書くとしたら
「低性能なオンプレサーバに全てEOL迎えたOS、ミドルウエア,言語を入れて開発する方法」
って内容になるよな。。。いらんなぁ。。。。
ゲームだったら
「スライムを呪いの装備で固めて戦わせるテイマーになる方法」
これとそんな変わらんよねこんな鬼畜ネタ職の情報誰もいらんわな。
まぁ私はリアルでそんなネタ職なんですけどね。
Discussion