手順
基本的に以下の記事を参考にして構築。
検証
Ubuntu の最新版のイメージが pull
されていることを前提として、以下のコマンドを実施。
> docker run -itd --privileged -p 3222:22 -p 13389:3389 -p 5901:5901 --name hollow --hostname ubuntu:latest ubuntu
> docker exec -it hollow /bin/bash
イメージからコンテナを建てて、必要なパッケージのインストール (systemctl
を使えるようにする)。
# apt -y update && apt -y upgrade
# apt install -y init systemd
この時点で xrdp
, ubuntu-desktop
までインストールするとイメージが巨大になってしまうせいか、自PC環境では動作が遅くなってしまって(CPU使用率が割り当ての100%越えから降りてこない)その後の作業が満足にできなくなってしまいました。
そのため、これらのパッケージは後でインストールすることにします。
# exit
いったん仮想環境から抜けます。
> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
xxxxxxxxxxxx ubuntu "/bin/bash" 11 minutes ago Up 11 minutes 0.0.0.0:5901->5901/tcp, 0.0.0.0:3222->22/tcp, 0.0.0.0:13389->3389/tcp hollow
> docker commit xxxxxxxxxxxx arrancar:0.1
コミットしてイメージを固めたら、これから起動しようとするイメージとポートがバッティングするため元のコンテナを停止、削除します。
> docker run -itd --privileged -p 3222:22 -p 13389:3389 -p 5901:5901 --name espada --hostname arrancar:0.1 arrancar:0.1 /sbin/init
> docker exec -it espada /bin/bash
先程コミットして固めたイメージから再度コンテナを建てます。今度は /sbin/init
を指定するのがミソ。
# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 1.7 0.5 166996 10496 ? Ss 19:15 0:12 /sbin/init
## 略
PID 1 に /sbin/init
が当たっていることを確認できたら次へ。
# apt install -y xrdp ubuntu-desktop
6. Asia
79. Tokyo
55. Japanese
1. Japanese
ここで xrdp
, ubuntu-desktop
をインストールします。地域やタイムゾーン、言語は上述のものを選択。
# systemctl status xrdp
○ xrdp.service - xrdp daemon
Loaded: loaded (/lib/systemd/system/xrdp.service; enabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:xrdp(8)
man:xrdp.ini(5)
インストール完了後に systemctl
で確認すると起動していない状態だと分かります。
# systemctl start xrdp
起こします。
# systemctl status xrdp
● xrdp.service - xrdp daemon
Loaded: loaded (/lib/systemd/system/xrdp.service; enabled; vendor preset: enabled)
Active: active (running) since www yyyy-mm-dd hh:ii:ss JST; 12s ago
Docs: man:xrdp(8)
man:xrdp.ini(5)
Process: 27207 ExecStartPre=/bin/sh /usr/share/xrdp/socksetup (code=exited, status=0/SUCCESS)
Process: 27215 ExecStart=/usr/sbin/xrdp $XRDP_OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 27216 (xrdp)
Tasks: 1 (limit: 2364)
Memory: 1.2M
CPU: 14ms
CGroup: /system.slice/xrdp.service
└─27216 /usr/sbin/xrdp
## 略
起動しました。
# passwd
New password:
Retype new password:
passwd: password updated successfully
リモートデスクトップ時に必要なので root
ユーザのパスワードを設定します。
ここまで設定したら、いよいよホスト側の Windows からリモートデスクトップで接続してみます。
まずは 127.0.0.1:13389
と、自分自身に対して先程コンテナを建てるときに紐付けたポート番号でリモートデスクトップ接続を試みます。
警告も「はい」で進んでいきます。
Xorg で root
ユーザ、先程設定したパスワードを入力します。
見事、 Ubuntu のデスクトップ画面に接続できました。
ローカル環境は Ubuuntu そのものですね。
これで Windows PC の Docker 環境内に Ubuntu のデスクトップ環境を作ることができました。
参考
公式デスクトップ
- 【Docker】Ubuntuコンテナで公式GUIデスクトップ起動する手順 | インフラエンジニアの技術LOG
- Ubuntu 20.04 LTS に後から GUI (X Window System) を追加する – CUBE SUGAR CONTAINER
xrdp
起動確認
systemctl status xrdp
したら inactive と言われたので systemctl start xrdp
。
Failed to restart xrdp.service Transport endpoint is not connected
Failed to restart xrdp.service Transport endpoint is not connected
あまり参考にならず。
以下未使用
uphy/ubuntu-desktop-jp
- Ubuntu GUI環境をDocker上に作成する – ニッチな技術録
- uphy/ubuntu-desktop-jp – Docker Image | Docker Hub
- ブラウザで動かせる「Linux」の「Ubuntu 22.04」のデスクトップ版(Xfce)のDockerイメージ「docker-ubuntu-desktop」を作りました #Docker – Qiita