docker-compose で TLSV1_ALERT_PROTOCOL_VERSION エラー 他多数

## 概要

ある日 docker-compose を実行したところ、TLSV1_ALERT_PROTOCOL_VERSION というエラーがでました。試行錯誤したあげく、最終的に TLS 検証を無効にしてエラーを回避しました。ちゃんと TLS で動かせる人には無用の長物かと思います。

## Version

一応書いておきます。

```bash
$ docker --version
Docker version 19.03.13-ce, build 4484c46
```

```bash
$ docker-compose version
docker-compose version 1.19.0, build 9e633ef
docker-py version: 2.7.0
CPython version: 2.7.13
OpenSSL version: OpenSSL 1.0.1t  3 May 2016
```

## エラー回避手順

work-log は冗長なのでここにまとめておきます。

### 1. DOCKER_TLS_VERIFY, DOCKER_CERT_PATH を空にする

最終的には .bash_profile などに設定しておく

```bash
$ export DOCKER_TLS_VERIFY=
$ export DOCKER_CERT_PATH=
```

### 2. /etc/sysconfig/docker から tlsverify オプションを削除して dockerd を再起動

設定は抜粋です。

```bash:/etc/sysconfig/docker
# Before
OPTIONS="--tlsverify --tlscacert=/etc/docker/ssl/ca.pem --tlscert=/etc/docker/ssl/cert.pem --tlskey=/etc/docker/ssl/key.pem"

# After
OPTIONS="--tlscacert=/etc/docker/ssl/ca.pem --tlscert=/etc/docker/ssl/cert.pem --tlskey=/etc/docker/ssl/key.pem"
```

※ ちなみに、最低限 tlsverify を削除すれば動きますが、他の tls~~ を全部消しても特に問題ありませんでした。

```bash
$ sudo systemctl restart docker
```

### 3. Optional: COMPOSE_TLS_VERSION が set されている場合は unset

私は TLSV1_ALERT_PROTOCOL_VERSION が出たあとに設定していたので、unset が必要でした。

```bash
$ unset COMPOSE_TLS_VERSION
```

## Work-log

※ 注意：以下は時系列で作業ログを書いたものであり、最終的に使わなかった COMPOSE_TLS_VERSION の設定などもしているため冗長です。必要な手順のみ確認したい場合は[上の方](#エラー回避手順)を参照してください。

ことの発端。tlsv1 はダメとのこと。

```bash
$ docker-compose up -d
ERROR: SSL error: [SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:661)
```

ググると COMPOSE_TLS_VERSION に TLSv1_2 を設定せよという記事が多く出てきたので設定してみる。

```bash
$ export COMPOSE_TLS_VERSION=TLSv1_2
```

が、今度は CERTIFICATE_VERIFY_FAILED ><

```bash
$ docker-compose up -d
ERROR: SSL error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:661)
```

さらに調べていくと[この github issue](https://github.com/docker/compose/issues/4141) を見つける。

DOCKER_TLS_VERIFY, DOCKER_CERT_PATH を空にする。

```bash
$ export DOCKER_TLS_VERIFY=
$ export DOCKER_CERT_PATH=
```

が、今度は SSLV3_ALERT_BAD_CERTIFICATE ...

```bash
$ docker-compose up -d
ERROR: SSL error: [SSL: SSLV3_ALERT_BAD_CERTIFICATE] sslv3 alert bad certificate (_ssl.c:661)
```

あ、COMPOSE_TLS_VERSION 設定したままになってた。

unset する。

```bash
$ unset COMPOSE_TLS_VERSION
```

が、今度は ERROR: Client sent an HTTP request to an HTTPS server.

```bash
$ docker-compose up -d
ERROR: Client sent an HTTP request to an HTTPS server.
```

/etc/sysconfig/docker から tlsverify オプションを削除し、dockerd を restart

```bash:/etc/sysconfig/docker
# Before
OPTIONS="--tlsverify --tlscacert=/etc/docker/ssl/ca.pem --tlscert=/etc/docker/ssl/cert.pem --tlskey=/etc/docker/ssl/key.pem"

# After
OPTIONS="--tlscacert=/etc/docker/ssl/ca.pem --tlscert=/etc/docker/ssl/cert.pem --tlskey=/etc/docker/ssl/key.pem"
```

```bash
$ sudo systemctl restart docker
```

It works fine.

```bash
$ docker-compose up -d
Creating docker_selenium-hub_1 ... done
Creating docker_selenium-hub_1 ...
Creating docker_chrome_1    ... done
```

## 補足
なお、/etc/sysconfig/docker から tlsverify を削除をするのみだと、WRONG_VERSION_NUMBER と言われる。

```bash
$ docker-compose up -d
ERROR: SSL error: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:661)
```

その場合、DOCKER_TLS_VERIFY, DOCKER_CERT_PATH を空にすると解決するはず。

```bash
$ export DOCKER_TLS_VERIFY=
$ export DOCKER_CERT_PATH=
```

おわり