企業で仮想化基盤を構築して、毎時数キロワットの電力を消費させながら、ゴリゴリ仕事をするというスタイルが、今では時代遅れになりつつあります。
それに代わって注目を浴びてているDockerは、時を経て洗練されてきました。
Dockerは、小さなオフィスや個人事業用の小道具を、消費電力の小さい非力なPCで作ることができます。
Kubernetesは、大規模なウェブシステムを構築するような場面で威力を発揮しますが、小さく使う場合はオーバーヘッドが大きすぎます。
swarmやdocker-composeも必要ありません。
ハードウエア・リソースに対するパフォーマンスは最大限に発揮させて、便利な小道具を作る方法を解説します。
Dockerインストールの準備
ハードウエア
使うのは一昔前の「Intel Celeron PC」です。
「Raspberry pi」でもいいのですが、データ保存用にRAIDを組んだりする場合、かえってコストがかかってしまします。
なので普通のx86PCを使います。
nftables -> iptables
最新のDebianでは「iptables」の代わりに「nftables」が使われています。
Dockerは「nftables」に対応していないので、安定稼働させるために、まずは「nftables」から「iptables」に設定変更します。
現状を確認してみます。
update-alternatives --display iptables
結果が以下のように出力されました。
iptables - auto mode
link best version is /usr/sbin/iptables-nft
link currently points to /usr/sbin/iptables-nft
link iptables is /usr/sbin/iptables
slave iptables-restore is /usr/sbin/iptables-restore
slave iptables-save is /usr/sbin/iptables-save
/usr/sbin/iptables-legacy - priority 10
slave iptables-restore: /usr/sbin/iptables-legacy-restore
slave iptables-save: /usr/sbin/iptables-legacy-save
/usr/sbin/iptables-nft - priority 20
slave iptables-restore: /usr/sbin/iptables-nft-restore
slave iptables-save: /usr/sbin/iptables-nft-save
iptablesが/usr/sbin/iptables-nft(nftables)にリンクされていることがわかります。
これを、「iptables」に変更します。
まず、必要なパッケージをインストールします。
apt install -y iptables arptables ebtables
「iptables」を使うようにシステムを切り替えます。
update-alternatives --set iptables /usr/sbin/iptables-legacy
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
update-alternatives --set arptables /usr/sbin/arptables-legacy
update-alternatives --set ebtables /usr/sbin/ebtables-legacy
設定を反映するために「再起動」します。
PCが起動したら、設定が反映されているか確認してみます。
update-alternatives --display iptables
出力です。
iptables - manual mode
link best version is /usr/sbin/iptables-nft
link currently points to /usr/sbin/iptables-legacy
link iptables is /usr/sbin/iptables
slave iptables-restore is /usr/sbin/iptables-restore
slave iptables-save is /usr/sbin/iptables-save
/usr/sbin/iptables-legacy - priority 10
slave iptables-restore: /usr/sbin/iptables-legacy-restore
slave iptables-save: /usr/sbin/iptables-legacy-save
/usr/sbin/iptables-nft - priority 20
slave iptables-restore: /usr/sbin/iptables-nft-restore
slave iptables-save: /usr/sbin/iptables-nft-save
iptablesのリンクが/usr/sbin/iptables-legacyに替わったことがわかります。
ストレージの準備
コンテナ イメージを保存する場所と、永続的にデータを保存しておくボリューム用の場所を準備しておきます。
コンテナ イメージは、初期状態で「/var/lib/docker」ディレクトリに保存されますが、ここでは「専用のディレクトリ」を用意します。
コンテナはバックアップも可能ですし、消失しても作り直すことができます。
それほど大事にする必要はありませんが、しばらくたって作り方を思い出すのは大変です。
冗長化されたディスクに配置したほうがよいでしょう。
また、読み書きのスピードも要求されることを念頭に置いておく必要があります。
一方、コンテナが扱う「永続的データ」はスピードより容量と安全性を重視しなければなりません。
RAIDなどの冗長性のあるストレージ上にボリュームを確保します。
Dockerホストは、次のような構成にします。
用途 | マウントポイント | ストレージタイプ | 冗長機構 |
---|---|---|---|
コンテナ イメージ用 | /i | SSD | RAID1 |
ボリューム用 | /v | HDD | RAID1 |
Dockerをインストールする
ここで使うLinuxディストリビューションは「Debian」です。
次のDockerのドキュメントを参考にインストールしていきます。
ここでは、マニュアルと異なって、sudoを使わずにrootユーザーでインストールを行います。
必要なパッケージをインストールします。
apt install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
リポジトリの証明書をインストールします。
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
リポジトリを追加します。
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
パッケージデータのアップデート。
apt update
Dockerをインストールします。
apt install docker-ce docker-ce-cli containerd.io
Dockerを停止します。
systemctl stop docker.service containerd.service
コンテナ イメージを「/i」ディレクトリに設定します。
cat <<'EOF' > /etc/docker/daemon.json
{
"graph": "/i",
"storage-driver": "overlay2"
}
EOF
HTTPプロキシを使ってDockerのリポジトリにアクセスする場合はプロキシの設定も必要です。
mkdir /etc/systemd/system/docker.service.d
cat <<'EOF' > /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://user:pwd@proxy.domain.com:3128/" "HTTPS_PROXY=http://user:pwd@proxy.domain.com:3128/" "NO_PROXY=localhost,127.0.0.1,docker-registry.domain.com"
EOF
必要な設定が終わったら、dockerを起動します。
systemctl daemon-reload
systemctl start docker
dockerとcontainerdのプロセスが起動しているはずです。
ps -A |grep 'docker\|contain'
2433 ? 00:00:00 containerd
2538 ? 00:00:00 dockerd
コンテナ イメージの格納先である「/i」ディレクトリにDockerが使うファイルが展開されます。
ls /i/
builder buildkit containers image network overlay2 plugins runtimes swarm tmp trust volumes
以上でDockerのインストールは完了です。
Docker管理ユーザーを作る
Dockerのインストールは、root権限で行いましたが、Dockerの管理は、別のユーザーで行います。
ここではDocker管理者を「fumi」にします。
ユーザー「fumi」を追加します。
adduser fumi
パスワードなど必要事項を設定します。
「docker」グループに入れます。
adduser fumi docker
「fumi」でホストにログインすれば、Dockerを操作することができます。
コンテナやネットワークの作成はこの「fumi」ユーザーで行います。
ネットワークを設定する
コンテナを「グローバル ネットワーク」にさらす場合は、セキュリティーなども考慮する必要があります。
一方、「ローカル ネットワーク」でNATルーターの背後に置く場合には、NATでコンテナを保護する必要はありません。
Docker デーモンのデフォルトである「docker0 ネットワーク」を使ってスタティックNATすると、リソースを浪費してしまします。
ローカルネットワークでは、「ipvlan」ドライバーのL2モードを使います。
L2なので、接続するネットワークに合わせてipを設定します。
ここでは、「ブロードバンド ルーター」配下の「192.168.11.0/24」ネットワーク を使います。
ネットワーク構成の詳細は次の通りです。
ネットワーク | 192.168.11.0 |
ネットマスク | 255.255.255.0 |
ブロードバンドルーターのアドレス(ゲートウェイ) | 192.168.11.1 |
ブロードバンドルーターが管理するDHCPのレンジ | 192.168.11.101 – 192.168.11.254 |
このネットワークに合わせて、Dockerのipvlanネットワークを作ります。
ipvlanはLinuxのカーネルモジュールです。
事前にmodprobeする必要はありません。
このネットワークを使うコンテナが作成されると、自動的にモジュールが読み込まれます。
Dockerのネットワークを作ります。
「タブ」を使わないでください。
docker network create \
--driver=ipvlan \
--subnet=192.168.11.0/24 \
--ip-range=192.168.11.64/28 \
--gateway=192.168.11.1 \
--opt="parent=enp2s0" \
--opt="ipvlan_mode=l2" \
private-net
docker network create | コンテナが使うネットワークを作ります。 |
–driver=ipvlan | ipvlan ドライバーを使います。 |
–subnet=192.168.11.0/24 | サブネットアドレスは「192.168.11.0/24」です。 |
–ip-range=192.168.11.64/28 | コンテナのipアドレスを指定しなかった場合に自動的に設定されるアドレス範囲です。 ブロードバンドルーターのDHCPの範囲を避けて設定してみました。 192.168.11.64 – 192.168.11.79 です。 |
–gateway=192.168.11.1 | ゲートウェイ(ブロードバンドルーター)のアドレスです。 |
–opt=”parent=enp2s0″ | 親となる「ネットワーク デバイス」です。 物理デバイスの他、ブリッジやVLANも指定できます。 |
–opt=”ipvlan_mode=l2″ | L2モードで使います。 |
private-net | 作成するネットワークの名前です。 |
「ipvlan」ドライバーのメリットは、KVMなどの仮想基盤で使う「ブリッジ ネットワーク」から移行しやすいことです。
「–net=host」で、Dockerホストのネットワークをアドレスをそのまま使うこともできますが、この場合「同じipポート」を使う複数のコンテナを作ることができません。
ただし、このネットワークを使って同じホストのコンテナ同士が通信することはできません。
コンテナを作ってみる
「Docker Hub」には機能ごとのコンテナがありますが、慣れたOSを使うことで、Docker導入の敷居が低くなります。
私はdebianユーザーなので、「debianコンテナ」を作ってみます。
リポジトリにイメージがあるか、検索してみます。
docker search debian
次のような検索結果が得られます。
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating sys… 12420 [OK]
debian Debian is a Linux distribution that's compos… 3893 [OK]
arm32v7/debian Debian is a Linux distribution that's compos… 72
itscaro/debian-ssh debian:jessie 28 [OK]
arm64v8/debian Debian is a Linux distribution that's compos… 26
samueldebruyn/debian-git a minimal docker container with debian and g… 22 [OK]
i386/debian Debian is a Linux distribution that's compos… 14
multiarch/debian-debootstrap multiarch ports of debian-debootstrap 13
eboraas/debian Debian base images, for all currently-availa… 8 [OK]
amd64/debian Debian is a Linux distribution that's compos… 6
vergissberlin/debian-development Docker debian image to use for development, … 6 [OK]
...
「オフィシャルのイメージ」があることがわかりました。
debianイメージを使って、コンテナを作ってみます。
docker run \
--name=deb \
--hostname=deb \
--network=private-net \
--interactive \
--tty \
debian
コマンドの意味は以下の通りです。
docker run | コンテナを作ります。 |
–name=deb | コンテナの名前は「deb」です。 |
–hostname=deb | コンテナの「hostname」に「deb」を設定します。 |
–network=private-net | ipvlanドライバーを使った「private-net」を使います。 |
–interactive –tty | インタラクティブにコンテナのttyコンソールを操作します。 |
debian | debianイメージを使ってコンテナを作ります。 |
debianイメージをダウンロードして、コンテナが作成され、コンテナのコンソールが起動します。
既にダウンロード済みのイメージがある場合は、ローカルのイメージを使ってコンテナが作成されます。
ipアドレスを指定していないので、private-net で設定したipレンジから自動的に割り当てられます。
root@deb:/#
何も入っていないdebianコンテナができました。
コンテナ内のプロセスを確認する
ps コマンドで、何かプロセスが上がっているか、確認します。
ところが、ps コマンドも入っていません。
root@deb:/# ps -A
bash: ps: command not found
apt は使えるので、インストールします。
root@deb:/# apt update
root@deb:/# apt install procps
プロセスを確認します。
root@deb:/# ps -A
PID TTY TIME CMD
1 pts/0 00:00:00 bash
346 pts/0 00:00:00 ps
tty のシェル「bash」のみ起動しています。
コンテナ作成時のオプションに「–interactive –tty」を指定したので、このシェルが起動しています。
apacheをインストールしてみる
つづいて apache をインストールししてみます。
root@deb:/# apt install apache2
インストールしても、apache ウェブサーバーが自動的に起動することはありません。
root@deb:/# ps -A
PID TTY TIME CMD
1 pts/0 00:00:00 bash
3528 pts/0 00:00:00 ps
手動で起動します。
systemdは入っていないので、古風に起動します。
root@deb:/# /etc/init.d/apache2 start
起動が確認できます。
root@deb:/# ps -A
PID TTY TIME CMD
1 pts/0 00:00:00 bash
3552 ? 00:00:00 apache2
3555 ? 00:00:00 apache2
3556 ? 00:00:00 apache2
3630 pts/0 00:00:00 ps
コンテナはルートプロセスが終了すると、「停止」する
コンテナは「ルートプロセスが終了すると停止」します。
以下のように、「exit」で「プロセスID 1」のbashを抜けてしまうと、debianコンテナは停止します。
先ほど起動した apacheウェブサーバーも停止します。
root@deb:/# exit
シェル(bash)を終了することなく、コンテナを抜ける方法は、以下の手順です。
「Control + p」 次に 「Control + q」
これで、コンテナのコンソールから離れることができます。
再度接続するのは、次の手順です。
docker attach deb
再度抜けるには、「Control + p 次に Control + q」です。
ところが、ウェブサーバーなど、何か「サービス」を提供するコンテナが、不用意に停止してしまうと困ります。
exit しても「停止しない」コンテナを作っておくほうが便利です。
exit しても停止しないプロトタイプ コンテナを作る
「一度起動すると、停止しないコンテナ」の「ひな型」をビルドします。
目的に応じてコンテナをビルドしたり、Docker-composeを使ったりしません。
一度作ったら「何年も使う少数」のコンテナにそんな手間をかけません。
ビルドの準備
ビルド用のディレクトリーを作り、Docker管理者に権限付与します。
sudo mkdir -p /v/b/debian
sudo chown fumi /v/b/debian
ビルドディレクトリに移動します。
cd /v/b/debian
「Dockerfile」を作ります。
cat <<'EOF' > Dockerfile
FROM debian
#RUN echo 'Acquire::http::Proxy "http://user:pwd@proxy.domain.com:3128/";' > /etc/apt/apt.conf
RUN apt update
RUN apt -y install locales
RUN apt -y install vim-tiny
RUN apt -y install procps
RUN apt -y upgrade
RUN apt -y autoremove
RUN apt clean
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
RUN localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
COPY startup.sh /startup.sh
RUN chmod 744 /startup.sh
ENTRYPOINT ["/startup.sh"]
EOF
エディタで上記の1行目と最後の行を除いたDockerfileを作ってもOKです。
「タブ」を使ってはいけません。
Dockerfileはコンテナをビルドする設計図です。
既存のイメージを使って、新しいイメージを作る手順を記述します。
Dockerfileの各行は命令で始まります。
命令の意味は以下の通りです。
FROM | もとになるイメージを指定します。 |
RUN | コンテナ作成時に実行するコマンドを設定します。 |
ENV | コンテナに設定す環境変数を指定します。 |
COPY | ホストのファイルをコンテナイメージ内にコピーします。 |
ENTRYPOINT | コンテナ起動時に実行するスクリプトを指定します。 |
上記のDockerファイルには、次のような意味があります。
FROM debian | debianイメージを使てコンテナを作ります。 |
#RUN echo ‘Acquire::http::Proxy “http://user… | プロキシの設定です。 プロキシを使う場合は設定します。 |
RUN apt update | リポジトリ情報をアップデートします。 |
RUN apt -y install locales | locale パッケージをインストールします。 |
RUN apt -y install vim-tiny | vimをインストールします。 |
RUN apt -y install procps | ps コマンドをインストールします。 |
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime | タイムゾーンを東京にします。 |
RUN localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8 | ロケールをja_JP.UTF-8にします。 |
ENV LANG ja_JP.UTF-8 | 環境変数 LANG=ja_JP.UTF-8 |
ENV LANGUAGE ja_JP:ja | 環境変数 LANGUAGE=ja_JP:ja |
COPY startup.sh /startup.sh | startup.sh をコンテナのルートにコピーします。 |
RUN chmod 744 /startup.sh | /startup.sh に実行権限を付与します。 |
ENTRYPOINT [“/startup.sh”] | コンテナ起動後に実行するスクリプトを設定します。 |
つづいて、「エントリーポイント」のスクリプト ファイルを作ります。
cat <<'EOF' > startup.sh
#!/usr/bin/env bash
tail -f /dev/null
EOF
エディタで上記の1行目と最後の行を除いたstartup.shを作ってもOKです。
「エントリーポイント」は「コンテナの起動時に実行される」ファイルです。
シェルで「tail -f /dev/null」を実行します。
このコマンドで「/dev/null」ファイルを監視し続けるので、exitしてもシェルが終了しません。
ルートプロセスの「bash」が終了しないので、コンテナが「停止」しないのです。
オリジナル イメージのビルド
「オフィシャルのdebianイメージ」をアップデートして、停止しない「オリジナルのdebianイメージ」をビルドします。
docker build -t debian.proto .
最後の「.」を忘れないでください。
カレント ディレクトリーにあるDockerfileを使ってビルドするという意味です。
ビルド過程を表示する文字がコンソールを流れて、しばらくするとビルドが終わります。
イメージができているか確認します。
次のコマンドでローカルにあるイメージを一覧表示できます。
docker images
実際の出力は次の通りです。
オフィシャルのdebianイメージに加えて、先ほどビルドしたdebian.protoイメージも確認できます。
fumi@y3:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
debian.proto latest ef3e9f9bb9a0 6 seconds ago 161MB
debian latest 4a7a1f401734 5 weeks ago 114MB
「停止しないdebianイメージ」が完成しました。
このイメージがあれば、必要な時に、即座にdebianインストール済みのサーバーを用意することができます。
DNSサーバーを作ってみる
DNSのログをトレースすれば、接続元のipアドレスのインターネットアクセス履歴がわかります。
信頼できない外部のDNSを使うと、こちらの趣味趣向が解析されてしまいます。
なので、自前で建てるDNSは、情報漏洩対策に有効です。
今作ったdebian.protoイメージで、DNSサーバーを作ります。
docker run \
--name=dns0 \
--hostname=dns0 \
--network=private-net \
--ip=192.168.11.2 \
--detach=true \
debian.proto
即座にコンテナが完成します。
起動しているのかを確認します。
確認コマンドは次の通りです。
docker ps
出力です。
fumi@y3:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4d8392d46f6f debian.proto "/startup.sh" 7 seconds ago Up 7 seconds dns0
停止しているものも併せて確認する場合は次のコマンドです。
docker ps -a
出力には停止中のdebコンテナも表示されています。
fumi@y3:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4d8392d46f6f debian.proto "/startup.sh" 12 minutes ago Up 12 minutes dns0
2905af084295 debian "bash" 43 hours ago Exited (0) 2 hours ago deb
「STATUS」に起動中のものは「Up」、停止中のものは「Exited」の表示があります。
前回作成したdebコンテナとは違って、コンテナ作成後に、コンテナのコンソールに「アタッチ」されることはありませんでした。
コンテナ作成コマンドの意味は次の通りです。
docker run | コンテナを作ります。 |
–name=dns0 | コンテナの名前はdns0です。 |
–hostname=dns0 | コンテナのhostnameにdns0を設定します。 |
–network=private-net | ネットワークはprivate-netにつなぎます。 |
–ip=192.168.11.2 | ipアドレスは192.168.11.2に設定します。 |
–detach=true | デタッチ モードで起動します。 |
debian.proto | debian.protoイメージを使います。 |
今回は「–detach=true」オプションをつけて、デタッチ モードでコンテナを起動しています。
前回は「–interactive –tty」オプションでコンテナを作成して、コンソールにアタッチしました。
debian.protoはデタッチしても停止しないコンテナです。
だからデタッチ モードが使えます。
もし、オフィシャルのdebianイメージを「–detach=true」オプションで作成すると、一瞬で停止してしまいます。
有用なコンテナにはなりません。
コンテナを操作する
デタッチモードのコンテナを操作してみます。
コンテナで下記のコマンドを実行してみます。
ls /
コンテナdns0でこれを実装するのは、下記になります。
docker exec -it dns0 ls /
「-it」は「–interactive –tty」のショートオプションで、同じ意味です。
出力は以下になります。
fumi@y3:~$ docker exec -it dns0 ls /
bin dev home lib64 mnt proc run srv sys usr
boot etc lib media opt root sbin startup.sh tmp var
また、/startup.sh の内容を出力するのは次になります。
fumi@y3:~$ docker exec -it dns0 cat /startup.sh
#!/usr/bin/env bash
tail -f /dev/null
「docker exec -it <コンテナ名> <コンテナ内で実行するコマンド>」です。
デタッチ起動されたコンテナのコンソールに継続的に接続する場合は シェル を起動します。
fumi@y3:~$ docker exec -it dns0 bash
root@dns0:/#
サーバーのターミナルに接続するのと同じように、コンテナを操作することができます。
コンテナのコンソールから出る場合は、シェルを抜ければいいので、「exit」でOKです。
root@dns0:/# exit
exit
fumi@y3:~$
デタッチ モードのコンテナに「docker attach <コンテナ名>」してしまうと、動けなくなるので注意が必要です。
もし、動けなくなったら、固まったターミナルを閉じればOKです。
ターミナルを閉じたくなければ、別途ターミナルを起動して、コンテナを再起動すれば抜けられます。
コンテナにパッケージをインストールする
dns0コンテナにbindをインストールします。
fumi@y3:~$ docker exec -it dns0 bash
dns0コンテナのプロンプトが現れます。
root@dns0:/#
bindをインストールします。
root@dns0:/# apt -y install bind9
プロセスを確認します。
root@dns0:/# ps -A
PID TTY TIME CMD
1 ? 00:00:00 bash
7 ? 00:00:00 tail
47 pts/0 00:00:00 bash
666 pts/0 00:00:00 ps
コンテナでは、パッケージをインストールしても、自動でプロセスが起動しません。
root@dns0:/# /etc/init.d/bind9 start
これでbindが起動します。
※現時点ではDebian10(buster)のイメージを使っていますが、Debian11(Bullseye)の場合は「bind9」ではなく「named」になります。
root@dns0:/# /etc/init.d/named start
コンテナ起動時に、自動でbindを起動するようにエントリーポイントを編集します。
debian.protoイメージをビルドするときに、エントリーポイントを、startup.shに設定しました。
startup.shファイルに「/etc/init.d/bind9 start」を追加します。
root@dns0:/# sed -i '1a /etc/init.d/bind9 start' /startup.sh
ビルド時にvimをインストールしています。
vi で編集してもOKです。
root@dns0:/# vi /startup.sh
編集後は、以下になります。
root@dns0:/# cat /startup.sh
#!/usr/bin/env bash
/etc/init.d/bind9 start
tail -f /dev/null
これで、コンテナ起動時にbindが自動起動するようになりました。
コンテナの起動・停止・再起動
最後にデタッチ モードのコンテナを、起動・停止・再起動する方法を下記に示します。
起動 | docker start <コンテナ名> | |
停止 | docker stop <コンテナ名> | |
再起動 | docker restart <コンテナ名> |
上記で作成したDNSコンテナを「再起動」して、bindが自動起動しているか確認してみましょう。
再起動します。
fumi@y3:~$ docker restart dns0
コンソールに「ps -A」コマンドを流し込みます。
fumi@y3:~$ docker exec -it dns0 ps -A
PID TTY TIME CMD
1 ? 00:00:00 bash
15 ? 00:00:00 named
20 ? 00:00:00 tail
30 pts/0 00:00:00 ps
bindのプロセス「maned」の起動が確認できました。
Windowsからコンテナのサービスを確認する
Windows10 からコンテナのDNSサービスを確認します。
cmd(コマンドプロンプト)を起動して、「nslookup」を使います。
C:\Users\yx>nslookup
既定のサーバー: UnKnown
Address: 8.8.8.8
> server 192.168.11.2 <------------ DNSコンテナのipアドレス
のipアドレスを設定します。
既定のサーバー: [192.168.11.2]
Address: 192.168.11.2
> www.google.com <------------ www.google.com を引いてみる。
サーバー: [192.168.11.2]
Address: 192.168.11.2
権限のない回答:
名前: www.google.com
Addresses: 2404:6800:4004:822::2004
142.250.196.132
> www.yahoo.com <------------ www.yahoo.com を引いてみる。
サーバー: [192.168.11.2]
Address: 192.168.11.2
権限のない回答:
名前: new-fp-shed.wg1.b.yahoo.com
Addresses: 2406:2000:e4:1605::9001
2406:2000:e4:1605::9000
202.165.107.50
202.165.107.49
Aliases: www.yahoo.com
> exit
C:\Users\yx>
正常に解決できていることが確認できました。
まとめ
DockerはKubernetesなどを使って、大規模システムで複雑なシステムを構築する方面で、注目を浴びていますが、中小の企業で小さく使うことにもメリットを発揮します。
ハードウエアの性能向上と省電力化が進む中で、オンプレミスの小さなサーバーをおいておけば、コストメリットのある小道具を作ることができます。
一度作れば、5年~10年使えます。
ナットルーターの背後に置くのであれば、アップデートをそれほど気にする必要がありません。
Dockerはハードウエアのリソースを最大限に発揮できる仮想化方法のひとつです。