ここで作成しているDockerコンテナは、信頼のおけるローカルネットワークのみで動作するホストで運用するものとして構築している。
ホスト上のいずれかのネットワークインターフェイスがインターネットに直接接している場合、このコンテナの運用はセキュリティの観点から非常に危険なので動作させてはいけない。
(インターネットに直に接している場合、Dockerのデフォルトではiptablesを書き換えて外部からのアクセスを許してしまうことになってしまうため厳禁である。)
コンテナの/etc/hostsを編集しても、コンテナのstopアンドstartで、データが初期化されてしまう。
そのため、dnsmasqを活用して、hostsファイルに似た仕組みを構成した。
★
ここで使用するコンテナは、(2)「【Linux CentOS 7】Dockerコンテナ(CentOS7公式)にsshd、rsyslog、Postfix、crondを導入した【Docker-ce 18.06.1.ce】」で構成したものである。
これは、もともと(1)「【Linux CentOS 7】Dockerコンテナへssh接続する方法や、コンテナのイメージ化、削除、起動方法などについて【Docker-ce 18.06.1.ce】」をベースにしたものである。
もし、rsyslog、Postfix、crondなどが不要であれば、(1)のコンテナから作業を継続しても良い。
いずれも下記のように、--privileged を与えて起動する。
■設定を行うコンテナの起動
○Dockerホストにおいてこのコンテナを起動させた。
(インターネットに直に接している場合、Dockerのデフォルトではiptablesを書き換えて外部からのアクセスを許してしまうことになってしまうため厳禁である。)
# docker run --privileged -d -p 222:22 --name centos7-ssh centos:centos7 /sbin/init
○そして、コンテナにSSH接続を行った。
192.168.100.3は、Dockerホストである。
$ ssh -p 222 root@192.168.100.3
[root@923d1942dcbb ~]#
以下は、コンテナ内での作業となる。
■dnsmasqとテストツールのインストール
○dnsmasqのインストール
[root@923d1942dcbb ~]# yum install dnsmasq
Installed:
dnsmasq.x86_64 0:2.76-5.el7
Complete!
○有効化
[root@923d1942dcbb ~]# systemctl enable dnsmasq
Created symlink from /etc/systemd/system/multi-user.target.wants/dnsmasq.service to /usr/lib/systemd/system/dnsmasq.service.○起動
[root@923d1942dcbb ~]# systemctl start dnsmasq
○状態の確認
[root@923d1942dcbb ~]# systemctl status dnsmasq
● dnsmasq.service - DNS caching server.
Loaded: loaded (/usr/lib/systemd/system/dnsmasq.service; enabled; vendor preset: disabled)
Active: active (running) since Sun 2018-11-18 21:32:42 UTC; 6s ago
Main PID: 876 (dnsmasq)
CGroup: /docker/923d1942dcbb471c99fe1295b36836368fbccddfae4eb6c2ac7979cdcc5ff123/system.slice/dnsmasq.service
└─876 /usr/sbin/dnsmasq -k
‣ 876 /usr/sbin/dnsmasq -k
Nov 18 21:32:42 923d1942dcbb systemd[1]: Started DNS caching server..
Nov 18 21:32:42 923d1942dcbb systemd[1]: Starting DNS caching server....
Nov 18 21:32:42 923d1942dcbb dnsmasq[876]: started, version 2.76 cachesize 150
Nov 18 21:32:42 923d1942dcbb dnsmasq[876]: compile time options: IPv6 GNU-ge...y
Nov 18 21:32:42 923d1942dcbb dnsmasq[876]: reading /etc/resolv.conf
Nov 18 21:32:42 923d1942dcbb dnsmasq[876]: using nameserver 192.168.100.1#53
Nov 18 21:32:42 923d1942dcbb dnsmasq[876]: read /etc/hosts - 7 addresses
Hint: Some lines were ellipsized, use -l to show in full.
○ツールのインストール(digコマンドが使えるようになる)
[root@923d1942dcbb ~]# yum install bind-utils
Installed:
bind-utils.x86_64 32:9.9.4-61.el7_5.1
Dependency Installed:
GeoIP.x86_64 0:1.5.0-11.el7 bind-libs.x86_64 32:9.9.4-61.el7_5.1
Complete!
■dnsmasqの設定
コンテナは、/etc/hostsファイルを編集しても、再起動すると消えてしまう。
そのため、このhostsファイルの役割を、dnsmasqに担わせる設定を行った。
○オリジナルファイルを退避させた。
[root@923d1942dcbb ~]# mv /etc/dnsmasq.conf /etc/dnsmasq.conf.org
○独自の設定を行った。
★dnsmasqの設定は「【Linux CentOS 6.7 64bit】dnsmasqでドメイン名に応じて問い合わせ先を自動切替することなど【dnsmasq】」を参考にした。
[root@923d1942dcbb ~]# vi /etc/dnsmasq.conf
domain-needed
bogus-priv
no-resolv
no-poll
#server=/local.example.co.jp/192.168.0.5
#server=/co.jp/com/209.244.0.3
#server=9.9.9.9
server=8.8.8.8
server=8.8.4.4
#server=208.67.220.220
local=/localdomain/
#address=/pc01.example.com/192.168.123.45
no-hosts
addn-hosts=/etc/dnsmasq_static_hosts.conf
expand-hosts
○dnsmasq用の静的hostsファイルを作成した。
[root@923d1942dcbb ~]# vi /etc/dnsmasq_static_hosts.conf
127.0.0.1 localhost
127.0.0.1 outgoing.postfix
○dnsmasqの再起動
[root@923d1942dcbb ~]# systemctl restart dnsmasq
○動作テスト
dnsmasq用の静的hostsファイルに登録済の名前を解決した。
[root@923d1942dcbb ~]# dig @127.0.0.1 outgoing.postfix
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1 <<>> @127.0.0.1 outgoing.postfix登録したとおり、127.0.0.1が得られた。
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54525
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;outgoing.postfix. IN A
;; ANSWER SECTION:
outgoing.postfix. 0 IN A 127.0.0.1
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Nov 18 21:57:00 UTC 2018
;; MSG SIZE rcvd: 61
上位のDNSサーバに問い合わせた。
[root@923d1942dcbb ~]# dig @127.0.0.1 google.com
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1 <<>> @127.0.0.1 google.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16879
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;google.com. IN A
;; ANSWER SECTION:google.com. 58 IN A 216.*.*.*
;; Query time: 14 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Nov 18 21:55:12 UTC 2018
;; MSG SIZE rcvd: 55
これでDNSサーバーが127.0.0.1で動作しているので、
コンテナが名前解決用サーバーとしてこれを使うように設定する。
コンテナの作成時に、--dnsオプションで指定する必要があるので、
一旦コンテナをコミットしてイメージ化し、オプションを含めて、コンテナを作成する。
下記に示す。
■DNSオプションを付けてコンテナを再作成する
○一旦コンテナを終了した。
[root@923d1942dcbb ~]# poweroff
以下の作業は、Dockerホストで行う。
○状態の確認
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
923d1942dcbb image-centos7-ssh2 "/sbin/init" 2 days ago Exited (130) 8 seconds ago centos7-ssh
コンテナは終了した。
○コンテナをコミットしてイメージ化した。
コンテナ名はcentos7-sshで動作していた。イメージ名はcentos7-basic1とした。
[root@localhost ~]# docker commit centos7-ssh centos7-basic1
sha256:d63ba5e1370ad5535466b7b4bcfcb55e91ff971df572d03e8ebda1ef170ef417
○作成したイメージの確認
[root@localhost ~]# docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7-basic1 latest d63ba5e1370a 10 seconds ago 569MB
○作成したイメージからコンテナを動作させた。
(インターネットに直に接している場合、Dockerのデフォルトではiptablesを書き換えて外部からのアクセスを許してしまうことになってしまうため厳禁である。)
[root@localhost ~]# docker run --privileged -d -p 222:22 --dns=127.0.0.1 --name centos7-test centos7-basic1 /sbin/init
WARNING: Localhost DNS setting (--dns=127.0.0.1) may fail in containers.警告が出ているが、ここで指定している127.0.0.1はホスト上での意味はなくて、コンテナを指しているので問題ない。
fdd3310372de70801cf6af3c6b95b6e0d325d2a6f1c1782a4bbc319a71c84f19
○コンテナにSSH接続した。
192.168.100.3は、Dockerホストである。
このコンテナは、「【Linux CentOS 7】Dockerコンテナへssh接続する方法や、コンテナのイメージ化、削除、起動方法などについて【Docker-ce 18.06.1.ce】」をベースにしている。
$ ssh -p 222 root@192.168.100.3
[root@fdd3310372de ~]#
○既に設定済みのdnsmasqに登録したホスト名を名前解決できるか試した。
[root@fdd3310372de ~]# ping outgoing.postfix
PING outgoing.postfix (127.0.0.1) 56(84) bytes of data.名前解決ができた。
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.040 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.073 ms
^C
--- outgoing.postfix ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.040/0.056/0.073/0.018 ms
<参考>
・Configure container DNS
< https://docs.docker.com/v17.09/engine/userguide/networking/default_network/configure-dns/ > 2018年11月19日
・コンテナの DNS を設定
< http://docs.docker.jp/engine/userguide/networking/default_network/donfigure-dns.html > 2018年11月19日
・2018/07/24(25?)のChrome68に備えて既存カスタムドメインのGitHub Pagesを常時SSL化 + digの使い方覚書
< https://qiita.com/beta_chelsea/items/ea8c890d9c9eb634d3c1 > 2018年11月19日
・いつからか、メールが送信できなくなっていたので暫定対処した
< https://risaiku.net/archives/4430/ > 2018年11月19日