Docker 上の Ubuntu にリモートデスクトップ環境を構築する

手順

基本的に以下の記事を参考にして構築。

検証

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 からリモートデスクトップで接続してみます。

Docker 上の Ubuntu へリモートデスクトップ接続する
Docker 上の Ubuntu へリモートデスクトップ接続する

まずは 127.0.0.1:13389 と、自分自身に対して先程コンテナを建てるときに紐付けたポート番号でリモートデスクトップ接続を試みます。

Docker 上の Ubuntu へリモートデスクトップ接続する
Docker 上の Ubuntu へリモートデスクトップ接続する

警告も「はい」で進んでいきます。

Docker 上の Ubuntu へリモートデスクトップ接続する
Docker 上の Ubuntu へリモートデスクトップ接続する

Xorg で root ユーザ、先程設定したパスワードを入力します。

Docker 上の Ubuntu へリモートデスクトップ接続して表示されたデスクトップ画面
Docker 上の Ubuntu へリモートデスクトップ接続して表示されたデスクトップ画面

見事、 Ubuntu のデスクトップ画面に接続できました。

Docker 上の Ubuntu へリモートデスクトップ接続して表示されたデスクトップ画面
Docker 上の Ubuntu へリモートデスクトップ接続して表示されたデスクトップ画面

ローカル環境は Ubuuntu そのものですね。

これで Windows PC の Docker 環境内に Ubuntu のデスクトップ環境を作ることができました。

参考

公式デスクトップ

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

akarita/docker-ubuntu-desktop

dorowu/ubuntu-desktop-lxde-vnc

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。