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で遊んだり、趣味で開発したり。