はじめに
あまり需要のなさそうな情報だけど、もしかしたら開発環境がネットから徹底的に隔離されたSI開発現場などで同じことを考えてる人がいるかも……との思いから共有。作業概要は以下のとおり:
- ネットに繋がった CentOS7 で Docker CE のインストールに必要な全 rpm をダウンロードする
- ダウンロードした rpm 群からリポジトリを作成する
- リポジトリをインストール先環境へ転送し、ローカルインストールを行う
作業環境
-
ダウンロード用環境
- CentOS 7.5
- インターネット接続有り
-
インストール先環境
- CentOS 7.5
- Docker CE 18.09
- 開発用のクローズドLANのみに接続
yumdownloader を使って rpm をダウンロード
インターネットに接続されたダウンロード用環境(今回は Vagrant で CentOS 7.5 環境を作成)にてyumdownloader
を使用して依存関係含めたすべての rpm を入手する。
# 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 がダウンロードされている。
# 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 でインストール。
# 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
というリポジトリ設定もここでつくっておく。
[dockerrpm]
name=dockerrpm
baseurl=file:///work/dockerrpm
gpgcheck=0
インストール先環境へ転送するために tar.gz にまとめておく。
# cd /
# tar -zcvf dockerrpm.tar.gz work/dockerrpm
インストール先環境へインストール
作成した tar.gz ファイルをインストール先環境へ転送。クローズドな開発環境だとファイルサイズやら持ち込む経路やら媒体やら申請やら何やらでここが地味に高いハードルになることがままあるけどそこはなんとかがんばって……。
無事 tar.gz ファイルをインストール先環境に転送できたら展開する。
# 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
yum を使用して、パッケージをインストールせずにダウンロードだけ行う
RPMを個別にダウンロードし、yumのローカルリポジトリを構築する