Skip to content
This repository has been archived by the owner on Jul 16, 2021. It is now read-only.

コンテナなのに環境を変えたら動かなくなった!? #11

Open
arsley opened this issue Mar 2, 2019 · 5 comments
Open

Comments

@arsley
Copy link
Member

arsley commented Mar 2, 2019

「時代はコンテナでオンプレだ!」が口癖である高圧的な上司は、最近、グローバルアドレスの持つ自宅のゲートウェイルータからフォワーディングを行うことで自宅サーバを全世界に公開しているみたいです。
ある日、上司は鬼のような形相で、「レンタルサーバーで動いていたDockerコンテナを自宅サーバに移行したらhttpが通らなくなった!pingは通るのにだぞ!!お前Docker詳しいって言ってたよな、サーバにだけsshで入れるようにしてやるから原因を究明して直してくれよ!」とあなたに無茶振りをしてきました。重ねて、「Dockerはどの環境でも動くものだろ!もともと動いてたんだからイメージに修正は加えるな!」とのことです。
上司との会話より、レンタルサーバーから自宅サーバに移行したコンテナは http://hpn.finals.ictsc へのGETリクエストが失敗するとエラー出力がされるものであり、また hpn.finals.ictsc は上司の自宅のゲートウェイルータに振られるグローバルアドレスに解決されることがわかりました。

またこの問題を先輩に相談したところ、先輩はニヤニヤした顔で「これは俺も家でサーバやるときにハマった事あるなぁ・・大きく2通りやり方があるんだが今回はRouterにログインできないから片方しか試せないかな・・・そうだ!明日の15時までに2通りの解決法を思いついた上で問題を解いたら焼き肉に連れてってやるよ!」と言ってきました。

上司の命令、そして焼き肉のために問題を解決してください。

情報

topology

topology

この問題では 192.168.22.0/25 ネットワークをグローバルネットワーク、 192.168.22.128/25 をローカルネットワークとします。

参加者手元PCから 192.168.22.0/25 にはL3ルーティングで通信することが可能です。
sshでログインできるマシンは Server のみです。

Routerは外部からの通信のうち以下のものをServerに転送する設定となっています。そのためServerへのアクセスは 192.168.22.1 宛のsshを行うことで可能となります。

tcp 22 宛の通信
tcp 80 宛の通信
tcp 443 宛の通信

Router

IPアドレス

グローバルアドレス: 192.168.22.1/25
ローカルアドレス: 192.168.22.129/25
このルータにsshはできません。

Server

IPアドレス

ローカルアドレス: 192.168.22.130/25
このサーバはsshでログイン可能です。

ユーザー: admin
パスワード: password
Serverでは以下の2つのコンテナが起動しています。

httpd: 80番でWebサービスを提供するコンテナ
手元PCから http://hpn.finals.ictsc にアクセスすることで、 It works! と表示されます。 (DNS Serverは会場DHCPにより指定されるものを使用してください)
connection-check: hpn.finals.ictsc への http 通信を行うコンテナ
docker logs connection-check コマンドより、通信が成功するかどうかを確認できます。
curl http://hpn.finals.ictsc の戻り値が0である場合 (つまり、通信が成功すると) connection successed! と出力されます。
curl http://hpn.finals.ictsc の戻り値が0以外である場合 (つまり、通信が失敗すると) connection failed! と出力されます。
connection-check イメージを作成する Dockerfile は /root/docker/connection-check 以下に存在します。

備考

hpn.finals.ictsc は 192.168.22.1 へ解決されるドメインとなります。
Docker Image の再作成による内容は変更は行わないでください。
connection-check コンテナの起動は以下のコマンドで動作します。
docker run -itd --name connection-check local/connection-check

開始時の状態

docker logs connection-check コマンドを実行すると connection failed! が出力される

問題のゴール状態

基準点

docker logs connection-check コマンドを実行すると connection successed! が出力される

満点

なぜこの問題が生じるかを説明し、解決法その2 (Routerにログインできる場合の解法) を述べる

提出すべきもの

基準点

connection-check コンテナが、 connection successd! を返すように修正し、その解決法を上司に報告する。

満点

問題の解決法その2 (Routerにログインできる場合の解法) を述べ、原理を先輩に報告する。

@arsley
Copy link
Member Author

arsley commented Mar 3, 2019

DNSの話はめんどくさそうなので、 /etc/hosts にこの名前とipの対応を含めます。

@arsley
Copy link
Member Author

arsley commented Mar 3, 2019

# /etc/hosts

127.0.0.1 localhost
+ 192.168.22.130 hpn.finals.ictsc
...略...
root@server:~# curl hpn.finals.ictsc
<html><body><h1>It works!</h1></body></html>

@arsley
Copy link
Member Author

arsley commented Mar 3, 2019

もう一つの方はNATかな?

@arsley
Copy link
Member Author

arsley commented Mar 3, 2019

connection-checkからの確認ができないのでダメ。

@arsley
Copy link
Member Author

arsley commented Mar 3, 2019

こいつらを変えればいいらしい。
参考

root@server:~# cat /etc/host.conf 
# The "order" line is only used by old versions of the C library.
order hosts,bind
multi on

root@server:~# cat /etc/nsswitch.conf 
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         compat systemd
group:          compat systemd
shadow:         compat
gshadow:        files

hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

@arsley arsley removed their assignment Mar 17, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

2 participants