docker run --restart=alwaysがどれくらいrestartしてくれるか調べた

# 目的

この記事では、docker run --restart=alwaysをつけて起動したコンテナは、dockerデーモンの再起動や、マシンの再起動をしたときに、どうなるのかを調べました。

## 2016-09-02
1.12.1 に関しても調べ始めました。

```
--restart=always
```

をコンテナを起動した後にも、せっていできることがわかりました。

# 結論

--restart=alwaysをつけて起動すると、

* dockerデーモンの再起動
* マシンの再起動

どちらでも、コンテナが再起動してくれました。

# 環境

docker-machineを使って用意しました
```
docker-machine create -d virtualbox local
```

|ソフトウェア|version|
| -------- |-------|
|docker|1.8.1|
|docker-machine|0.4.0 (9d0dc7a)|

## 1.12.1

```
docker-machine create --virtualbox-boot2docker-url "https://github.com/boot2docker/boot2docker/releases/download/v1.12.1/boot2docker.iso" -d virtualbox docker1.12.1
```


|ソフトウェア|version|
| -------- |-------|
|docker|1.12.1|
|docker-machine|0.5.6, build 61388e9|


# 動機とか、docker run --restart=always について

最初にこのオプションを知ったのは、docker private registry をたてようと思って以下の記事を読んだときです。

* [Deploying a registry server](https://docs.docker.com/registry/deploying/#running-on-localhost)

その後、調べたら以下の記事があったので、いろいろ勉強になりました。

* [Dockerの再起動オプション | SOTA](http://deeeet.com/writing/2014/09/17/docker-1-2-restart/)
* [Docker run reference](https://docs.docker.com/reference/run/#restart-policies-restart)


もともと常に起動していてほしいコンテナ(private registry, squid, gitbucket,,,)がいくつかあり、systemdとかにするかなとか考えていたのですが、どうもこのオプションでやりたいことができそうでした。


# 検証

## --restart=alwaysをつけて起動してみる。
まずは起動してみます
```
docker@local:~$ docker run -d -p 5000:5000 --restart=always --name registry registry:2
1bb83bafc038a138e3f60e77433886c8b82f98c1d4ad0e8fb71bbc26071e7b58
```

## オプションを確認してみる。



```
docker@local:~$ docker inspect registry
```
必要なところだけ抜粋すると次のような感じになっています。
```
        "RestartPolicy": {
            "Name": "always",
            "MaximumRetryCount": 0
        },
```

--restart=alwasys

をつけないで、別のコンテナを起動してみたら次のような感じになりました。

起動

```
docker run -d -p 80:80 --name nginx nginx:latest
```

RestartPolicy

```
        "RestartPolicy": {
            "Name": "no",
            "MaximumRetryCount": 0
        },
```

RestartPolicyのName のところが、変わっていることがわかると思います。

### 1.12.1

1.12.1でも同じ。

# dockerデーモンの再起動

### 現状確認
実際にはstopしてstartしますが、そのまえに、今の状況を確認しておきます。

```
docker@local:~$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
6a6e723d792a        registry:2          "/bin/registry /etc/d"   6 minutes ago       Up 6 minutes        0.0.0.0:15000->5000/tcp   registry_no_restart
1bb83bafc038        registry:2          "/bin/registry /etc/d"   8 minutes ago       Up 8 minutes        0.0.0.0:5000->5000/tcp    registry
```
コンテナが２つ動いています。

### dockerデーモンを停止させる

docker デーモンを止めます。

```
docker@local:~$ sudo /etc/init.d/docker stop
```
dockerの状況を確認します
```
docker@local:~$ docker ps
Get http:///var/run/docker.sock/v1.20/containers/json: dial unix /var/run/docker.sock: no such file or directory.
* Are you trying to connect to a TLS-enabled daemon without TLS?
* Is your docker daemon up and running?
```
止まっているのでコンテナなどはみえません。

#### 1.12.1

1.12.1 でも同じ


### dockerデーモンを起動する
dockerデーモンを起動します。
```
docker@local:~$ sudo /etc/init.d/docker start
Need TLS certs for local,127.0.0.1,10.0.2.15,192.168.99.104
-------------------
```
状況を確認します
```
docker@local:~$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
1bb83bafc038        registry:2          "/bin/registry /etc/d"   11 minutes ago      Up 3 seconds        0.0.0.0:5000->5000/tcp   registry
```
たしかに立ち上がっています

#### 1.12.1

1.12.1でも同じ

# マシンを再起動してみる

再起動してみました。

```
docker@local:~$ uptime
 07:24:03 up 0 min,  2 users,  load average: 5.93, 1.58, 0.53
```
状況を確認してみます。
```
docker@local:~$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
1bb83bafc038        registry:2          "/bin/registry /etc/d"   14 minutes ago      Up 15 seconds       0.0.0.0:5000->5000/tcp   registry
```
たしかに動いています。

## 1.12.1

1.12.1 でも同じでした

# その他

このオプションは起動中に変更できるのか調べてみましたが、docker 1.8.1 の時点ではできないようです。

## 1.12.1

1.12.1 では docker update で設定の変更ができるようです。
いつからはいったかは調査してみないとわかりません。

### 起動
--restart=alwaysはなし

```
docker run -d -p 80:80 --name nginx nginx:latest
```

### 更新

```
docker update --restart=always nginx
```

### 確認

```
            "RestartPolicy": {
                "Name": "always",
                "MaximumRetryCount": 0
            },
```

### 再度はずしてみる

```
docker update --restart=no nginx
```

### 確認

```
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
```

### 適当なオプションをつけてみる

エラーになる

```
$ docker update --restart=nooo nginx
invalid restart policy nooo
```


# 参考記事

* [Setting and re-setting the restart policy of a Docker container — Brand Pending](http://www.brandpending.com/blog/2014/11/21/setting-and-re-setting-the-restart-behaviour-of-a-docker-container)
* [Change container restart policy during run time - Google Groups](https://groups.google.com/forum/#!topic/docker-user/A4IXKC665cM)