BargeのDockerを最新化し、docker-composeを導入する

## 結論
**Docker最新化の方法**

```
$ sudo /etc/init.d/docker restart latest
```

**docker-composeをインストールする方法**

```
$ sudo wget "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -O /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
```

## Bargeとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199887/a294fed1-8326-f2d8-8d41-ec4855c5a141.png)

Dockerホストに特化したLinuxディストリビューションです。 

Dockerで軽量OSというとAlpine Linuxが思い浮かびますが、用途が全く異なります。BargeはDockerホスト向けで、Alpine LinuxはDockerイメージ向けです。

詳しい説明は[公式](https://github.com/bargees/barge-os)や、[分かりやすい記事](https://qiita.com/A-I/items/8dc7ddc52e6038b5c74b)に譲り、自分が使ってみた感想だけ書きます。

### 良いところ

* **軽量で起動が高速**  
最新のBarge2.13.0のisoイメージのサイズは **驚異の14MB** 。  
UbuntuやCentOSのイメージファイルと比較すると、その軽量ぶりが際立ちます。 

|  OS  |  isoイメージファイルサイズ  |
| :----: | :---- |
|  CentOS 7.8  |  4.5GB  |
|  Ubuntu 20.04  |  2.5GB  | 
| **Barge 2.13.0**  |  **14MB**  |  


* **最初からDockerがインストールされている**  
UbuntuやCentOSにはDockerがデフォルトで入っておらず、またOSのバージョンによってはインストール手順が複雑です。動作確認の前にインストールで躓いたことがある人も多いのではないでしょうか(経験談)。  
Bargeには最初からDockerが入っているため、起動すればすぐにDockerを使えます。また、Dockerのバージョンの切り替えも簡単なので、特定のバージョンをサクッと使いたいというニーズにも応えられます。

### 微妙なところ
* **パッケージ管理が独特** 
Ubuntuでいうところの`apt`、CentOSでいうところの`yum`は、Bargeでは`pkg`というコマンドです。 
FreeBSDのパッケージ管理コマンドも`pkg`という名前ですが、特に関係ないようです。 
他のディストリビューションでは難なく入れられる(またはデフォルトで入っている)パッケージが、簡単にインストールできないことがあります。(例：`curl`) 


* **最近更新されていない** 
2020年4月時点で、[最新のリリースバージョン](https://github.com/bargees/barge-os/releases)は `2.14.0-rc2` で、リリース日は2019年8月です。 
それまでは少なくとも2月に1度以上はリリースされていたため、今後更新されない可能性もあります。


## 環境
[Vagrant box](https://app.vagrantup.com/ailispaw/boxes/barge)を利用して起動

```
[bargee@barge ~]$ cat /etc/os-release
NAME="Barge"
VERSION=2.13.0
ID=barge
ID_LIKE=busybox
VERSION_ID=2.13.0
PRETTY_NAME="Barge 2.13.0"
HOME_URL="https://github.com/bargees/barge-os"
BUG_REPORT_URL="https://github.com/bargees/barge-os/issues"
```

## Dockerの最新化
Barge のデフォルトのDockerは古いです。CE版になる以前のもので、2016年頃のバージョンです。

```
[bargee@barge ~]$ docker --version
Docker version 1.10.3, build 20f81dd
```
アップデートが必要なので、以下のコマンドを打ちます。
ここで、`/etc/init.d/`は省略不可能です。通常の`docker`コマンドとは異なることに注意してください。(通常の`docker`コマンドがどこを指しているかは、`which docker`で確認できます。)

```
[bargee@barge ~]$ sudo /etc/init.d/docker restart latest
docker[647]: 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 v19.03.8 ...
```
少し時間がかかるので気長に待ちましょう。
Dockerデーモンの再起動が終わったら、バージョンが更新されていることを確認します。

```
[bargee@barge ~]$ docker --version
Docker version 19.03.8, build afacb8b7f0
```

`latest`とすると最新版のDockerに切り替わりますが、以下のように特定のバージョンを指定することもできます。

```
[bargee@barge ~]$ sudo /etc/init.d/docker restart v19.03.8
```

## docker-composeのインストール
Barge には`docker-compose`はデフォルトで入っていません。[公式サイトの手順](https://docs.docker.com/compose/install/) 通りにインストールしようとすると、`curl`が無くて詰みます。`sudo pkg install curl`としても`curl`はインストールできませんでした。 
代わりに`wget`がデフォルトで入っているため、`wget`で代用します。2020年4月時点での`docker-compose`安定版の最新バージョン(1.25.5)をインストールします。

```
[bargee@barge ~]$ sudo wget "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -O /usr/local/bin/docker-compose
[bargee@barge ~]$ sudo chmod +x /usr/local/bin/docker-compose
```

curlのファイル保存先指定は`-o` 
wgetのファイル保存先指定は`-O` 
`curl -O`と`wget -o`にはそれぞれ別の意味があって... ややこしいですね。
　
Bargeは`usr/local/bin`にデフォルトではPATHが通っていないので、PATHが通っている`/usr/bin`にシンボリックリンクを設定します。 
バージョンを確認して、PATHを通せたことを確認します。

```
[bargee@barge ~]$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
[bargee@barge ~]$ docker-compose --version
docker-compose version 1.25.5, build 8a1c60f6
```

以上で、Barge に最新のDockerとdocker-composeをインストールできました。

## 参考
* [Barge（Docker ホスト用軽量 OS）って？](https://qiita.com/A-I/items/8dc7ddc52e6038b5c74b)
* [BargeOSでPython環境を作る](https://qiita.com/daichannel/items/e3dbc3d9b60566a4f4de)
* [GitHubリポジトリ(bargees/barge-os)](https://github.com/bargees/barge-os)
* [Barge Vagrant Box](https://app.vagrantup.com/ailispaw/boxes/barge)