サーバ再起動後にDockerがexitedしてから復旧までの道

# TL;DR（要約）

1. サーバを再起動させて
1. docker STATUSが `Exited` したら
1. `docker logs { コンテナID }` でログを確認
1. `Permission denine` があったらSELinuxの状態を確認しよう。


# 記事の背景

我が家のRedmine(docker)が起動できなくなってしまいました。
Redmineが動作していた環境の構成は以下の通りです。

```
MacOS
 + VirtualBox - CentOS7
    + Dockerコンテナ - Redmine
    + Dockerコンテナ - MySQL
```

起動しなくなった契機はMacOSのフリーズによる強制再起動です。
（仮想マシンを立ち上げすぎてメモリを食いつぶしてしまいました…）

再起動後、以降は何度 `docker start ...` を実行してもexitedのままです。

```
[admin@localhost ~]$ sudo docker ps -a
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                     PORTS                           NAMES
9b399ccaaf1d        sameersbn/redmine:latest   "/sbin/entrypoint...."   3 months ago        Exited (255) 3 weeks ago   443/tcp, 0.0.0.0:8081->80/tcp   redmine
e6e1de5ddff7        sameersbn/mysql:latest     "/sbin/entrypoint...."   3 months ago        Exited (1) 3 weeks ago                                     mysql-redmine

```

# TL;DLに到るまでの試行錯誤メモ

## コンテナログの確認

`sudo docker logs { コンテナID }` で確認します。
mysql-redmineコンテナはログが出てますが、redmineコンテナは何もでてません。

```
[admin@localhost ~]$ sudo docker logs mysql-redmine | head
chmod: changing permissions of '/var/lib/mysql': Permission denied
chmod: cannot access '/var/lib/mysql/ibdata1': Permission denied
chmod: cannot access '/var/lib/mysql/ib_logfile1': Permission denied
chmod: cannot access '/var/lib/mysql/ib_logfile0': Permission denied
chmod: cannot access '/var/lib/mysql/auto.cnf': Permission denied
chmod: changing permissions of '/var/lib/mysql/mysql': Permission denied
chmod: cannot access '/var/lib/mysql/mysql/db.opt': Permission denied
chmod: cannot access '/var/lib/mysql/mysql/db.frm': Permission denied
chmod: cannot access '/var/lib/mysql/mysql/db.MYI': Permission denied
chmod: cannot access '/var/lib/mysql/mysql/db.MYD': Permission denied


[admin@localhost ~]$ sudo docker logs mysql-redmine | tail
chmod: cannot access '/var/lib/mysql/redmine_production/users.frm': Permission denied
chmod: cannot access '/var/lib/mysql/redmine_production/auth_sources.frm': Permission denied
chmod: cannot access '/var/lib/mysql/redmine_production/custom_fields_roles.frm': Permission denied
chmod: cannot access '/var/lib/mysql/redmine_production/custom_fields_roles.ibd': Permission denied
chmod: cannot access '/var/lib/mysql/redmine_production/roles_managed_roles.frm': Permission denied
chmod: cannot access '/var/lib/mysql/redmine_production/roles_managed_roles.ibd': Permission denied
chmod: cannot access '/var/lib/mysql/redmine_production/custom_field_enumerations.frm': Permission denied
chmod: cannot access '/var/lib/mysql/redmine_production/custom_field_enumerations.ibd': Permission denied
chmod: cannot access '/var/lib/mysql/ib_buffer_pool': Permission denied
chmod: cannot access '/var/lib/mysql/ibtmp1': Permission denied
```

```
[admin@localhost ~]$ sudo docker logs redmine | tail
[admin@localhost ~]$ 
```

## exitedしたコンテナに入って調べる

`docker commit { コンテナID } { 適当に付けたコンテナ名 }` コマンドで現在のコンテナイメージを保存します。

```
sudo docker commit mysql-redmine broken-mysql-redmine
sudo docker commit redmine broken-redmine

```

`docker images` で確認します。 `broken-mysql-redmine` と `broke-nredmine` ができていることがわかります。

```
[admin@localhost ~]$ sudo docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED              SIZE
broken-redmine                latest              240cfd127396        29 seconds ago       289 MB
broken-mysql-redmine          latest              bdedd7749293        About a minute ago   289 MB
docker.io/sameersbn/redmine   latest              c7a976e0ea70        3 months ago         817 MB
docker.io/sameersbn/mysql     latest              8712d69c0eb1        8 months ago         289 MB

```

