Docker CE 構築 on CentOS7

# はじめに
今更ですが、コンテナ関連を勉強していきます。今回は基礎であるDockerを導入してみます。
KubernetesやOpenShiftへもチャレンジしていければと考えています。

Dockerには、Community Edition (CE) と Enterprise Edition (EE)の2つのVersionが存在します。
今回は、Docker CEを CentOS7 にInstallします

DockerCEとDockerEEには、機能差が存在しています。
詳細は以下を参照
https://docs.docker.com/install/


# 前提条件確認
Repository
Extras Repositoryが有効になっているか確認します。
CentOS7では、Defaultで有効にされていますが、手動で無効にした場合は有効にする必要があります。

```
[root@sugi-docker-registory dev]# yum repolist
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
repo id                                                                                            repo name                                                                                             status
base/7/x86_64                                                                                      CentOS-7 - Base                                                                                       9,591
extras/7/x86_64                                                                                    CentOS-7 - Extras                                                                                       388
updates/7/x86_64                                                                                   CentOS-7 - Updates                                                                                    1,929
repolist: 11,908
```


# Install Docker CE
## Repositoryの設定
前提パッケージを導入します。

```
yum install -y yum-utils device-mapper-persistent-data lvm2
```

StableRepositoryを有効にします。

```
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
```

確認

```
[root@sugi-docker-registory dev]# yum repolist
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
repo id                                                     repo name                                                      status
base/7/x86_64                                               CentOS-7 - Base                                                9,591
docker-ce-stable/x86_64                                     Docker CE Stable - x86_64                                         12
extras/7/x86_64                                             CentOS-7 - Extras                                                388
updates/7/x86_64                                            CentOS-7 - Updates                                             1,929
repolist: 11,920
```

DockerCEをinstallします

```
yum install -y docker-ce
```

依存関係メモ

```
=================================================================================================================================
 Package                            Arch               Version                                Repository                    Size
=================================================================================================================================
Installing:
 docker-ce                          x86_64             17.12.0.ce-1.el7.centos                docker-ce-stable              30 M
Installing for dependencies:
 audit-libs-python                  x86_64             2.7.6-3.el7                            base                          73 k
 checkpolicy                        x86_64             2.5-4.el7                              base                         290 k
 container-selinux                  noarch             2:2.36-1.gitff95335.el7                extras                        31 k
 libcgroup                          x86_64             0.41-13.el7                            base                          65 k
 libsemanage-python                 x86_64             2.5-8.el7                              base                         104 k
 policycoreutils-python             x86_64             2.5-17.1.el7                           base                         446 k
 python-IPy                         noarch             0.75-6.el7                             base                          32 k
 setools-libs                       x86_64             3.3.8-1.1.el7                          base                         612 k

Transaction Summary
=================================================================================================================================
```

上記Installによって、Docker Groupが追加されている

```
[root@sugi-docker-registory ~]# cat /etc/group | grep docker
docker:x:993:
```

DockerがSystemdにServiceとして追加されている

```
[root@sugi-docker-registory ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: https://docs.docker.com
```

Dockerの起動 + 自動起動

```
systemctl start docker
systemctl enable docker
```

正常起動  
dockerd と docker-containerd が起動されていることがわかります

