PyCharmを介して、リモートRaspbian上のDockerコンテナ内でPythonファイルを実行する

[前回](https://qiita.com/K-USK/items/508e4accf757fe9ca4b5)からの続きです。今回はpycharmを介して、リモートdockerコンテナ内でpythonファイルを実行します。少しややこしいのでまとめると以下を行います。

* ファイルの編集はローカル上で行うが、これをリモート上と同期させる

* 実行時は、リモートのdockerにあるpythonインタプリタをpycharmに認識させて実行する

* リモートのdockerはリモート上のファイルを認識して実行する

dockerを使うかdocker composeを使うか以外は[こちら](https://qiita.com/wwacky/items/49d1a6239cd24bd12e71)と同一です。pycharmが直接リモート上のコードを編集できれば良い気がするのですが、なぜかこれはできません。

## Raspbian上のDockerの設定

### Dockerのサービスにアクセスするには

Dockerはクライアント・サーバモデルのアプリケーションであり、dockerデーモン(サーバ)に対して処理を要求を行うことでdockerを利用することができます。dockerコマンドを通す際などデフォルトではUnixソケットを通して通信を行っていますが、設定を行えばTCPソケットを通して通信を行うこともできます。これを利用するとローカルからリモート上のdockerデーモンに処理を要求することができます。この辺りのdockerの仕組みに関しては[こちらのサイト](https://www.ogis-ri.co.jp/otc/hiroba/technical/docker/part6.html)が参考になりました。ちなみに、ローカルのUnixソケットをリモート上のUnixソケットにフォワードすることでも、リモートからサーバのdockerを動かすこともできるみたいです。

### 設定

参考サイトそのままですが、以下を実行することで、remoteのdockerにtcpソケットを通して処理を要求することができます。（本来は、通信を行う際に証明書を利用しないと本番環境では危ないないらしいですが、それはまた別途設定することにしましょう。この辺りは[こちら](https://beatsync.net/main/log20141212.html)と公式の[こちら](https://docs.docker.com/engine/security/https/)が詳しいです。）

サーバ上で以下を実行することで、TCPソケットを介してpycharmからdockerを叩けるようになります。

```
# 設定の修正
$ sudo vim /etc/systemd/system/docker.service.d/startup_options.conf

# 設定への記載内容
$ cat /etc/systemd/system/docker.service.d/startup_options.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H unix:// -H tcp://0.0.0.0:2376

# 読み込み＆再起動
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker.service

# 設定の確認
# "/usr/bin/dockerd -H unix:// -H tcp://0.0.0.0:2376"があればOK
$ service docker status
Redirecting to /bin/systemctl status docker.service
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/docker.service.d
           └─docker-bridge-yj.conf, startup_options.conf
   Active: active (running) since Tue 2019-06-18 12:54:47 JST; 4 days ago
     Docs: https://docs.docker.com
 Main PID: 4595 (dockerd)
    Tasks: 26
   Memory: 9.2G
   CGroup: /system.slice/docker.service
           └─4595 /usr/bin/dockerd -H unix:// -H tcp://0.0.0.0:2376
```

## PyCharmのリモートとローカルのファイルの同期

Preference>Build, Execution, Deployment>DeploymentのConnectionタブから同期の設定を行います。

Host: Raspberry piのIPアドレス、User name: raspbianのユーザ名、Passwordにユーザのパスワードを入力します。Root pathはRaspberry Piのどこを"ルート"として認識させるかを設定します。(つまりこれはRaspberry Piのルートパス/とは一致している必要はありません。)
Web server URLにはhttps://[Raspberry PiのIPアドレス]と入力します。


![スクリーンショット 2019-12-21 1.11.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237372/fb26a3f6-bce8-44ba-9ff5-5101402a8ab3.png)

続いて、Mappingタブからの設定も行います。
こちらのLocal path: で同期したいローカルフォルダを設定します。また、Deployment pathで先ほど設定したRoot pathからの**相対パスとして**、同期したいパスを指定します。

![スクリーンショット 2019-12-21 1.11.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237372/f3646f8f-f9d4-ff2c-d847-d177206ea72f.png)

Tools>Deployment>OptionsからUpload changed files automatically to default serverにチェックをつけておけば、ファイルを書き換えると同時に、勝手に同期を行ってくれて便利です。

![スクリーンショット 2019-12-21 2.22.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237372/08166d46-2e38-1984-1e78-b72aa692d5bd.png)

## Docker-composeを利用したPythonインタプリタの設定

公式は[こちら](https://pleiades.io/help/pycharm/using-docker-compose-as-a-remote-interpreter.html)。

### Dockerの設定

Preference>Build, Execution, Deployment>Deployment>DockerでリモートのDockerを追加します。TCPソケットは、tcp://[IPアドレス]:[先ほど設定した番号]です。

![スクリーンショット 2019-12-21 2.07.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237372/ec5cc94c-f19a-e518-4bb4-e1418a415e80.png)

Preference>Project>Project Interpreterから歯車のマークをクリックし、Project Interpreterを追加します。Serverで先ほど設定したDockerを選択します。また、Configuration file(s)には自分で作成したdocker-compose.ymlを設定します。

![スクリーンショット 2019-12-21 2.06.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237372/bc91f574-5d3d-7b1c-2161-ce4c3181acc7.png)


以上でpycharm上からRUNをすると、dockerコンテナ内のpythonインタプリタがうごくはずです。