`docker run --rm -it { 適当に付けたコンテナ名 } sh` で先ほどのエラーログで記載されているパスがどうなっているのか確認してみます。
結果、`/var/lib/mysql` には何もファイルがありませんでした。
このパスはdocker の起動オプション `--volume=/srv/docker/redmine/mysql:/var/lib/mysql`  で指定しているパスなので、エラーログにも書かれている通り Permission denied でマウントできていないんでしょうね。


```
[admin@localhost ~]$ sudo docker run --rm -it broken-mysql-redmine sh
# 
# ls /var/lib/mysql
#     
```


## コンテナを作り直してみよう

単純にコンテナを作り直せばなんかうまいこと行かないかなぁと思ったので、 `docker container rm { コンテナ名 }`でコンテナを削除して、コンテナの再作成をしてみます。

```
# コンテナの削除

[admin@localhost ~]$ sudo docker ps -a
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                         PORTS                           NAMES
9b399ccaaf1d        sameersbn/redmine:latest   "/sbin/entrypoint...."   3 months ago        Exited (255) 3 weeks ago       443/tcp, 0.0.0.0:8081->80/tcp   redmine
e6e1de5ddff7        sameersbn/mysql:latest     "/sbin/entrypoint...."   3 months ago        Exited (1) About an hour ago                                   mysql-redmine


[admin@localhost ~]$ sudo docker container rm mysql-redmine
mysql-redmine
[admin@localhost ~]$ sudo docker container rm redmine
redmine


[admin@localhost ~]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[admin@localhost ~]$ 


# コンテナの再作成
[admin@localhost ~]$ sudo docker run --name=mysql-redmine -d   --volume=/srv/docker/redmine/mysql:/var/lib/mysql   sameersbn/mysql
a955c46716ef040ce9934ae6c6f0fd68ba50cb0adb0f5850cb2a945445a3317f


# 起動確認
[admin@localhost ~]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
a955c46716ef        sameersbn/mysql     "/sbin/entrypoint...."   15 seconds ago      Exited (1) 14 seconds ago                       mysql-redmine
[admin@localhost ~]$ 


[admin@localhost ~]$ sudo docker logs mysql-redmine | tail
chmod: cannot access '/var/lib/mysql/redmine_production/users.frm': Permission denied
chmod: cannot access '/var/lib/mysql/redmine_production/auth_sources.frm': Permission denied
chmod: cannot access '/var/lib/mysql/redmine_production/custom_fields_roles.frm': Permission denied
chmod: cannot access '/var/lib/mysql/redmine_production/custom_fields_roles.ibd': Permission denied
chmod: cannot access '/var/lib/mysql/redmine_production/roles_managed_roles.frm': Permission denied
chmod: cannot access '/var/lib/mysql/redmine_production/roles_managed_roles.ibd': Permission denied
chmod: cannot access '/var/lib/mysql/redmine_production/custom_field_enumerations.frm': Permission denied
chmod: cannot access '/var/lib/mysql/redmine_production/custom_field_enumerations.ibd': Permission denied
chmod: cannot access '/var/lib/mysql/ib_buffer_pool': Permission denied
chmod: cannot access '/var/lib/mysql/ibtmp1': Permission denied
```

うーん、やっぱダメですね。


## 権限を確認してみる

Dockerがマウントする予定の `/srv/docker/redmine/mysql` のパーミッションを確認してみます。
あれ。mysqlフォルダのパーミッション `drwx------` になってる。  **（注意：これであってます！）**
redmineフォルダと同じように `drwxr-xr-x` にしてみましょう。 **(注意:やっちゃダメです！！)**

```
[admin@localhost redmine]$ pwd
/srv/docker/redmine
[admin@localhost redmine]$ ll
合計 0
drwx------. 6  101  101 187  6月 16 22:39 mysql
drwxr-xr-x. 8 1000 1000  90  8月 12 16:56 redmine

[admin@localhost redmine]$ sudo chmod -R 755 mysql/
[admin@localhost redmine]$ ll
合計 0
drwxr-xr-x. 6  101  101 187  6月 16 22:39 mysql
drwxr-xr-x. 8 1000 1000  90  8月 12 16:56 redmine
```

さて、起動確認をしてみます。…やっぱりダメですねぇ。

