ローカルプールからDockerイメージをダウンロードし、起動するためのサーバを構築

gahag-0079139294 Virtual Infrastructure

ローカル環境にプールされた Docker イメージからコンテナを起動するためのホストサーバを構築します。

※ここでは実際に設定、動作したものを掲載していますが、内容について保証するものではありません。流用される場合は各自の責任でお願いします。

構築する環境の要件等については 「ローカル環境にプールしたDockerイメージからコンテナを起動する仕組みを構築」 をご参照ください。

全体の構築作業は以下のとおりですが、今回は「② ローカルプールからDockerイメージをダウンロードし、起動するためのサーバを構築」を実施します。

ローカル環境にDockerイメージをプールするためのサーバを構築
ローカルプールからDockerイメージをダウンロードし、起動するためのサーバを構築

今回の構築範囲は下図のとおりです。

container-structure-step2

セキュリティ機能の無効化

検証環境ではセキュリティ機能の影響を気にしたくないため、いくつかの機能を無効化しておきます。(実施する場合は各自の責任でお願いします)

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 ~]#

レジストリサーバからイメージをダウンロードしコンテナを起動

レジストリサーバのプールから登録済みのイメージをダウンロードしコンテナを起動します。

レジストリサーバには以下のイメージがプールされている想定です。

名前イメージインストール済みのアプリ役割
r8bindlocalhost:5000/r8stubBINDDNS Server
r8stublocalhost:5000/r8binddnsperf、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.ymlr8bind(DNS Server)起動用の定義ファイル
./compose_mob.ymlr8stub(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
タイトルとURLをコピーしました