ローカル環境にプールされた Docker イメージからコンテナを起動するためのホストサーバを構築します。
※ここでは実際に設定、動作したものを掲載していますが、内容について保証するものではありません。流用される場合は各自の責任でお願いします。
構築する環境の要件等については 「ローカル環境にプールしたDockerイメージからコンテナを起動する仕組みを構築」 をご参照ください。
全体の構築作業は以下のとおりですが、今回は「② ローカルプールからDockerイメージをダウンロードし、起動するためのサーバを構築」を実施します。
① ローカル環境にDockerイメージをプールするためのサーバを構築
② ローカルプールからDockerイメージをダウンロードし、起動するためのサーバを構築
今回の構築範囲は下図のとおりです。

セキュリティ機能の無効化
検証環境ではセキュリティ機能の影響を気にしたくないため、いくつかの機能を無効化しておきます。(実施する場合は各自の責任でお願いします)
SELinux のアクセス制御無効
[root@lab ~]# cp /etc/selinux/config /tmp
[root@lab ~]# vi /etc/selinux/config
[root@lab ~]# diff /tmp/config /etc/selinux/config
7c7
< SELINUX=enforcing
---
> SELINUX=permissive
Firewall 停止
[root@lab ~]# systemctl stop firewalld
[root@lab ~]# systemctl disable firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
ライブラリの最新化と必要なツールのインストール
パッケージ更新
OS にインストールされているパッケージを最新化しておきます。
[root@lab ~]# dnf update -y
…
アップグレード済み:
…
xz-5.2.4-4.el8_6.x86_64 xz-libs-5.2.4-4.el8_6.x86_64 yum-4.7.0-20.el8.noarch
zlib-1.2.11-26.el8.x86_64
インストール済み:
…
python3-systemd-234-8.el8.x86_64 python3-unbound-1.16.2-5.el8_9.6.x86_64 unbound-libs-1.16.2-5.el8_9.6.x86_64
xkeyboard-config-2.28-1.el8.noarch
完了しました!
OS を再起動します。
[root@lab ~]# systemctl reboot
EPEL リポジトリインストール
拡張ツール等、EPEL(Extra Packages for Enterprise Linux)からのインストールに備えて、EPEL のリポジトリをインストールしておきます。
[root@lab ~]# dnf install epel-release -y
…
インストール済み:
epel-release-8-18.el8.noarch
完了しました!
Docker インストール
Docker のリポジトリをインストールするためのツールをインストールします。
[root@lab ~]# dnf install yum-utils -y
…
インストール済み:
yum-utils-4.0.21-25.el8.noarch
完了しました!
Docker のリポジトリをインストールします。
[root@lab ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
repo の追加: https://download.docker.com/linux/centos/docker-ce.repo
Docker をインストールします。
[root@lab ~]# dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
…
インストール済み:
container-selinux-2:2.229.0-2.module+el8.10.0+1843+6892ab28.noarch containerd.io-1.6.32-3.1.el8.x86_64
docker-buildx-plugin-0.14.0-1.el8.x86_64 docker-ce-3:26.1.3-1.el8.x86_64
docker-ce-cli-1:26.1.3-1.el8.x86_64 docker-ce-rootless-extras-26.1.3-1.el8.x86_64
docker-compose-plugin-2.27.0-1.el8.x86_64 fuse-common-3.3.0-19.el8.x86_64
fuse-overlayfs-1.13-1.module+el8.10.0+1843+6892ab28.x86_64 fuse3-3.3.0-19.el8.x86_64
fuse3-libs-3.3.0-19.el8.x86_64 libcgroup-0.41-19.el8.x86_64
libslirp-4.4.0-2.module+el8.10.0+1843+6892ab28.x86_64 slirp4netns-1.2.3-1.module+el8.10.0+1843+6892ab28.x86_64
tar-2:1.30-9.el8.x86_64
完了しました!
Docker の起動状況を確認します。(→ Docker の自動起動は disabled、現在は inactive(停止中))
[root@lab ~]# systemctl is-enabled docker; systemctl is-active docker
disabled
inactive
Docker の自動起動を enable とし、即時起動します。
[root@lab ~]# systemctl enable docker --now
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
Docker が起動していることを確認します。
[root@lab ~]# 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 Thu 2024-09-01 16:01:37 JST; 9s ago
Docs: https://docs.docker.com
Main PID: 61732 (dockerd)
Tasks: 13
Memory: 36.1M
CGroup: /system.slice/docker.service
└61732 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
9月 01 16:01:36 lab systemd[1]: Starting Docker Application Container Engine...
9月 01 16:01:36 lab dockerd[61732]: time="2024-09-01T16:01:36.461780591+09:00" level=info msg="Starting up"
9月 01 16:01:36 lab dockerd[61732]: time="2024-09-01T16:01:36.525596550+09:00" level=info msg="Loading containers: start."
9月 01 16:01:37 lab dockerd[61732]: time="2024-09-01T16:01:37.038415208+09:00" level=info msg="Loading containers: done."
9月 01 16:01:37 lab dockerd[61732]: time="2024-09-01T16:01:37.063106129+09:00" level=info msg="Docker daemon" commit=8e96db1 containerd-snapshotter=false storage>
9月 01 16:01:37 lab dockerd[61732]: time="2024-09-01T16:01:37.063486623+09:00" level=info msg="Daemon has completed initialization"
9月 01 16:01:37 lab dockerd[61732]: time="2024-09-01T16:01:37.119851683+09:00" level=info msg="API listen on /run/docker.sock"
9月 01 16:01:37 lab systemd[1]: Started Docker Application Container Engine.
リモート(プール)からイメージをダウンロードするために、認証回避のオプション(–insecure-registry=192.168.15.188:5000)を追加します。(192.168.15.188 はプールを管理しているレジストリサーバのアドレスです。)
[root@lab ~]# cp /usr/lib/systemd/system/docker.service /tmp
[root@lab ~]# vi /usr/lib/systemd/system/docker.service
[root@lab ~]# diff /tmp/docker.service /usr/lib/systemd/system/docker.service
13c13
< ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
---
> ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry=192.168.15.188:5000
docker を再起動します。
[root@lab ~]# systemctl daemon-reload
[root@lab ~]# systemctl restart docker
[root@lab ~]#
レジストリサーバからイメージをダウンロードしコンテナを起動
レジストリサーバのプールから登録済みのイメージをダウンロードしコンテナを起動します。
レジストリサーバには以下のイメージがプールされている想定です。
名前 | イメージ | インストール済みのアプリ | 役割 |
---|---|---|---|
r8bind | localhost:5000/r8stub | BIND | DNS Server |
r8stub | localhost:5000/r8bind | dnsperf、kdig 等 | Client |
以降の手順 (*1) では /home/docker をカレントディレクトリとして作業を行っています。(*2)
*1 ここでは Docker の学習を目的としているわけではないため、仕様の細かい説明は行わない予定です。インターネット上に詳しい情報があると思いますのでそちらをご参照ください。
*2 docker アカウントを作成しているわけではありません。単に /home の下に docker ディレクトリを作成しているだけです。
docker compose コマンドで r8bind と r8stub のコンテナを起動します。(*3)
*3 r8bind と r8stub のイメージがローカルになければ、コンテナ起動前にレジストリサーバからダウンロードされます。
[root@lab docker]# docker compose -f ./compose_bind.yml up -d
WARN[0000] /home/docker/compose_network.yml: `version` is obsolete
WARN[0000] /home/docker/compose_bind.yml: `version` is obsolete
[+] Running 36/1
? r8bind Pulled 36.9s
[+] Running 2/2
? Network net01 Created 0.2s
? Container r8bind Started 1.7s
[root@lab docker]# docker compose -f ./compose_mob.yml up -d
WARN[0000] /home/docker/compose_network.yml: `version` is obsolete
WARN[0000] /home/docker/compose_mob.yml: `version` is obsolete
[+] Running 36/1
? r8stub Pulled 44.9s
[+] Running 0/1
? Network net02 Creating 0.2s
[+] Running 2/2d orphan containers ([r8bind]) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove
? Network net02 Created 0.2s
? Container r8stub Started 8.7s
ダウンロードされているイメージを確認します。
[root@lab docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.15.188:5000/r8stub latest 5eb1968e9c85 6 hours ago 2.13GB
192.168.15.188:5000/r8bind latest 1ad1dad765ea 7 hours ago 1.19GB
コンテナの起動状況を確認します。
[root@lab docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6f05c58ebb44 192.168.15.188:5000/r8stub "/sbin/init" 47 seconds ago Up 37 seconds 0.0.0.0:2220->22/tcp, :::2220->22/tcp r8stub
583110b6c47f 192.168.15.188:5000/r8bind "/sbin/init" 2 minutes ago Up 2 minutes 0.0.0.0:2210->22/tcp, :::2210->22/tcp r8bind
コンテナの起動は docker compose コマンドで行いますが、起動するコンテナは -f オプションに指定するファイルに指定されています。本環境では、compose_bind.yml により r8bind(DNS Server)が、compose_mob.yml で r8stub(Client)が起動するように指定しています。
コンテナ起動用に用意したファイルを以下に示します。
ファイル (*4) | 内容 |
---|---|
./compose_bind.yml | r8bind(DNS Server)起動用の定義ファイル |
./compose_mob.yml | r8stub(Client)起動用の定義ファイル |
./compose_network.yml | コンテナが接続する LAN の定義ファイル |
*4 ファイルおよびディレクトリは /home/docker からの相対パスです。
compose_network.yml は docker compose コマンドの -f オプションで指定することはありませんが、compose_bind.yml と compose_mob.yml から include されているため、間接的に読み込まれます。compose_network.yml には、コンテナが接続する LAN(net01:172.18.1.0/24、net02:172.18.2.0/24)が定義されています。
各ファイルの内容について簡単に説明します。(compose_mob.yml の内容は、compose_bind.yml と同等のため説明は割愛させていただきます。)
compose_bind.yml
version: '3' << [1]
services:
r8bind:
image: 192.168.15.188:5000/r8bind <<コンテナ起動元のイメージ
container_name: r8bind <<コンテナ名
hostname: r8bind <<コンテナで起動する OS のホスト名
…
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:ro
- /home/docker/vol/r8bind:/home/docker/files:rw << [2]
…
ports:
- "2204:22" <<ポート指定 [3]
networks:
net01:
ipv4_address: 172.18.1.4 <<コンテナの IPv4 アドレス
ipv6_address: fd00::4 <<コンテナの IPv6 アドレス
priority: 1000
include:
- ./compose_network.yml <<LAN の定義ファイルを include [4]
[1] Docker Compose v2 以降は version: 指定は非推奨らしいです。docker compose コマンド実行時の警告メッセージは無視でかまいませんが、煩わしい場合はこの指定を削除(もしくはコメント化)してください。
[2] コンテナ OS の /home/docker/files を レジストリサーバの /home/docker/vol/r8bind にマウントしています。このディレクトリを介してコンテナ OS とレジストリサーバのデータの受け渡しが可能です。また、このディレクトリにデータを保存することで、コンテナ削除後もデータを残すことが可能です。
[3] ホスト OS とコンテナ OS のポートをつなぐための指定ですが、本設定では SSH ポート(22)を接続しています。外部からホストサーバの 2204 ポートへ接続すると、コンテナ OS の 22 ポートへ SSH 接続されます。
[4] コンテナが接続する LAN が定義されたファイルを include しています。include せずに compose_network.yml の内容をここに直接展開しても問題ありません。
compose_network.yml
version: '3'
networks:
net01:
name: net01 <<ネットワーク名
driver: bridge <<ブリッジネットワークの指定 [1]
enable_ipv6: true <<IPv6 通信の有効化
ipam:
driver: default
config:
- subnet: "172.18.1.0/24" <<サブネットの指定(IPv4)
gateway: "172.18.1.1" <<ゲートウェイの指定(IPv4)
- subnet: "fd00::/64" <<サブネットの指定(IPv6)
gateway: "fd00::1" <<ゲートウェイの指定(IPv6)
net02:
…
[1] 同じブリッジネットワークに接続するコンテナ間では通信が可能です。
コンテナ(r8stub)にログイン後、コマンド(uname -a)を実行し、問題がないことを確認します。
[root@lab docker]# docker exec -it r8stub bash
[root@r8stub ~]# uname -a
Linux r8stub 4.18.0-372.9.1.el8.x86_64 #1 SMP Tue May 10 14:48:47 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
[root@r8stub ~]# ps
PID TTY TIME CMD
135 pts/1 00:00:00 bash
157 pts/1 00:00:00 ps
[root@r8stub ~]# exit
[root@lab docker]#
補足:コンテナへの IP アドレスの追加
コンテナに IP アドレスを追加する例を示します。以下は r8bind コンテナに IPv4 と IPv6 を追加するコマンドです。
docker exec r8bind ip addr add 172.18.1.5/24 dev eth0
docker exec r8bind ip addr add fd00::5/64 dev eth0