```
[root@sugi-docker-registory ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since Sun 2018-02-18 15:28:27 JST; 7s ago
     Docs: https://docs.docker.com
 Main PID: 12097 (dockerd)
   Memory: 22.6M
   CGroup: /system.slice/docker.service
           ├─12097 /usr/bin/dockerd
           └─12102 docker-containerd --config /var/run/docker/containerd/containerd.toml

Feb 18 15:28:26 sugi-docker-registory.localdomain dockerd[12097]: time="2018-02-18T15:28:26+09:00" level=info msg=serving... address="/var/run/docker/containerd/docker-containerd.sock" module=...ainerd/grpc"
Feb 18 15:28:26 sugi-docker-registory.localdomain dockerd[12097]: time="2018-02-18T15:28:26+09:00" level=info msg="containerd successfully booted in 0.007210s" module=containerd
Feb 18 15:28:26 sugi-docker-registory.localdomain dockerd[12097]: time="2018-02-18T15:28:26.729217361+09:00" level=info msg="Graph migration to content-addressability took 0.00 seconds"
Feb 18 15:28:26 sugi-docker-registory.localdomain dockerd[12097]: time="2018-02-18T15:28:26.730328192+09:00" level=info msg="Loading containers: start."
Feb 18 15:28:27 sugi-docker-registory.localdomain dockerd[12097]: time="2018-02-18T15:28:27.014489988+09:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/... IP address"
Feb 18 15:28:27 sugi-docker-registory.localdomain dockerd[12097]: time="2018-02-18T15:28:27.098751802+09:00" level=info msg="Loading containers: done."
Feb 18 15:28:27 sugi-docker-registory.localdomain dockerd[12097]: time="2018-02-18T15:28:27.122713057+09:00" level=info msg="Docker daemon" commit=c97c6d6 graphdriver(s)=overlay2 version=17.12.0-ce
Feb 18 15:28:27 sugi-docker-registory.localdomain dockerd[12097]: time="2018-02-18T15:28:27.122888863+09:00" level=info msg="Daemon has completed initialization"
Feb 18 15:28:27 sugi-docker-registory.localdomain systemd[1]: Started Docker Application Container Engine.
Feb 18 15:28:27 sugi-docker-registory.localdomain dockerd[12097]: time="2018-02-18T15:28:27.145756482+09:00" level=info msg="API listen on /var/run/docker.sock"
Hint: Some lines were ellipsized, use -l to show in full.
```

現在は、何もコンテナが稼働していません

