ネットから隔離されたCentOS7 サーバに Docker を導入する

#はじめに
あまり需要のなさそうな情報だけど、もしかしたら開発環境がネットから徹底的に隔離されたSI開発現場などで同じことを考えてる人がいるかも……との思いから共有。作業概要は以下のとおり：

</br>

- ネットに繋がった CentOS7 で Docker CE のインストールに必要な全 rpm をダウンロードする
- ダウンロードした rpm 群からリポジトリを作成する
- リポジトリをインストール先環境へ転送し、ローカルインストールを行う


#作業環境

- ダウンロード用環境
 - CentOS 7.5 
 - インターネット接続有り

- インストール先環境
 - CentOS 7.5
 - Docker CE 18.09
 - 開発用のクローズドLANのみに接続


# yumdownloader を使って rpm をダウンロード
インターネットに接続されたダウンロード用環境（今回は Vagrant で CentOS 7.5 環境を作成）にて`yumdownloader` を使用して依存関係含めたすべての rpm を入手する。

```console
# mkdir -p /work/dockerrpm
# cd /work/dockerrpm

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

終わると、コマンドを実行したディレクトリ配下にインストールに必要となる全 rpm がダウンロードされている。

```console
# ls -l
total 68200
-rw-r--r--. 1 root root   255648 Nov 12 14:21 audit-2.8.4-4.el7.x86_64.rpm
-rw-r--r--. 1 root root   102448 Nov 12 14:21 audit-libs-2.8.4-4.el7.x86_64.rpm
-rw-r--r--. 1 root root    78216 Nov 12 14:21 audit-libs-python-2.8.4-4.el7.x86_64.rpm
-rw-r--r--. 1 root root   302068 Nov 12 14:22 checkpolicy-2.5-8.el7.x86_64.rpm
-rw-r--r--. 1 root root 23217684 Mar 28 05:00 containerd.io-1.2.5-3.1.el7.x86_64.rpm
-rw-r--r--. 1 root root    38436 Nov 30 21:05 container-selinux-2.74-1.el7.noarch.rpm
-rw-r--r--. 1 root root 19625052 Mar 28 05:00 docker-ce-18.09.4-3.el7.x86_64.rpm
-rw-r--r--. 1 root root 14678328 Mar 28 05:00 docker-ce-cli-18.09.4-3.el7.x86_64.rpm
-rw-r--r--. 1 root root    67652 Nov 12 14:31 libcgroup-0.41-20.el7.x86_64.rpm
-rw-r--r--. 1 root root   165932 Nov 12 14:37 libselinux-2.5-14.1.el7.x86_64.rpm
-rw-r--r--. 1 root root   241132 Nov 12 14:37 libselinux-python-2.5-14.1.el7.x86_64.rpm
-rw-r--r--. 1 root root   155092 Nov 12 14:37 libselinux-utils-2.5-14.1.el7.x86_64.rpm
-rw-r--r--. 1 root root   154244 Nov 12 14:37 libsemanage-2.5-14.el7.x86_64.rpm
-rw-r--r--. 1 root root   115284 Nov 12 14:37 libsemanage-python-2.5-14.el7.x86_64.rpm
-rw-r--r--. 1 root root   304196 Nov 12 14:37 libsepol-2.5-10.el7.x86_64.rpm
-rw-r--r--. 1 root root   470188 Feb  1 17:49 policycoreutils-2.5-22.el7_2.5-29.el7_6.1.x86_64.drpm
-rw-r--r--. 1 root root   938004 Feb  1 16:21 policycoreutils-2.5-29.el7_6.1.x86_64.rpm
-rw-r--r--. 1 root root   466748 Feb  1 16:22 policycoreutils-python-2.5-29.el7_6.1.x86_64.rpm
-rw-r--r--. 1 root root    32880 Jul  4  2014 python-IPy-0.75-6.el7.noarch.rpm
-rw-r--r--. 1 root root   495060 Feb  1 16:26 selinux-policy-3.13.1-229.el7_6.9.noarch.rpm
-rw-r--r--. 1 root root  7246376 Feb  1 16:26 selinux-policy-targeted-3.13.1-229.el7_6.9.noarch.rpm
-rw-r--r--. 1 root root   635184 Nov 12 14:46 setools-libs-3.3.8-4.el7.x86_64.rpm
```

# レポジトリの作成

`createrepo` を使用して Docker CE インストール用のレポジトリを作成。`createrepo` コマンドがない場合 yum でインストール。

```console
# yum install -y createrepo
```

先にダウンロードした rpm のあるディレクトリを指定してレポジトリを作成。成功すると指定したディレクトリの配下に `repodata` ディレクトリが作成され、レポジトリデータが格納される。

```
# createrepo /work/dockerrpm
Spawning worker 0 with 21 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
```

ついでに `dockerrpm.repo` というリポジトリ設定もここでつくっておく。

```/work/dockerrpm/dockerrpm.repo
[dockerrpm]
name=dockerrpm
baseurl=file:///work/dockerrpm
gpgcheck=0
```

インストール先環境へ転送するために tar.gz にまとめておく。

```
# cd /
# tar -zcvf dockerrpm.tar.gz work/dockerrpm
```

# インストール先環境へインストール
作成した tar.gz ファイルをインストール先環境へ転送。クローズドな開発環境だとファイルサイズやら持ち込む経路やら媒体やら申請やら何やらでここが地味に高いハードルになることがままあるけどそこはなんとかがんばって……。
</br>
無事 tar.gz ファイルをインストール先環境に転送できたら展開する。

```console
# cd /
# tar -zxvf dockerrpm.tar.gz
```

作成しておいたリポジトリ設定を `yum-config-manager` で追加する。

```
# yum-config-manager --add-repo file:///work/dockerrpm/dockerrpm.repo
Failed to set locale, defaulting to C
Loaded plugins: fastestmirror
adding repo from: file:///work/dockerrpm/dockerrpm.repo
grabbing file file:///work/dockerrpm/dockerrpm.repo to /etc/yum.repos.d/dockerrpm.repo
repo saved to /etc/yum.repos.d/dockerrpm.repo
```

いざインストール。ネットに繋がってないので余計なリポジトリ参照を行わないよう除外しつつ、今回作成したリポジトリのみを有効にする。

```
# yum install -y --disablerepo=\* --enablerepo=dockerrpm /work/dockerrpm/docker-ce-18.09.4-3.el7.x86_64.rpm 
```

最終的に以下のメッセージが出力されていればインストールは成功。

```
Installed:
  docker-ce.x86_64 3:18.09.4-3.el7                                                                                                                                        

