この記事では、Rocky Linux でDockerのRPMパッケージを手動インストールする方法と、Dockerイメージファイルを転送する方法について説明します。
1. DockerのRPMパッケージの取得
dnf install コマンドではインターネットから直接 RPM パッケージを取得しようとします。 しかし、今回のようなインターネットと通信できない環境(プライベート環境)では、実行しても失敗してしまいます。 そこで、インターネットと通信可能な環境で RPM パッケージファイルだけダウンロードしておき、それをプライベート環境に持ち込む、という作業を行います。
1.1. インターネット通信可な環境
以下の公式の手順に従って、RPMパッケージをダウンロードしていきます。
まず、dnf コマンドでDockerレポジトリのURLを追加します。 合わせて、後で必要になるDockerのPRMパッケージ検証鍵(GPG公開鍵)もダウンロードしておきます。
$ sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ curl https://download.docker.com/linux/centos/gpg -o docker.gpg.key
次に、Dockerをインストールするために必要なRPMをダウンロードします。
dnf download コマンドに --resolve
オプションをつけることで、依存関係のRPMパッケージも全てダウンロードするようになります。
$ mkdir -p /tmp/docker-rpm
$ cd /tmp/docker-rpm
$ sudo dnf download --resolve docker-ce docker-ce-cli containerd.io docker-compose-plugin
$ ls
container-selinux-2.229.0-1.el9.noarch.rpm
containerd.io-1.6.32-3.1.el9.x86_64.rpm
docker-buildx-plugin-0.14.0-1.el9.x86_64.rpm
docker-ce-26.1.3-1.el9.x86_64.rpm
docker-ce-cli-26.1.3-1.el9.x86_64.rpm
docker-ce-rootless-extras-26.1.3-1.el9.x86_64.rpm
docker-compose-plugin-2.27.0-1.el9.x86_64.rpm
fuse-overlayfs-1.13-1.el9.x86_64.rpm
fuse3-3.10.2-8.el9.x86_64.rpm
fuse3-libs-3.10.2-8.el9.x86_64.rpm
libslirp-4.4.0-7.el9.x86_64.rpm
selinux-policy-38.1.35-2.el9_4.0.2.noarch.rpm
selinux-policy-targeted-38.1.35-2.el9_4.0.2.noarch.rpm
slirp4netns-1.2.3-1.el9.x86_64.rpm
1.2. プライベート環境
先ほどダウンロードした以下のファイルを scp コマンドでインターネット通信不可な環境(プライベート環境)転送します。
- DockerのRPMパッケージのファイル(複数)
- DockerのPRMパッケージ検証鍵
scpで転送したら、RPMパッケージ検証鍵(GPG公開鍵)をインポートして dnf install でRPMパッケージをインストールします。
$ sudo rpm --import docker.gpg.key
$ sudo dnf install *.rpm
インストールが完了したら、dockerデーモンが起動するように設定しておきましょう。 以下のコマンドで systemctl enable + systemctl start ができます。
$ sudo systemctl enable --now docker
2. Dockerイメージの取得
dockerでコンテナを起動するとき、ローカルにDockerイメージが存在しないときはインターネットから取得しようとします。 しかし、今回のプライベート環境では、Dockerイメージの取得に失敗してしまいます。 そこで、まずインターネットに接続できる環境でコンテナを取得し、そのイメージをtarファイル化してプライベート環境に持ち込む、という作業を行います。
2.1. インターネット通信可な環境
Dockerイメージを取得するには、Dockerがインストールされていないとできないので、まずはDockerをインストールします。
~]$ sudo dnf install *.rpm
次に、Dockerのイメージを取得します。今回は Redmine サーバを構築するのに必要なイメージを取得します。 以下のRedmineの公式に書かれているdocker-compose.ymlを書いて、RedmineとMySQLのイメージを取得しておきます。
$ mkdir redmine
$ cd redmine
$ cat <<EOS > docker-compose.yml
version: '3.1'
services:
redmine:
image: redmine
restart: always
ports:
- 3000:3000
environment:
REDMINE_DB_MYSQL: db
REDMINE_DB_PASSWORD: Password
REDMINE_SECRET_KEY_BASE: supersecretkey
db:
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: Password
MYSQL_DATABASE: redmine
EOS
$ docker compose up -d
$ docker compose ps
次に、現在のコンテナの状態を docker commit コマンドでコミットします。
docker commit redmine-redmine-1 redmine
docker commit redmine-db-1 mysql:8.0
コミットしたら、そのDockerイメージの内容を docker save コマンドで tar ファイルに保存します。
docker save -o redmine-redmine.tar redmine
docker save -o redmine-db.tar mysql:8.0
2.2. プライベート環境
先ほど保存したDockerイメージのファイルを scp コマンドでインターネット通信不可な環境(プライベート環境)転送します。 まず、インターネット通信可な環境と同じようにdocker-compose.ymlを書き、全体のコンテナ構成を定義します。
$ cat <<EOS > docker-compose.yml
...(同じ内容のため省略)...
EOS
次に、scp で転送しておいた、tar形式になっているDockerイメージファイルを、docker load コマンドで読み込みます。 正しく読み込めると、docker images コマンドで一覧に redmine と mysql:8.0 が表示されるようになります。
$ docker load -i redmine-redmine.tar
$ docker load -i redmine-db.tar
$ docker images
docker images コマンドの一覧にDockerイメージが存在するときは、Dockerイメージをインターネットから取得する代わりに、ローカルから取得するようになります。 この状態で docker compose up で起動することで、コンテナを起動することができるようになります。
$ docker compose up -d
以上です。