```
[root@sugi-docker-registory ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

hello-worldイメージを実行して、正常にDockerが実行されたかを確認します

```
docker run hello-world
```

実行例  
以下のように表示されれば、正常にInstall出来たことが確認できます。  
下記実行後、自動的にコンテナは終了します。

```
[root@sugi-docker-registory ~]# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
ca4f61b1923c: Pull complete
Digest: sha256:083de497cff944f969d8499ab94f07134c50bcf5e6b9559b27182d3fa80ce3f7
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://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/
```

hello-worldイメージが自動的にダウンロードされています

```
[root@sugi-docker-registory ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              f2a91732366c        2 months ago        1.85kB
```

# Post-installation steps for Linux
Dockerがインストール出来た後、実行した方が良いConfigを実施していきます  

## Dockerをroot以外のユーザで実行する
Docker Daemon は、TCPポートの代わりに、Unix Domain Socketをバインドします。
Unix Domain Socket は、Defalutではrootユーザで実行されています。

memo netstatで、DockerのDefalutのUnix Domain Socket を確認  
Docker文字列が含まれているもののみ抽出

```
[root@sugi-docker-registory ~]# netstat -al --protocol=unix
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 sugi-docker-registo:ssh 192.168.120.252:36080   ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags       Type       State         I-Node   Path
unix  2      [ ACC ]     STREAM     LISTENING     39986    /var/run/docker/metrics.sock
unix  2      [ ACC ]     STREAM     LISTENING     35130    /var/run/docker.sock
unix  2      [ ACC ]     STREAM     LISTENING     35146    /var/run/docker/containerd/docker-containerd-debug.sock
unix  2      [ ACC ]     STREAM     LISTENING     35148    /var/run/docker/containerd/docker-containerd.sock
unix  2      [ ACC ]     STREAM     LISTENING     40129    /run/docker/libnetwork/3726d3ce0f55fd85bda7654bdd8e9c22e6696c57fa5b90b21ec98a1c85f825a8.sock
unix  3      [ ]         STREAM     CONNECTED     35150    /var/run/docker/containerd/docker-containerd.sock
unix  3      [ ]         STREAM     CONNECTED     39992    /var/run/docker/containerd/docker-containerd.sock
unix  3      [ ]         STREAM     CONNECTED     35160    /var/run/docker/containerd/docker-containerd.sock
```

memo processがrootで実行されている

```
[root@sugi-docker-registory ~]# ps aux | grep docker
root     12097  0.1  0.9 468284 37828 ?        Ssl  15:28   0:02 /usr/bin/dockerd
root     12102  0.2  0.5 236444 22116 ?        Ssl  15:28   0:03 docker-containerd --config /var/run/docker/containerd/containerd.toml
```

Dockerを他のユーザで管理したい場合は、以下を実行します。  
docker_user を作成します

```
useradd docker_user
echo 'Passw0rd!' | passwd --stdin docker_user
usermod -aG docker docker_user
```

docker_userにスイッチして、hello-worldを実行します。
正常に実行出来ればOKです

```
[root@sugi-docker-registory ~]# su - docker_user
Last login: Sun Feb 18 16:03:27 JST 2018 on pts/0
[docker_user@sugi-docker-registory ~]$
[docker_user@sugi-docker-registory ~]$ docker run hello-world

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://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/
```


## Storage Driverの選択
Dockerには、Storage Driverと呼ばれる、コンテナイメージの管理ドライバが存在します。
Volume Pluginと似た名前ですが、別物です。
以下URLにわかりやすく説明されています
https://knowledge.sakura.ad.jp/5021/


構築したDocker環境の情報を docker info コマンドで調べます。
Storage Driverは、Defaultで overlay2 が使用されています。
なお、Runtimesは、runCが実行されています。

```
[root@sugi-docker-registory ~]# docker info
Containers: 4
 Running: 0
 Paused: 0
 Stopped: 4
Images: 1
Server Version: 17.12.0-ce
Storage Driver: overlay2
 Backing Filesystem: xfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 89623f28b87a6004d4b785663257362d1658a729
runc version: b2567b37d7b75eb4cf325b77297b140ea686ce8f
init version: 949e6fa
Security Options:
 seccomp
  Profile: default
Kernel Version: 3.10.0-693.17.1.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 3.702GiB
Name: sugi-docker-registory.localdomain
ID: LQOF:D2EF:S7UT:4ZP5:YEUF:ARQ2:75RP:MMSS:I4BK:WIY7:3WB6:GJEO
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false

WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
```


CentOSのCE版の推奨ストレージドライバは、devicemapperとvfsなので、devicemapperに変更します。
https://docs.docker.com/storage/storagedriver/select-storage-driver/#supported-storage-drivers-per-linux-distribution

なお、現時点でのlvmとdevice mapperのディレクトリを確認しておきます。
lvm

```
[root@sugi-docker-registory ~]# pvs
  PV         VG Fmt  Attr PSize    PFree
  /dev/sda2  cl lvm2 a--   <15.00g    0
  /dev/sda3  cl lvm2 a--  <184.00g    0
[root@sugi-docker-registory ~]#
[root@sugi-docker-registory ~]# lvs
  LV   VG Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root cl -wi-ao---- 197.39g                                                    
  swap cl -wi-ao----   1.60g                                                    
[root@sugi-docker-registory ~]#
[root@sugi-docker-registory ~]# vgs
  VG #PV #LV #SN Attr   VSize   VFree
  cl   2   2   0 wz--n- 198.99g    0
```

device mapper

```
[root@sugi-docker-registory mapper]# ls -la
total 0
drwxr-xr-x  2 root root     100 Feb 18 14:29 .
drwxr-xr-x 19 root root    3180 Feb 18 14:29 ..
lrwxrwxrwx  1 root root       7 Feb 18 14:31 cl-root -> ../dm-0
lrwxrwxrwx  1 root root       7 Feb 18 14:29 cl-swap -> ../dm-1
crw-------  1 root root 10, 236 Feb 18 14:29 control
```

Storage Driverを変更すると、既に作成しているコンテナにはアクセスできなくなります。
docker save コマンドを使用して、 Docker Hub などのRepositoryに保存しておき、変更後に再度取得する必要があります。

devicemapperの設定には、テスト用の loop-lvm mode と 本番環境用の direct-lvm mode が存在します。
loop-lvmは、ファイルシステム上にLoopback Device を作成して稼働するため、パフォーマンスとリソース効率が悪いです。
本番環境では必ず direct-lvm mode を使用します。

direct-lvm mode で設定を進めます。

### Docker を設定変更し、direct-lvm mode へ
direct-lvm mode へ変更するには、2種類の方法があります。
1個のdeviceしか使用できない自動設定と、複数のdeviceを使用できる、手動設定です。
構成を把握するために手動設定を進めていきます。

次の手順では、ストレージプールとして使用するために、Thin Pool の Logical Volume を LVM にて作成します。
今回は、direct-lvmとして、/dev/sdb のdeviceを使用します。

まず、Dockerを停止します

```
systemctl stop docker
```

pvcreate で Physical Volumeを作成します

```
pvcreate /dev/sdb
```

確認します

```
[root@sugi-docker-registory dev]# pvs
  PV         VG Fmt  Attr PSize    PFree  
  /dev/sda2  cl lvm2 a--   <15.00g      0
  /dev/sda3  cl lvm2 a--  <184.00g      0
  /dev/sdb      lvm2 ---   200.00g 200.00g
```

docker という名前で Volume Group を作成します

```
vgcreate docker /dev/sdb
```

確認します

```
[root@sugi-docker-registory dev]# vgs
  VG     #PV #LV #SN Attr   VSize    VFree   
  cl       2   2   0 wz--n-  198.99g       0
  docker   1   0   0 wz--n- <200.00g <200.00g
```

作成した Volume Group から 2個の Logical Volume を作成します  
末尾の % の指定は Docker の推奨値です

```
lvcreate --wipesignatures y -n thinpool docker -l 95%VG
lvcreate --wipesignatures y -n thinpoolmeta docker -l 1%VG
```

確認します

```
[root@sugi-docker-registory dev]# lvs
  LV           VG     Attr       LSize    Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root         cl     -wi-ao----  197.39g                                                    
  swap         cl     -wi-ao----    1.60g                                                    
  thinpool     docker -wi-a----- <190.00g                                                    
  thinpoolmeta docker -wi-a-----   <2.00g     
```

lvconvert コマンドで、Logical Volume を Thin に変換します

```
lvconvert --zero n -c 512K --thinpool docker/thinpool --poolmetadata docker/thinpoolmeta
```

実行例

```
[root@sugi-docker-registory dev]# lvconvert --zero n -c 512K --thinpool docker/thinpool --poolmetadata docker/thinpoolmeta
  Thin pool volume with chunk size 512.00 KiB can address at most 126.50 TiB of data.
  WARNING: Converting logical volume docker/thinpool and docker/thinpoolmeta to thin pool's data and metadata volumes with metadata wiping.
  THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.)
