ブラウザ操作のリモードデスクトップ環境(KasmVNC)をDockerで実行する手順

# 概要

[KasmVNC](https://github.com/kasmtech/KasmVNC) という、ウェブブラウザを経由してアクセスできるリモードデスクトップ環境を、Dockerでセットアップする手順です。

動作確認や機能検証を意図しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/decfc1a9-3216-6326-7be9-731e78899609.png)



# 説明

KasmVNC とは、リモードデスクトップ環境を提供するソフトで、Docker コンテナ内にウェブサーバと WebSocket サーバが組み込まれています。つまり、ブラウザさえあれば Ubuntu の Desktop 環境にアクセスしたり、Terminal のみの環境を用意できます。オープンソース(GPL v2.0)で公開されており、Docker イメージは Docker Hub 上で公開されています。

Docker コンテナで動かせるため、１つの Linux ホスト上で複数の環境を（リソースが許す限り）混在できます。リモードデスクトップの操作は、VNC クライアントを必要とせず、すべてブラウザから操作します。

そのため用途としては、たとえば、フィッシング詐欺等やウイルスの懸念があり、PCを通した URL でのアクセスを躊躇する場合、その調査用として使うことが想定できます。あるいは、完全にサンドボックス環境として、壊しても良い Linux デスクトップ環境としても使えるという期待ができます。また、古のゲーム [Doom イメージ](https://hub.docker.com/r/kasmweb/doom) も公開されており、気分転換にプレイしても良いかもしれません。

利用できるデスクトップやアプリケーションの種類は [Docker Hub の Kasm Technologies のリポジトリ](https://hub.docker.com/u/kasmweb) で確認できます。たとえば、 `desktop` は標準的なデスクトップ環境ですし、 `ubuntu-bionic-desktop` であれば Ubuntu 18.04 のデスクトップ環境です。また、 ``terminal`` であれば、その名の通りターミナルだけを操作可能な環境にします。

全画面表示ができたり、クリップボードを編集できるなど、割と使い勝手は良い印象です。

一方、 sudo コマンドでシステムの設定変更ができなかったり、ibus が起動できないため日本語環境が設定できない課題がありそうです（回避策は調べています。何か分かったら追記します）。

本記事は Linux サーバでの利用を想定しています。VPS なり様々な Iaas 環境のサーバ等々を利用できますが、ブラウザに対するストリーミングを行うため、環境によっては課金や帯域等、考慮が必要になる場合があります。なお私は、さくらのクラウド上の Ubuntu Server 20.04 + Docker Engine 20.10.16 で試しました。

また、Docker Desktop でも動作するだろうとは思いますが（まだ試していません）、イメージがギガ単位で大きいため、環境によってはイメージをダウンロードするだけでも時間がかかる可能性があります。

# 設定方法

## 事前準備

- Linux ホスト上に Docker Engine をセットアップし、 `docker` コマンドが使えるようにする必要があります。

## 共通する作業の流れ

起動コマンド
```
sudo docker run --rm  -it --shm-size=512m -p 6901:6901 -e VNC_PW=<パスワード>kasmweb/<イメージ名>:<タグ>
```

- `--shm-size=512m` はドキュメント例示のデフォルトのままですが、必要があれば変えてもいいかもしれません。
- Port マッピングの `-p 6901:6901` は、ホスト側のポート重複がなければ、複数のコンテナを同時実行できます。
- `<パスワード>` はブラウザからの認証に使うためのパスワード。ちなみにユーザ名は `kasm_user` 。
- `<イメージ名>` は  [Docker Hub の Kasm Technologies のリポジトリ](https://hub.docker.com/u/kasmweb) にあるものを指定。
- `<タグ>` は、それぞれのイメージのタグ。 `latest` は存在していないので、現行バージョンであれば `1.10.0-rolling` のような指定が必須。


起動したいイメージを起動しようとすると、イメージのダウンロードが始まります。起動が完了するまで待ちます（画面にログが流れます）。

起動完了すると、ブラウザで `https://<ip>:6901/` に HTTPS で接続を試みます。コンテナ起動時、自己署名の SSL 証明書を作成しているため、ブラウザでは警告が出ます。これを解除すると、ブラウザからアクセスできます。

ブラウザの認証画面では、 ユーザ `kasm_user` 、パスワードは `docker run` 時に指定したものです。

接続に成功すると、ブラウザはこのような画面になります。「接続」をクリックすると、それぞれのデスクトップやアプリケーションに接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/d266b8fc-738e-a79c-f63b-76a226639fa1.png)

画面左側に出ている部分で、全画面に切り替えたり、設定メニューを表示できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/476d530c-f20e-3d5e-f2ad-ab2a515b4515.png)


終了は `Ctrl+C` です。バックグラウンドで起動した場合は `docker stop` などで止めます。


## Ubuntu のデスクトップを起動する手順


``ubuntu-bionic-desktop:1.10.0`` (18.04)イメージや ``ubuntu-focal-desktop:develop-rolling`` (20.04)のイメージを使います。

20.04の開発版：

```bash
sudo docker run --rm  -it --shm-size=512m -p 6901:6901 -e VNC_PW=mypassword kasmweb/ubuntu-focal-desktop:develop-rolling
```

※ VNC_PW は書き換えてください

ブラウザで指定したポートにアクセスし、認証した後、接続すると、このようにデスクトップ環境を操作できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/23558187-d1db-d24c-63df-53d08a7b5b29.png)


## Chorome を使う手順

``kasmweb/chrome:1.10.0-rolling`` イメージを使います。

```bash
sudo docker run --rm  -it --shm-size=512m -p 6901:6901 -e VNC_PW=mypassword kasmweb/chrome:1.10.0-rolling
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/e794309a-d123-e578-a777-7cc7c2702b91.png)



## Terminal を使う手順

`kasmweb/terminal:1.10.0-rolling` イメージを使います。

```bash
sudo docker run --rm  -it --shm-size=512m -p 6901:6901 -e VNC_PW=mypassword kasmweb/terminal:1.10.0-rolling
```

何の変哲もない Terminal だけが起動できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/8c5c10e4-9633-4b91-89bf-807971a72576.png)

何かコマンドを実行してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/d045cafc-670f-5f90-0006-eed07eb7722a.png)


## Doom を使う手順

`kasmweb/doom:1.10.0-rolling` イメージを使います。

```bash
sudo docker run --rm  -it --shm-size=512m -p 6901:6901 -e VNC_PW=mypassword kasmweb/doom:1.10.0-rolling
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13002/03ecfe88-cfcd-68e3-ab33-10fa3a57c7b6.png)


他にも何か面白そうなものがないか、探してみてはどうでしょう。

Enjoy!


# 注意点

Docker イメージの容量が大きいので、システム上の容量圧迫に注意が必要です。容量が少ない場合、油断していると、すぐに圧迫します。

```bash
ubuntu@kasm1:~$ docker images
REPOSITORY                      TAG              IMAGE ID       CREATED        SIZE
kasmweb/centos-7-desktop        1.10.0-rolling   e006f385c881   23 hours ago   3.41GB
kasmweb/terminal                1.10.0-rolling   7baf989f9f9e   23 hours ago   1.46GB
kasmweb/desktop                 1.10.0-rolling   bb2885052746   23 hours ago   1.78GB
kasmweb/ubuntu-bionic-desktop   1.10.0           60c7f07497b3   6 months ago   5.45GB
```

# 参考

- kasmtech/KasmVNC: Modern VNC Server and client, web based and secure
  - https://github.com/kasmtech/KasmVNC
- kasmweb's Profile | Docker Hub
  - https://hub.docker.com/u/kasmweb