小さなオフィスでDockerを便利に使う≪導入編≫

Docker
binary comment

企業で仮想化基盤を構築して、毎時数キロワットの電力を消費させながら、ゴリゴリ仕事をするというスタイルが、今では時代遅れになりつつあります。

それに代わって注目を浴びてている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ホストは、次のような構成にします。

用途マウントポイントストレージタイプ冗長機構
コンテナ イメージ用 /iSSDRAID1
ボリューム用/vHDDRAID1

Dockerをインストールする

ここで使うLinuxディストリビューションは「Debian」です。

次のDockerのドキュメントを参考にインストールしていきます。

Docker Engine インストール(Debian 向け)
Debian 上に Docker Engine をインストールする手順を説明。

ここでは、マニュアルと異なって、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=ipvlanipvlan ドライバーを使います。
–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-netipvlanドライバーを使った「private-net」を使います。
–interactive
–tty
インタラクティブにコンテナのttyコンソールを操作します。
debiandebianイメージを使ってコンテナを作ります。

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 + 」 次に 「Control + q」

これで、コンテナのコンソールから離れることができます。

再度接続するのは、次の手順です。

docker attach deb

再度抜けるには、「Control +  次に Control + 」です。

ところが、ウェブサーバーなど、何か「サービス」を提供するコンテナが、不用意に停止してしまうと困ります。

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 debiandebianイメージを使てコンテナを作ります。
#RUN echo ‘Acquire::http::Proxy “http://user…プロキシの設定です。
プロキシを使う場合は設定します。
RUN apt updateリポジトリ情報をアップデートします。
RUN apt -y install localeslocale パッケージをインストールします。
RUN apt -y install vim-tinyvimをインストールします。
RUN apt -y install procpsps コマンドをインストールします。
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.shstartup.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.2ipアドレスは192.168.11.2に設定します。
–detach=trueデタッチ モードで起動します。
debian.protodebian.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はハードウエアのリソースを最大限に発揮できる仮想化方法のひとつです。

タイトルとURLをコピーしました