Do you really want to convert docker/thinpool and docker/thinpoolmeta? [y/n]: y
  Converted docker/thinpool_tdata to thin pool.
```

lvmのprofileを変更して、thin pool を自動拡張するようにします  
thin_pool_autoextend_threshold は、自動拡張が発生した際に、X%までの使用量となるように指定します
thin_pool_autoextend_percent は、自動拡張が発生する残りの空き容量を指定します。

```
vi /etc/lvm/profile/docker-thinpool.profile
```

```
activation {
  thin_pool_autoextend_threshold=80
  thin_pool_autoextend_percent=20
}
```


profileを変更後、反映させます

```
lvchange --metadataprofile docker-thinpool docker/thinpool
```

実行例

```
[root@sugi-docker-registory dev]# lvchange --metadataprofile docker-thinpool docker/thinpool
  Logical volume docker/thinpool changed.
```

自動拡張のモニタリングを有効にします

```
lvs -o+seg_monitor
```

実行例

```
[root@sugi-docker-registory dev]# lvs -o+seg_monitor
  LV       VG     Attr       LSize    Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert Monitor  
  root     cl     -wi-ao----  197.39g                                                              
  root     cl     -wi-ao----  197.39g                                                              
  swap     cl     -wi-ao----    1.60g                                                              
  thinpool docker twi-a-t--- <190.00g             0.00   0.01                             monitored
