[Docker / VSCode] VSCodeからリモートマシンのDocker情報にアクセスする  

# 概要

VSCodeの拡張に [Docker](https://github.com/Microsoft/vscode-docker/wiki) なるものがあるらしいので、これを使ってみようとして試行錯誤した記事です。


# 前提

- ローカルマシンにVSCode、リモートマシンにdockerがインストールされている
- ローカルマシン内VSCodeの [RemoteDevelopment](https://github.com/Microsoft/vscode-remote-release) 経由で、リモートマシンにアクセスできている

# Environment

|    |versionなど|
|:--:|:------|
|ローカルOS|Windows10|
|リモートOS|CentOS Linux release 7.5.1804 (Core)|
|docker|Docker version 18.09.0, build 4d60db4|
|VSCode|1.44.2|

# やり方

## はじめの１歩  

VSCode の Extension - `Docker` - のインストール方法はここに書いてある
[Working with containers](https://code.visualstudio.com/docs/containers/overview#_installation)

### ※注意（2020/04/22追記）

VSCodeのExtension 'docker' をインストールするときは、VSCodeでリモート環境にアクセスした状態でインストールしましょう。
するとこうなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/f40747e2-9f9b-9d1c-0497-fc93bd584e12.png)
この記事を一度作成し終わった後、別の環境で間違ってローカルにインストールしたところ、動きませんでした。注意>_<

- やってみた結果  
めちゃ Failed to connect ...  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/170c1fe6-707a-be42-0465-3acbe3a2b708.png)  
`Failed to connect. Is Docker installed and running?` と表示されるorz
- この結果に対する公式サイトの説明  
[microsoft / vscode-docker (Troubleshooting)](https://github.com/microsoft/vscode-docker/wiki/Troubleshooting)  
    1. docker インストールしてる？  
    (↑の注意も参照。ローカルじゃなくて、リモートにインストールしないとダメだよ。)
    2. インストールしても直らなかったら VSCodeの バグだよ  
    そんなばなな....  
    どうしたらいいの....>_<。

## メイン作業

よく見たら、githubの[README](https://github.com/microsoft/vscode-docker#installation)に、Linuxの場合にすべきことが書いてあった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/7dd67735-fd23-a868-1da4-bef164dcc1c0.png)


というわけでこのあたりを実施しよう！

- [dockerを、sudoなしで実行できるようにする]  (https://docs.docker.com/engine/install/linux-postinstall/#configuring-remote-access-with-daemonjson#manage-docker-as-a-non-root-user)  
簡単なので略
- [Configuring remote access with daemon.json](https://docs.docker.com/engine/install/linux-postinstall/#configuring-remote-access-with-daemonjson)  
jsonファイルを作成

```yaml:/etc/docker/daemon.json
{
  "hosts": [
    "unix:///var/run/docker.sock",
    "tcp://127.0.0.1:2375"
  ]
}
```


## /etc/docker/daemon.json 作ったら restart 失敗

```bash
# 以下のエラーが出たとき
$ sudo systemctl restart docker
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.

# 言われた通りに journal ログを見てみましょう
$ sudo journalctl -xe
-- Unit docker.service has begun starting up.
 4月 19 14:43:56 localhost.localdomain dockerd[14581]: unable to configure the Docker daemon with file /etc/docker/daemon.json: the following directives are specified both as a flag and in the configuration file: hosts: (from flag: [unix://], from file: [unix:///var/run/docker.sock tcp://127.0.0.1:2375])
```

ﾑｷｨｨｲｰ

- 参考  
[Update daemon.json,start failed](https://github.com/docker/for-linux/issues/165)  
この人たちも困っていたみたい(´・ω・`)

# 対策

↓の２つのうちどちらかを使おう（どちらも同じことを言っているよ）

- [Unable to start docker after configuring hosts in daemon.json](https://stackoverflow.com/questions/44052054/unable-to-start-docker-after-configuring-hosts-in-daemon-json)
- [Cannot load hosts in configuration json file when starting docker daemon](https://github.com/moby/moby/issues/22339#issuecomment-225437878)


## 採用した対策

### 1. /etc/systemd/system/docker.service.d/override.conf` を作成

```bash
$ sudo mkdir /etc/systemd/system/docker.service.d
$ sudo touch /etc/systemd/system/docker.service.d/override.conf
$ sudo vim /etc/systemd/system/docker.service.d/override.conf
```

```conf:/etc/systemd/system/docker.service.d/override.conf
# Disable flags to dockerd, all settings are done in /etc/docker/daemon.json
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd
```

### 2. dockerデーモンの再起動

```bash
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

# 結果を確認
$ sudo netstat -lntp | grep dockerd
tcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      15781/dockerd
```

### 3. sockファイルの権限変更

ここまでやると、docker コマンドが再び sudo 権限でしか行えなくなっていることがある
これに対しては、 sock ファイルの権限を書き換えたら上手くいった

```bash
# 権限がないらしい...
$ docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.39/containers/json: dial unix /var/run/docker.sock: connect: permission denied

# だったらこうだ！
$ sudo chmod 666 /var/run/docker.sock
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

# もう一回確認
$ sudo netstat -lntp | grep dockerd
tcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      17279/dockerd
```

できた！！(((o(\*ﾟ▽ﾟ\*)o)))
そして、VSCodeを再起動すると...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/62f3886c-c991-16d6-e908-beedfc7e0fdd.png)

ふぅ～リモートマシンにアクセスできたみたい( ^^) _旦~~


- [参考] sockファイルの書き換えを提案していた記事  
[How to fix docker: Got permission denied while trying to connect to the Docker daemon socket](https://www.digitalocean.com/community/questions/how-to-fix-docker-got-permission-denied-while-trying-to-connect-to-the-docker-daemon-socket)

# その他

- pythonのdocker環境の場合のお話  
https://code.visualstudio.com/docs/containers/quickstart-python

# 感想

記事をもう少し整理した方がいいかもしれないと思っています。
あせって失敗してしまったことも書いているので、スムーズに作業する人にとっては不要な情報が混じっているかも(´・・`)

次はこの記事（[VS Code Remote Development で Docker 開発環境を利用する](https://qiita.com/yito/items/1edd82414dfc2ab2a7bc)）を見て、Dockerコンテナ内のフォルダを VSCode で開けるようにするぞ ( \*˙︶˙\*)وｸﾞｯ!