```
[admin@localhost redmine]$ sudo docker start mysql-redmine
mysql-redmine
[admin@localhost redmine]$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[admin@localhost redmine]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
a955c46716ef        sameersbn/mysql     "/sbin/entrypoint...."   5 minutes ago       Exited (1) 5 seconds ago                       mysql-redmine

[admin@localhost mysql]$ sudo docker logs mysql-redmine | tail
chmod: cannot access '/var/lib/mysql/redmine_production/users.frm': Permission denied
chmod: cannot access '/var/lib/mysql/redmine_production/auth_sources.frm': Permission denied
chmod: cannot access '/var/lib/mysql/redmine_production/custom_fields_roles.frm': Permission denied
chmod: cannot access '/var/lib/mysql/redmine_production/custom_fields_roles.ibd': Permission denied
chmod: cannot access '/var/lib/mysql/redmine_production/roles_managed_roles.frm': Permission denied
chmod: cannot access '/var/lib/mysql/redmine_production/roles_managed_roles.ibd': Permission denied
chmod: cannot access '/var/lib/mysql/redmine_production/custom_field_enumerations.frm': Permission denied
chmod: cannot access '/var/lib/mysql/redmine_production/custom_field_enumerations.ibd': Permission denied
chmod: cannot access '/var/lib/mysql/ib_buffer_pool': Permission denied
chmod: cannot access '/var/lib/mysql/ibtmp1': Permission denied
```

## もう777にしちゃえ！ **（注意: やっちゃダメです！！）**

エラーに出てるファイル自体は存在はしているので、user名が変わってる？  
とりあえずパーミッションを777にしてみます。これで上手くいけばパーミッションの問題でしょう。

```
[admin@localhost mysql]$ pwd
/srv/docker/redmine/mysql
[admin@localhost mysql]$ ll
合計 188464
-rwxr-xr-x. 1 101 101       56  6月 16 22:38 auto.cnf
-rwxr-xr-x. 1 101 101      313  6月 16 22:39 ib_buffer_pool
-rwxr-xr-x. 1 101 101 50331648  8月 15 11:54 ib_logfile0
-rwxr-xr-x. 1 101 101 50331648  6月 16 22:38 ib_logfile1
-rwxr-xr-x. 1 101 101 79691776  8月 15 11:54 ibdata1
-rwxr-xr-x. 1 101 101 12582912  8月 12 17:28 ibtmp1
drwxr-xr-x. 2 101 101     4096  6月 16 22:38 mysql
drwxr-xr-x. 2 101 101     8192  6月 16 22:38 performance_schema
drwxr-xr-x. 2 101 101     8192  6月 16 22:39 redmine_production
drwxr-xr-x. 2 101 101     8192  6月 16 22:39 sys


# パーミッションを777に変更
[admin@localhost redmine]$ pwd
/srv/docker/redmine
[admin@localhost redmine]$ sudo chmod -R 777 mysql/
[admin@localhost redmine]$ ll mysql/
合計 188464
-rwxrwxrwx. 1 101 101       56  6月 16 22:38 auto.cnf
-rwxrwxrwx. 1 101 101      313  6月 16 22:39 ib_buffer_pool
-rwxrwxrwx. 1 101 101 50331648  8月 15 11:54 ib_logfile0
-rwxrwxrwx. 1 101 101 50331648  6月 16 22:38 ib_logfile1
-rwxrwxrwx. 1 101 101 79691776  8月 15 11:54 ibdata1
-rwxrwxrwx. 1 101 101 12582912  8月 12 17:28 ibtmp1
drwxrwxrwx. 2 101 101     4096  6月 16 22:38 mysql
drwxrwxrwx. 2 101 101     8192  6月 16 22:38 performance_schema
drwxrwxrwx. 2 101 101     8192  6月 16 22:39 redmine_production
drwxrwxrwx. 2 101 101     8192  6月 16 22:39 sys
```

もう、ログを転記するのも冗長なので飛ばしますが、結果は変わらずです。


## mysqlフォルダを消してみる?

ならもう１から作り直せば起動できるでしょう。
と言うことで、もともとのmysqlフォルダをリネームしました。


```
# もともとのmysqlフォルダをリネーム（Docker的には削除されたのと同意）
[admin@localhost redmine]$ sudo mv mysql/ old_mysql
[admin@localhost redmine]$ ls -l
合計 0
drwxrwxrwx. 6  101  101 187  6月 16 22:39 old_mysql
drwxr-xr-x. 8 1000 1000  90  8月 12 16:56 redmine


# mysql-redmineコンテナを起動するが、Excited…
[admin@localhost ~]$ sudo docker start mysql-redmine
[admin@localhost ~]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                          PORTS               NAMES
45add7787f7c        sameersbn/mysql     "/sbin/entrypoint...."   About a minute ago   Exited (1) About a minute ago                       mysql-redmine


# フォルダ確認
[admin@localhost redmine]$ pwd
/srv/docker/redmine
[admin@localhost redmine]$ ll
合計 0
drwxr-xr-x. 2 root root   6  9月 22 23:02 mysql
drwxrwxrwx. 6  101  101 187  6月 16 22:39 old_mysql
drwxr-xr-x. 8 1000 1000  90  8月 12 16:56 redmine
```

