CentOS7 Docker + Docker Compose のインストール

# この記事に書かれている事

[CentOS7](http://isoredirect.centos.org/centos/7/isos/x86_64/) への Docker 及び Docker-compose のインストール

* SeLinuxの無効化  
いろいろと制限が出るから無効化しちゃいましょう。
* Dockerのインストール
* 動作確認
* Docker Composeのインストール

しばらく触らないと忘れちゃうので備忘録として、、、

## SeLinuxの無効化

* コマンドで監視モードに変更
* 再起動後は無効化されるように設定ファイルを変更

```shell
[user01@cent7 ~] getenforce
Enforcing
[user01@cent7 ~] sudo setenforce 0
[user01@cent7 ~] getenforce
Permissive
[user01@cent7 ~] sudo vi /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
##SELINUX=enforcing
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
[user01@cent7 ~]
```

## Dcokerのインストール

参考）
[Get Docker Engine - Community for CentOS](https://docs.docker.com/install/linux/docker-ce/centos/)

### 古いモジュールの削除

以前インストールしていたら古いモジュールを削除しましょう。

```shell
[user01@centos7 ~]$ sudo yum remove docker \
> docker-client \
> docker-client-latest \
> docker-common \
> docker-latest \
> docker-latest-logrotate \
> docker-logrotate \
> docker-engine \
> docker-engine-selinux
[user01@centos7 ~]$ sudo rm /etc/yum.repos.d/docker.repo
```

### 必要な関連パッケージをインストール

```shell
[user01@centos7 ~]$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
```

### Dockerのインストール

* Docker リポジトリを追加
* Docker インストール

```shell
[user01@centos7 ~]$ sudo yum-config-manager \
--add-repo https://download.docker.com/linux/centos/docker-ce.repo
[user01@centos7 ~]$ sudo yum install -y docker-ce docker-ce-cli containerd.io
```

### Docker管理者をdockerグループに追加

参考）
[Post-installation steps for Linux](https://docs.docker.com/install/linux/linux-postinstall/)

グループ docker に参加させることで sudo せずに dockerコマンドを実行できるようになります。
この設定をしなくてもsudoすれば良いだけなので必要に応じて任意で実行してください。
以下の設定例では $USER （ログイン中のユーザ） をDocker管理者に追加しています。
※ログイン中のユーザにはgroupの変更は反映されません。docker の操作前に再ログインしてください。

```shell
[user01@centos7 ~]$ LANG=C man usermod
[user01@centos7 ~]$ sudo usermod -aG docker $USER
 [sudo] user01 のパスワード:
[user01@centos7 ~]$ id $USER
uid=1000(user01) gid=1000(user01) groups=1000(user01),10(wheel),980(docker)
[user01@centos7 ~]$
```
usermod -a の説明は LANG=ja_JP.UTF-8 では出てきません。
LANG=Cで確認してください。

### 動作確認

* Docker の起動
* Docker 自動起動設定
* 動作確認

```shell
[user01@centos7 ~]$ sudo systemctl start docker
[user01@centos7 ~]$ sudo systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[user01@centos7 ~]$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since 土 2019-03-09 12:16:43 JST; 17s ago
     Docs: https://docs.docker.com
 Main PID: 12648 (dockerd)
   CGroup: /system.slice/docker.service
           mq12648 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

 3月 09 12:16:42 centos7 dockerd[12648]: time="2019-03-09T12:16:42.470344031+09:00" level=info msg="[graphdriver] using prior storage driver: overlay"
 3月 09 12:16:42 centos7 dockerd[12648]: time="2019-03-09T12:16:42.470393144+09:00" level=warning msg="[graphdriver] WARNING: the overlay st... release"
 3月 09 12:16:42 centos7 dockerd[12648]: time="2019-03-09T12:16:42.474175363+09:00" level=info msg="Graph migration to content-addressabilit... seconds"
 3月 09 12:16:42 centos7 dockerd[12648]: time="2019-03-09T12:16:42.475348040+09:00" level=info msg="Loading containers: start."
 3月 09 12:16:43 centos7 dockerd[12648]: time="2019-03-09T12:16:43.076457928+09:00" level=info msg="Default bridge (docker0) is assigned wit... address"
 3月 09 12:16:43 centos7 dockerd[12648]: time="2019-03-09T12:16:43.342253505+09:00" level=info msg="Loading containers: done."
 3月 09 12:16:43 centos7 dockerd[12648]: time="2019-03-09T12:16:43.372317576+09:00" level=info msg="Docker daemon" commit=774a1f4 graphdrive...n=18.09.3
 3月 09 12:16:43 centos7 dockerd[12648]: time="2019-03-09T12:16:43.372423919+09:00" level=info msg="Daemon has completed initialization"
 3月 09 12:16:43 centos7 dockerd[12648]: time="2019-03-09T12:16:43.398960579+09:00" level=info msg="API listen on /var/run/docker.sock"
 3月 09 12:16:43 centos7 systemd[1]: Started Docker Application Container Engine.
Hint: Some lines were ellipsized, use -l to show in full.
[user01@centos7 ~]$ 
[user01@centos7 ~]$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
```

## Docker Composeのインストール

参考）
[Install Docker Compose](https://docs.docker.com/compose/install/#install-compose-on-linux-systems)

とりあえず手順通りにインストール。変数の扱いに注意。
ただ、最新版をインストールしたい場合 [github](https://github.com/docker/compose/releases/) を参照し最新版のversionを確認して curl で指定する URLのバージョン番号を調整しましょう。

### 依存パッケージの導入

alpine Linux の場合しか書いてないのでとりあえずスルー

### Docker Compose のインストール

すごく簡単です。

* github のファイルをダウンロード
* 実行権限を付与
* 必要なら Link を作成

```shell
Install Docker Compose に書いてるコマンドサンプル（失敗する場合下のコマンドを試してください）
[user01@cent7 ~]$ sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

上のコマンドが失敗した場合、こっちのコマンドを試してください
[user01@cent7 ~]$ sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   617    0   617    0     0   1354      0 --:--:-- --:--:-- --:--:--  1356
100 16.4M  100 16.4M    0     0  1328k      0  0:00:12  0:00:12 --:--:-- 1676k
[user01@cent7 ~]$ sudo chmod +x /usr/local/bin/docker-compose
[user01@cent7 ~]$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
```
上記のコマンドで指定している"1.27.4"は最新のリリースでは無い事が考えられます。
最新バージョンなどサンプルと異なるバージョンを導入する場合、[github.com/docker/compose/releases](https://github.com/docker/compose/releases) でバージョンを確認して、導入したいバージョンに書き換えてください。