```

過去に実行したDockerのファイルをoldへ移動します

```
mkdir /var/lib/docker.bk
mv /var/lib/docker/* /var/lib/docker.bk
```

/etc/docker/daemon.json を編集して、devicemapper を使用するようにします。
/etc/docker/daemon.json が空の場合は、以下のように設定してください

```
vim /etc/docker/daemon.json
```
```
{
    "storage-driver": "devicemapper",
    "storage-opts": [
      "dm.thinpooldev=/dev/mapper/docker-thinpool",
      "dm.use_deferred_removal=true",
      "dm.use_deferred_deletion=true"
    ]
}
```

docker を起動します

```
systemctl start docker
```


docker info を確認します  
Storage Driverが devicemapper となっています。

```
[root@sugi-docker-registory docker]# docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 17.12.0-ce
Storage Driver: devicemapper
 Pool Name: docker-thinpool
 Pool Blocksize: 524.3kB
 Base Device Size: 10.74GB
 Backing Filesystem: xfs
 Udev Sync Supported: true
 Data Space Used: 20.45MB
 Data Space Total: 204GB
 Data Space Available: 204GB
 Metadata Space Used: 266.2kB
 Metadata Space Total: 2.143GB
 Metadata Space Available: 2.143GB
 Thin Pool Minimum Free Space: 20.4GB
 Deferred Removal Enabled: true
 Deferred Deletion Enabled: true
 Deferred Deleted Device Count: 0
 Library Version: 1.02.140-RHEL7 (2017-05-03)
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 89623f28b87a6004d4b785663257362d1658a729
runc version: b2567b37d7b75eb4cf325b77297b140ea686ce8f
init version: 949e6fa
Security Options:
 seccomp
  Profile: default
Kernel Version: 3.10.0-693.17.1.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 3.702GiB
Name: sugi-docker-registory.localdomain
ID: LQOF:D2EF:S7UT:4ZP5:YEUF:ARQ2:75RP:MMSS:I4BK:WIY7:3WB6:GJEO
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false

WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
```


oldへ移動したデータを全て削除します

```
rm -rf /var/lib/docker.bk
```

# defaultのNW周りを確認
Docket NWを確認

```
[root@sugi-docker-registory ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
3afcf241b318        bridge              bridge              local
329c0c8ffc50        host                host                local
f97b8d34a922        none                null                local
```

Linux Bridgeを確認する brctl コマンドを有効にするため、以下をinstallする

```
yum install bridge-utils
```

Default状態のLinuxBridgeを確認する  
docker0という名前のBridgeが作成されている

```
[root@sugi-docker-registory ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.0242ac6ec522       no       
```

ipコマンドで確認

```
[root@sugi-docker-registory ~]# ip -d a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 promiscuity 0
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:50:56:98:57:73 brd ff:ff:ff:ff:ff:ff promiscuity 0
    inet 192.168.120.210/24 brd 192.168.120.255 scope global ens192
       valid_lft forever preferred_lft forever
    inet6 fe80::98a0:413d:6b71:8fbd/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
    link/ether 02:42:ac:6e:c5:22 brd ff:ff:ff:ff:ff:ff promiscuity 0
    bridge forward_delay 1500 hello_time 200 max_age 2000 ageing_time 30000 stp_state 0 priority 32768 vlan_filtering 0 vlan_protocol 802.1Q bridge_id 8000.2:42:ac:6e:c5:22 designated_root 8000.2:42:ac:6e:c5:22 root_port 0 root_path_cost 0 topology_change 0 topology_change_detected 0 hello_timer    0.00 tcn_timer    0.00 topology_change_timer    0.00 gc_timer    0.28 vlan_default_pvid 1 group_fwd_mask 0 group_address 01:80:c2:00:00:00 mcast_snooping 1 mcast_router 1 mcast_query_use_ifaddr 0 mcast_querier 0 mcast_hash_elasticity 4 mcast_hash_max 512 mcast_last_member_count 2 mcast_startup_query_count 2 mcast_last_member_interval 100 mcast_membership_interval 26000 mcast_querier_interval 25500 mcast_query_interval 12500 mcast_query_response_interval 1000 mcast_startup_query_interval 3125
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe6e:c522/64 scope link
       valid_lft forever preferred_lft forever
```

iptablesでNAPTしているので、natテーブルを確認

```
[root@sugi-docker-registory ~]# iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  anywhere             anywhere             ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  anywhere            !loopback/8           ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  172.17.0.0/16        anywhere            

Chain DOCKER (2 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere           
```

filterテーブルも確認

```
[root@sugi-docker-registory ~]# iptables -L -t filter
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy DROP)
target     prot opt source               destination         
DOCKER-USER  all  --  anywhere             anywhere            
DOCKER-ISOLATION  all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain DOCKER (1 references)
target     prot opt source               destination         

Chain DOCKER-ISOLATION (1 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere            

Chain DOCKER-USER (1 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere            
```



# 参考URL

Install
https://docs.docker.com/install/linux/docker-ce/centos/
https://docs.docker.com/install/linux/linux-postinstall/

Storage Driver
https://docs.docker.com/storage/storagedriver/select-storage-driver/#supported-storage-drivers-per-linux-distribution
https://docs.docker.com/storage/storagedriver/device-mapper-driver/

Unix Domain Socketのわかりやすい説明
https://qiita.com/kuni-nakaji/items/d11219e4ad7c74ece748

ボリュームプラグインとストレージドライバのわかりやすい説明
https://knowledge.sakura.ad.jp/5021/