結果、新しくmysql フォルダが作成されましたが、起動できません。


## imageごと削除して作り直してみる。

いくらなんでもこれなら起動するでしょう…

```
# イメージを削除
[admin@localhost redmine]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
45add7787f7c        sameersbn/mysql     "/sbin/entrypoint...."   5 minutes ago       Exited (1) 3 minutes ago                       mysql-redmine
[admin@localhost redmine]$ sudo docker rm mysql-redmine
mysql-redmine
[admin@localhost redmine]$ sudo docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
broken-redmine                latest              78d7ca891d27        About an hour ago   820 MB
broken-mysql-redmine          latest              bdedd7749293        About an hour ago   289 MB
docker.io/sameersbn/redmine   latest              c7a976e0ea70        3 months ago        817 MB
docker.io/sameersbn/mysql     latest              8712d69c0eb1        8 months ago        289 MB
[admin@localhost redmine]$ sudo docker rmi 8712d69c0eb1
Error response from daemon: conflict: unable to delete 8712d69c0eb1 (cannot be forced) - image has dependent child images
[admin@localhost redmine]$ sudo docker rmi bdedd7749293
Untagged: broken-mysql-redmine:latest
Deleted: sha256:bdedd774929362894e31d9dc12820c9f3277326dc9419fbcea995918e800b6f1
Deleted: sha256:213ae438dcfad5e2b402cc8d4f0924ac81ca24af72631578642a68f03a97cb2e
[admin@localhost redmine]$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[admin@localhost redmine]$ sudo docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
broken-redmine                latest              78d7ca891d27        About an hour ago   820 MB
docker.io/sameersbn/redmine   latest              c7a976e0ea70        3 months ago        817 MB
docker.io/sameersbn/mysql     latest              8712d69c0eb1        8 months ago        289 MB
[admin@localhost redmine]$ sudo docker rmi 8712d69c0eb1
Untagged: docker.io/sameersbn/mysql:latest
Untagged: docker.io/sameersbn/mysql@sha256:08803923a08423795030779398a8e6454c971d7ba93aec3c0ce68ce47f8f5b1b
Deleted: sha256:8712d69c0eb183c9c1a7041b2b7175b3672a465b1ba427c3595f120e6f0bcb91
Deleted: sha256:f94a642c7a822e01d22cbee3fec136486642f8e5f8e98a429a450a2ed16c8103
Deleted: sha256:b995a27c90f15a45c0cba4ea4ad94e1ab88e80980538406a55514bb94a66873b
Deleted: sha256:765ac5b1eddc9d2dfd2c644e0daf680e623c415e2ba7b5f7589920bb53c62d5f
Deleted: sha256:3288cd6e6e7d42bcb4a74121b412c42a11f96da52685e42dbf9de6a747a55c6b
Deleted: sha256:b1636589630239bdb9153f95ac564bcd2afd9202aaf8511cbf5a9a37e03daf35
Deleted: sha256:043f492f40c539cfe7cee4cb8aae00ed1d5b19e864fbe6ea35ec92a2333bacc4
Deleted: sha256:2fb7bfc6145d0ad40334f1802707c2e2390bdcfc16ca636d9ed8a56c1101f5b9
```

コンテナもイメージも削除し終わったので、イメージの取得からやり直して起動してみますが…
これでもダメ。うそやん…

```
[admin@localhost redmine]$ sudo docker run --name=mysql-redmine -d   --volume=/srv/docker/redmine/mysql:/var/lib/mysql   sameersbn/mysql
Unable to find image 'sameersbn/mysql:latest' locally
Trying to pull repository docker.io/sameersbn/mysql ... 
latest: Pulling from docker.io/sameersbn/mysql
5b7339215d1d: Pull complete 
14ca88e9f672: Pull complete 
a31c3b1caad4: Pull complete 
b054a26005b7: Pull complete 
90fea30f4edb: Pull complete 
51eaeddaa0eb: Pull complete 
Digest: sha256:cc4bfd33e0a4100b31cb868f5671c11a910633a0c09c5e5f9f7eb8d51787da3d
Status: Downloaded newer image for docker.io/sameersbn/mysql:latest
c9fc7ea0557d50744483a5dcdd0ad535eb1386603482682e546373c14854ae1b

[admin@localhost redmine]$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[admin@localhost redmine]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
c9fc7ea0557d        sameersbn/mysql     "/sbin/entrypoint...."   29 seconds ago      Exited (1) 29 seconds ago                       mysql-redmine
```

