Docker v1.13.0 on Barge

[Docker v1.13.0 が公開された](https://github.com/docker/docker/releases/tag/v1.13.0)ので、[Barge](http://qiita.com/A-I/items/8dc7ddc52e6038b5c74b) で利用する方法をご紹介。

## Barge の起動

VirtualBox と Vagrant を使って簡単にお試しする方法です。

```
$ vagrant box add ailispaw/barge
$ vagrant init -m ailispaw/barge
$ vagrant up
```

## Docker のバージョンの切り替え

Barge VM にログインして、`sudo /etc/init.d/docker restart v1.13.0` と打つだけで切り替わります。

```
$ vagrant ssh
Welcome to Barge 2.3.4, Docker version 1.10.3, build 20f81dd
[bargee@barge ~]$ sudo /etc/init.d/docker restart v1.13.0
docker[426]: Loading /etc/default/docker
WARNING: Possible Forward-Incompatibility of libnetwork
Once you upgrade Docker to v1.12 or newer, if you downgrade back,
you may need to initialize /var/lib/docker/network/files/local-kv.db.
Downloading v1.13.0 ...
docker[426]: Stopping Docker daemon
docker[426]: Setting ulimit 1048576
docker[426]: DOCKER_RAMDISK=
docker[426]: Docker version 1.13.0, build 49bf474
docker[426]: Starting Docker daemon -D -s overlay -g "/var/lib/docker" -H unix:// -H tcp://0.0.0.0:2375 --userland-proxy=false
[bargee@barge ~]$ docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 1.13.0
Storage Driver: overlay
 Backing Filesystem: extfs
 Supports d_type: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 03e5862ec0d8d3b3f750e19fca3ee367e13c090e
runc version: 2f7393a47307a16f8cee44a37b262e8b81021e3e
init version: 949e6fa
Security Options:
 seccomp
  Profile: default
Kernel Version: 4.4.42-barge
Operating System: Barge 2.3.4
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 999.2 MiB
Name: barge-test
ID: X6XR:UCA3:B6TZ:JZYJ:Y7PM:YWSP:6Z3I:ERDV:QA22:JEO3:HRBG:5G7B
Docker Root Dir: /mnt/data/var/lib/docker
Debug Mode (client): false
Debug Mode (server): true
 File Descriptors: 14
 Goroutines: 22
 System Time: 2017-01-19T04:55:35.7986026Z
 EventsListeners: 0
Registry: https://index.docker.io/v1/
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false
```

## experimental 機能のアクティベイト

v1.13.0 から experimental のバイナリが統合されて Docker デーモンのパラメタで切り替えられるようになりました。

```
[bargee@barge ~]$ cat /etc/default/docker
# DOCKER_STORAGE="overlay"

# DOCKER_DIR="/var/lib/docker"

# DOCKER_HOST="-H unix://"
DOCKER_HOST="-H unix:// -H tcp://0.0.0.0:2375"

# DOCKER_EXTRA_ARGS="--userland-proxy=false"

# DOCKER_ULIMITS=1048576

# DOCKER_LOGFILE="/var/log/docker/docker.log"

# DOCKER_TIMEOUT=5
```

この `DOCKER_EXTRA_ARGS` に `--experimental` を加えてリスタートさせます。
（ちなみに、コメント行はデフォルト値を表しています。）

```
[bargee@barge ~]$ sudo vi /etc/default/docker
```

```
# DOCKER_STORAGE="overlay"

# DOCKER_DIR="/var/lib/docker"

# DOCKER_HOST="-H unix://"
DOCKER_HOST="-H unix:// -H tcp://0.0.0.0:2375"

# DOCKER_EXTRA_ARGS="--userland-proxy=false"
DOCKER_EXTRA_ARGS="--userland-proxy=false --experimental"

# DOCKER_ULIMITS=1048576

# DOCKER_LOGFILE="/var/log/docker/docker.log"

# DOCKER_TIMEOUT=5
```

```
[bargee@barge ~]$ sudo /etc/init.d/docker restart
docker[623]: Loading /etc/default/docker
docker[623]: Stopping Docker daemon
docker[623]: Setting ulimit 1048576
docker[623]: DOCKER_RAMDISK=
docker[623]: Docker version 1.13.0, build 49bf474
docker[623]: Starting Docker daemon -D -s overlay -g "/var/lib/docker" -H unix:// -H tcp://0.0.0.0:2375 --userland-proxy=false --experimental
[bargee@barge ~]$ docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 1.13.0
Storage Driver: overlay
 Backing Filesystem: extfs
 Supports d_type: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host ipvlan macvlan null overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 03e5862ec0d8d3b3f750e19fca3ee367e13c090e
runc version: 2f7393a47307a16f8cee44a37b262e8b81021e3e
init version: 949e6fa
Security Options:
 seccomp
  Profile: default
Kernel Version: 4.4.42-barge
Operating System: Barge 2.3.4
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 999.2 MiB
Name: barge-test
ID: X6XR:UCA3:B6TZ:JZYJ:Y7PM:YWSP:6Z3I:ERDV:QA22:JEO3:HRBG:5G7B
Docker Root Dir: /mnt/data/var/lib/docker
Debug Mode (client): false
Debug Mode (server): true
 File Descriptors: 14
 Goroutines: 22
 System Time: 2017-01-19T04:57:31.104280608Z
 EventsListeners: 0
Registry: https://index.docker.io/v1/
Experimental: true
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false
```

`Experimental: true` になりました。

以上になります。

## 追記：Checkpoint & Restore

折角なので、experimental 機能の Checkpoint & Restore を使ってみましょう。
https://github.com/docker/docker/blob/master/experimental/checkpoint-restore.md

### 下準備

実行には [CRIU](https://criu.org) が必要なので、`criu` パッケージをインストールします。

```
[bargee@barge ~]$ sudo pkg install criu
```

<del>これで、`docker checkpoint` コマンドが使えるはずですが、checkpoint 作成時に `binfmt_misc` のマウントを要求するエラーがありました。</del><br/><ins>Docker v1.13.0-rc6 ではエラーが無くなっていました。以下は必要無くなりました。</ins>

```
[bargee@barge ~]$ sudo mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc
```

### コンテナの起動

公式ドキュメントにならって単純なコンテナを起動させます。

```
[bargee@barge ~]$ docker run --name cr -d --init busybox /bin/sh -c 'i=0; while true; do echo $i; i=$(expr $i + 1); sleep 1; done'
[bargee@barge ~]$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
104a30437d06        busybox             "/bin/sh -c 'i=0; ..."   4 seconds ago       Up 3 seconds                            cr
```

### checkpoiint

```
[bargee@barge ~]$ docker checkpoint create cr test
[bargee@barge ~]$ docker logs cr
0
1
2
3
4
5
6
7
8
9
10
[bargee@barge ~]$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                            PORTS               NAMES
104a30437d06        busybox             "/bin/sh -c 'i=0; ..."   2 minutes ago       Exited (137) About a minute ago                       cr
```

上手く行ったような行ってないような。。。
カウンタは `10` で止まりました。

```
[bargee@barge ~]$ docker checkpoint ls cr
CHECKPOINT NAME
test
```

`docker checkpoint` コマンドは、コンテナ毎に NAME（ID) で管理するようです。

### restore

```
[bargee@barge ~]$ docker start --checkpoint test cr
[bargee@barge ~]$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
104a30437d06        busybox             "/bin/sh -c 'i=0; ..."   4 minutes ago       Up 3 seconds                            cr
[bargee@barge ~]$ docker logs cr
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
```

おお〜生き返ったｗ
ちゃんと `11` から再開しています。

ちなみに、`--checkpoint` なしの `docker start` だと、

```
[bargee@barge ~]$ docker start cr
cr
[bargee@barge ~]$ docker logs cr
0
1
2
3
4
5
6
7
8
9
10
0
1
2
3
4
5
```

`0` からの再起動になりました。