Docker上にGanache環境を構築する

# はじめに
Docker上にGanacheをインストールして、GUIでTXの確認を出来るようにする。

:::note warn
下記手順でひとまずDockerのUbuntu上にGanache環境を構築できますが、ちょっと使いづらいかなという部分があります。（末尾に記載）
こちらに関しては筆者のLinuxの知識が浅い面もあり、進展あり次第追記していきたいと思います。
:::

# バージョン
執筆時点(2021/08/29)での筆者の環境です。
・Docker: 20.10.8
・Ubuntu: 20.04
・Ganache: 2.5.4

# 手順
1.Docker上にUbuntuのデスクトップ環境を構築する
2.Ganacheのダウンロード
3.Ganacheの起動

### 1.Docker上にUbuntuのデスクトップ環境を構築する
下記Qiitaの記事を参考に進めて無事リモートデスクトップ環境の構築と、
ローカルからのアクセスが出来ました。
参考：[Dockerに構築したLinuxにリモートデスクトップで接続する](https://qiita.com/rs_/items/6af6fe4d7858950e2062)
※こうやってまとめてくださっていると、普段触らない技術と相対する時に
　本当に助かります。ありがとうございます。

今回は上記参考記事からポートフォワードの指定を追加しています。
Ganacheへアクセスするポート番号がデフォルトで7545のため、
ポートフォーワードで外部からコンテナの7545にアクセスできるように指定します。

```
docker run -name コンテナ名 -p 13389:3389 -p 7545:7545 -it イメージ名 /bin/bash
```
※7545以外のポートでアクセスしたい場合は`-p 7545:7545`部分を適宜変更してください。

### 2.Ganacheのダウンロード
#### リモートデスクトップ接続
コンテナ作成／起動後、ローカル環境からリモートデスクトップでアクセスします。
上記参考手順に従って、リモートデスクトップへアクセスします。

#### Ganacheのダウンロード
リモートデスクトップで接続したUbuntu上のブラウザより
[Ganacheのサイト](https://www.trufflesuite.com/ganache)へアクセス。
https://www.trufflesuite.com/ganache

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1770163/ea761c4d-e0d0-27b2-f064-541b32263d1f.png)

DOWNLOADボタンを押下。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1770163/5625281b-d93c-d1a1-97d0-7314954f2a02.png)

SaveFileを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1770163/537aebae-58da-a6da-b390-5a01c7c74d15.png)

フォルダアイコン押下で、エクスプローラでダウンロード先を表示。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1770163/7ec8b70f-2092-f0bf-49ab-b69f73a3edb4.png)

デフォルトでDownloadsフォルダへ格納されるため、.AppImageファイルを任意の作業用フォルダへ移動。
※私は`/root/work`フォルダへ移動しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1770163/809a034a-0b56-02f4-8d22-a8d4ed89d693.png)

### 3.Ganacheの起動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1770163/7ba16ffe-37e0-9f4f-63c9-ff5a5b103abe.png)

Ganacheの公式手順だとダウンロード後にダブルクリックで実行できるようなのですが、出来ませんでした。
なので、ターミナルから実行していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1770163/d1228569-9766-d098-fb24-c39a3ad491c4.png)

.appimageファイルのコピー先まで移動して、
下記コマンドを実行して権限を付与します。

```
# cd コピー先のフォルダパス
# chmod a+x ganache-2.5.4-linux-X86_64.AppImage
```

権限が付与されたので、下記コマンドを叩いてGanacheを起動させます。

```
./ganache-2.5.4-linux-X86_64.AppImage --appimage-extract-and-run
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1770163/6fc10506-2002-0b46-41f5-2d72151fcfa4.png)

少し待つとウインドウが表示されます！
ちなみにこの画面はGoogle Analyticsの追跡を許可するか否かの選択画面です。（Ganache公式手順にも説明あり）
内容を読んで、任意の設定で`CONTINUE`を押下しましょう。
※この追跡は匿名で、アカウントデータ・秘密鍵の共有などが行われることはないそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1770163/ad380d64-7c33-785e-01a6-82ec3ff80686.png)

`CONTINUE`押下後、上記画面が表示されます。
今回は特に設定もせず、さくっと立ち上げてみましょう。
`QUICKSTART`を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1770163/52eba443-37ef-b6cf-93ec-439b99c3b796.png)

上記画面が表示され、Ganacheの起動は完了です！
`QUICKSTART`を選択した場合はデフォルトでランダムな10個のアドレスが生成され、それぞれ100ETH保持した状態で起動します。
この状態でプライベートチェーンのEthereum環境が利用できるようになっています。

ただ、注意点として、
`QUICKSTART`で起動した場合、Ganacheを終了すると今までの取引履歴が削除されてしまいます。
アドレスも再びランダムなものが10個生成されるため、終了前と同じ環境を利用することができないため、
長期間の作業、運用はできません。

以前の環境を保持しておくためには`QUICKSTART`ではなく、`WORKSPACE`を作成して進めていく必要がありますが、
それはまたTruffleと連携させる際に記載したいと思います。


# おわりに
前述した通り、ひとまずGanacheを動かすところまでは完了。
アプリ実行（ダブルクリック）で躓きましたが、起動してからの操作は比較的簡単そうです。

積み残しとして、以下は今後の課題です。

-----
##### ・コンテナ起動直後はリモートデスクトップで接続できない
コンテナ起動直後はxrdpがうまく起動できていない？せいか、リモートデスクトップにアクセスできません。
現状、コンテナ起動後に一度ターミナルで入り、下記コマンドを実行することで、リモートデスクトップでのアクセスが可能になります。

```
/etc/init.d/xrdp stop
/etc/init.d/xrdp start
```

ただ、毎度ターミナルに入って、、、というのは面倒くさい。
コンテナ起動時に任意のスクリプトを実行できるはずなので、要調査。

##### ・リモートデスクトップアクセス時pidエラーのダイアログが表示される
色々調べてみたところWSL環境ではDockerのコンテナにログインしたユーザーへのpidの紐づけ？が
うまくできないようです。
筆者はそもそもpidって？くらいの知識なので、この辺りは要勉強です。汗
※genieなるものをインストールすればpid=1も利用できるようになるという記事も観ましたが、
　うまくいきませんでした。
　`genie -s`を実行すると下記エラーが発生してしまった。

```
genie: initializing bottle failed; bind mounting hostname
```


##### ・Ganacheをアイコンダブルクリックで実行できない
本来.AppImageファイルはダブルクリックで実行可能なようですが、
私の環境ではうんともすんとも言いませんでした。
権限周りが怪しいので調べてみたのですが、解決には至りませんでした。
そのため、ひとまず`--appimage-extract-and-run`オプションを付けて、実行出来るようにしています。

-----

# 参考
・LinuxでAppImage形式のアプリを使う方法と注意点のまとめ
https://www.virment.com/how-to-use-appimage-linux/
・第22回　WSL2の新機能を試してみよう
https://www.school.ctc-g.co.jp/columns/miyazaki/miyazaki22.html


以上ですー。