```
[admin@localhost redmine]$ sudo docker logs mysql-redmine
chmod: changing permissions of '/var/lib/mysql': Permission denied
```


# SELinuxだった

Dockerコンテナを１から作ってダメと言うことは環境問題の可能性が高いです。
そういえばDockerを起動しているホストOSはCnetOS7だった。
CentOSはデフォルトだとSELinuxがenableになっていますが、私はまだSELinuxと友達になれていないので確か永続的にdisableにしていたはず。
`getenforce`コマンドで確認してみます。
`Enforcing`
めっちゃSELinuxさん働いてるやん…

```
# SELinuxの状態を確認
[admin@localhost redmine]$ getenforce 
Enforcing

# SELinuxを一時的にdisable 
[admin@localhost redmine]$ sudo setenforce 0
[admin@localhost redmine]$ getenforce 
Permissive


# dockerコンテナの起動… 起動！！
[admin@localhost redmine]$ sudo docker start mysql-redmine
mysql-redmine
[admin@localhost redmine]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
9d348d9414d8        sameersbn/mysql     "/sbin/entrypoint...."   3 minutes ago       Up 4 seconds        3306/tcp            mysql-redmine

```

## パーミッションを元に戻そう
さっき `/srv/docker/redmine/mysql` 配下のパーミッションを全部777にしてしまったのでパーミッションを元に戻します。

確認したところ `/srv/docker/redmine/mysql` 配下のパーミッションはUser,Groupが`101:101`、ディレクトリが`750`、ファイルが`640`でしたので元に戻します。

```
[root@localhost mysql]# chmod -R 640 *
[root@localhost mysql]# chmod 750 mysql/
[root@localhost mysql]# chmod 750 performance_schema/
[root@localhost mysql]# chmod 750 redmine_production/
[root@localhost mysql]# chmod 750 sys
[root@localhost mysql]# ll
合計 122916
-rw-r-----. 1 101 101       56  9月 22 23:19 auto.cnf
-rw-r-----. 1 101 101      312  9月 22 23:19 ib_buffer_pool
-rw-r-----. 1 101 101 50331648  9月 22 23:19 ib_logfile0
-rw-r-----. 1 101 101 50331648  9月 22 23:19 ib_logfile1
-rw-r-----. 1 101 101 12582912  9月 22 23:19 ibdata1
-rw-r-----. 1 101 101 12582912  9月 22 23:19 ibtmp1
drwxr-x---. 2 101 101     4096  9月 22 23:19 mysql
drwxr-x---. 2 101 101     8192  9月 22 23:19 performance_schema
drwxr-x---. 2 101 101       20  9月 22 23:19 redmine_production
drwxr-x---. 2 101 101     8192  9月 22 23:19 sys
```

## コンテナ起動

```
# MySQLコンテナ起動
`/srv/docker/redmine/mysql` 配下のパーミッションsudo docker run --name=mysql-redmine -d   --env='DB_NAME=redmine_production'   --env='DB_USER=redmine' --env='DB_PASS=password'   --volume=/srv/docker/redmine/mysql:/var/lib/mysql   sameersbn/mysql


# Redmineコンテナ起動
`/srv/docker/redmine/mysql` 配下のパーミッションsudo docker run --name=redmine -d --link=mysql-redmine:mysql \
  --volume=/srv/docker/redmine/redmine:/home/redmine/data \
  sameersbn/redmine
sudo docker run --name=redmine -p 8081:80 -d --link=mysql-redmine:mysql   --volume=/srv/docker/redmine/redmine:/home/redmine/data   sameersbn/redmine


# Dockerコンテナ状態確認
[admin@localhost redmine]$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES
4b1f5657e1e8        sameersbn/redmine   "/sbin/entrypoint...."   13 seconds ago      Up 12 seconds       443/tcp, 0.0.0.0:8081->80/tcp   redmine
7b3202290f17        sameersbn/mysql     "/sbin/entrypoint...."   14 minutes ago      Up 14 minutes       3306/tcp                        mysql-redmine
```

やったー。復旧したぞー。


# 参考
- [dockerでコンテナが立ち上がらないときやってみること](https://qiita.com/mom0tomo/items/35dfacb628df1bd3651e)
- [dockerで共有ディレクトリを利用したが、「Permission denied」が出てアクセスできない。](https://qiita.com/shuichiro/items/adaaeccebdc55089f1b8)