Dependency Installed:
  container-selinux.noarch 2:2.74-1.el7                    containerd.io.x86_64 0:1.2.5-3.1.el7                    docker-ce-cli.x86_64 1:18.09.4-3.el7                   

Dependency Updated:
  libselinux.x86_64 0:2.5-14.1.el7                             libselinux-python.x86_64 0:2.5-14.1.el7                 libselinux-utils.x86_64 0:2.5-14.1.el7             
  libsemanage.x86_64 0:2.5-14.el7                              libsemanage-python.x86_64 0:2.5-14.el7                  libsepol.x86_64 0:2.5-10.el7                       
  policycoreutils.x86_64 0:2.5-29.el7_6.1                      policycoreutils-python.x86_64 0:2.5-29.el7_6.1          selinux-policy.noarch 0:3.13.1-229.el7_6.9         
  selinux-policy-targeted.noarch 0:3.13.1-229.el7_6.9          setools-libs.x86_64 0:3.3.8-4.el7                      

Complete!

```

#動作確認

Docker を起動し、バージョンを確認。

```
# systemctl start docker
# docker version
Client:
 Version:           18.09.4
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        d14af54266
 Built:             Wed Mar 27 18:34:51 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.4
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.8
  Git commit:       d14af54
  Built:            Wed Mar 27 18:04:46 2019
  OS/Arch:          linux/amd64
  Experimental:     false
```

別途転送しておいたコンテナイメージを動かしてみる。

```
# docker load < httpd.tar.gz
7b4e562e58dc: Loading layer [==================================================>]  58.44MB/58.44MB
30d0b099e805: Loading layer [==================================================>]   2.56kB/2.56kB
3fc0ec65884c: Loading layer [==================================================>]   34.6MB/34.6MB
04e703344825: Loading layer [==================================================>]  43.59MB/43.59MB
00adc8ff58d3: Loading layer [==================================================>]  3.584kB/3.584kB
Loaded image: httpd:latest

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               latest              dc917399d59d        2 months ago        132MB

# docker run -dti -h httpserver --name httpserver -p 80:80 httpd:latest /bin/bash
5a104396c7bf6edece237af6dd08f90757459b9515a1dfec189c0f8b42946864
# docker exec httpserver apachectl start
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
```

httpd.conf がデフォルトのままなので怒られるけど起動はする。

```
# curl localhost
<html><body><h1>It works!</h1></body></html>
```

無事動いた。あとは rc.local に Docker 起動を設定しておくなど。

#参考
[Get Docker CE for CentOS](https://docs.docker.com/install/linux/docker-ce/centos/#install-from-a-package)
[yum を使用して、パッケージをインストールせずにダウンロードだけ行う](https://access.redhat.com/ja/solutions/395763)
[RPMを個別にダウンロードし、yumのローカルリポジトリを構築する](https://qiita.com/Sa2Knight/items/bec1c24d78719c01a705)