WSL2 + Docker(ubuntu18.04) からGUIアプリを起動し、ついでにchromeも起動する

# 目的
windows subsystem for linux2(WSL2)のdocker環境からGUIアプリを起動する方法について説明します。ついでにchromeを起動する方法について説明します。
ちなみにWSL2からも同様の方法でGUIアプリを起動できます。

※この記事で解説しているDISPLAY設定の方法だとうまくいかなくなったので、[別の記事](https://qiita.com/chilchil0/items/e0b72912be244eab04dd) でうまくいく設定方法を解説しています。

# 参考にさせて頂いた記事
https://hnakamur.github.io/blog/2018/05/04/install-chrome-using-apt-on-ubuntu-18.04/
https://blog.cles.jp/item/10821
https://review-of-my-life.blogspot.com/2017/11/pythonbash-on-windowswindows-subsystem.html

# 作業環境
* Windows10 Home Insider Preview
  * バージョン:2004
  * OSビルドバージョン:19564
* WSL2 Ubuntu18.04
  * Remote-WSL(VSCode)
* docker(ubuntu)
  * 以下のDockerfileから作成されたコンテナを使用しました。

```
FROM ubuntu:18.04
ENV DEBIAN_FRONTEND=noninteractive
ENV LANG ja_JP.UTF-8

RUN apt-get update && apt-get install -y \
    sudo \
    python3 python3-pip \
    git \
    language-pack-ja \
    vim \
    xserver-xorg \
    x11-apps \
    openssh-server \
    curl \
    zip \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*

RUN apt-get -qq update
RUN apt-get -qq -y install curl

RUN pip3 install flake8 black
```

# GUIアプリ(x11-apps)を起動する手順
GUIアプリを起動する手順について記載します。

## Ubuntuでライブラリ，パッケージのインストールと設定
今回は事前にインストールされている為不要（Dockerfileにxserver-xorgをinstallする記載があります。）ですが、事前にインストールを行わない場合は以下を実施してインストールしておきます。x11-appsはxeyesコマンドなどのテスト用です。

```
$ sudo apt-get install xserver-xorg x11-apps
```

## windows上にX-windowサーバを導入
wsl2のコンテナ上でchromeを起動してもwindows上には表示できない為、X-windowサーバを導入する必要があります。
以下を参考にさせて頂きました。
https://estuarine.jp/2017/11/wsl-x-window/
https://necojackarc.hatenablog.com/entry/2019/10/09/080908

### VcXsrvのインストール
X Window serverはVcXsrvを利用する。Windows10上でダウンロードし、ダブルクリックしてデフォルトのままインストールします。ダウンロードは以下です。
https://sourceforge.net/projects/vcxsrv/
インストール中にwindowsのファイアウォールを許可するか聞かれるので許可します。

### XLaunchの起動
スタートメニューからXLaunchを起動して設定を行います。
ほとんどデフォルトで良いですが以下をチェックしないとGUIが表示されない為、ここにはチェックを付けます。（※もしかしたらチェックする必要はないかもしれません。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325874/bba7d6e2-8313-c32b-e077-1877b88ec020.png)

設定が完了したらセーブし、そのまま起動するとタスクバーの右下に以下の赤枠が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325874/6c7b84ff-e2e6-ebe6-a4cd-130d4ee2e7b8.png)

セーブしたXLaunchファイルを毎回起動することが面倒であればスタートアップに追加しておきましょう。

## DISPLAY設定を実施する
chromeを実行する前にGUIが起動するかどうか確認してみます。

```
$ xeyes
Error: Can't open display: 0:0
```
X displayの設定がうまくいっていないようなので/etc/resolve.confのnameserverからIPをとってきてDISPLAYに設定します。

```
$ LOCAL_IP=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')
$ export DISPLAY=$LOCAL_IP:0
```
そしてもう一度xeyesを実行すると、以下のGUIが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325874/d318c738-09ed-4b72-5f60-825e81c2f7e9.png)

これでGUIアプリを起動できるようになりました。
他のGUIアプリも起動できるようになるはずです。
WSL2でGUIアプリを起動する際も同様の方法でいけます。

※ちなみにDockerfileに「LOCAL_IP～」の設定を行ってもうまくDISPLAYの設定が出来ていません。何か方法があると思いますが、ここにあまり時間を掛けたくなかったので、保留しています。
ですのでベースのDockerfileを使ってコンテナ内に入って実行しています。あまり良くないですが。。

# google-chromeを実行する手順
引き続きchromeを実行する手順について記載します。

## コンテナにchromeをインストール
Chromeのリポジトリを追加します。

```
$ wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
$ sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
```
chromeをインストール

```
$ sudo apt update
$ sudo apt install google-chrome-stable -y
```
これでchromeはインストールできました。

## google-chromeのエラー対応
chromeを起動するが以下のようなエラーが発生します。

```
$ google-chrome
[2664:2664:0220/133551.864270:ERROR:zygote_host_impl_linux.cc(89)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180.
```
--no-sandboxを付けないとダメなようです。
詳細はエラーにあるように以下のページを参考にします。
https://bugs.chromium.org/p/chromium/issues/detail?id=638180

ということで上記オプションを付けて再度実施します。

```
$ google-chrome --no-sandbox
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
[2675:2694:0220/134407.629731:ERROR:bus.cc(393)] Failed to connect to the bus: Failed 
～省略～
```

色々エラーが出ますがchromeは起動します。但し、文字が化けています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325874/f47dccc1-a87c-6f0e-c747-f912cc35c9c1.png)

日本語が化けているので日本語フォントを以下のようにしてインストールし、再度上記コマンドを実施します。ライセンス的に問題がないtakaoフォントを使用します。（他の日本語フォントでも可）

```
$ sudo apt install fonts-takao
$ google-chrome --no-sandbox
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325874/1356564d-306d-1daa-72a1-52221520090a.png)

文字化けについての参考ページは以下です。
https://qiita.com/MERIK/items/ef4ecf7a51f89c403e94

## あとがき
chrome起動時のエラーとかは無視してますが、これで表題の環境からchromeは起動できるようになると思います。
間違っている個所などあれば指摘してください。