SUSE Linux Enterprise Server 12SP1のDockerで奇妙な状況に直面しています。
SSHを使用してサーバーに接続しています。まず、簡単なnginxサーバーを実行してテストしようとしました。
docker run -d -p 8081:80 nginx:Alpine --name nginxtest
コンテナが正常に起動します。次に、curl http://localhost:8081
の実行が機能します!
<!-- [...] -->
<title>Welcome to nginx!</title>
<!-- [...] -->
ただし、コンピューターからブラウザーからアクセスしようとすると、http://10.etc.etc.etc:8081
で要求がタイムアウトします。
ただし、驚いたことに、Dockerのことを少し忘れて、サーバーから直接python3 -m http.server
などの単純なHTTPサーバーを使用すると、次のようになります。
Serving HTTP on 0.0.0.0 port 8000 ...
そして、コンピュータのブラウザからアクセスすると、http://10.etc.etc.etc:8000
で動作します!!
したがって、これはdockerがポートを公開する方法に関するものである必要がありますが、curl http://localhost:8081
が機能するため奇妙です...
どうすればさらにトラブルシューティングしてこれを修正できますか?
注:昨日systemctl restart wicked
を実行するまで、問題は完全に機能していました(別の無関係な問題を調査しようとしていました)。サーバーを再起動しようとしましたが、役に立ちませんでした。
関連する可能性のあるいくつかの出力があります...
ifconfig docker0
docker0 Link encap:Ethernet HWaddr 02:49:68:4D:40:9B
inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:8e6e:ee3f:6918/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:353842611 errors:0 dropped:0 overruns:0 frame:0
TX packets:450340200 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:509803756314 (486186.7 Mb) TX bytes:497391388709 (474349.3 Mb)
brctl show docker0
bridge name bridge id STP enabled interfaces
docker0 8000.0249143a607f no veth0e4b1f4
veth1f2fcc2
veth389f6fe
[[others]]
docker ps | grep nginx
は0.0.0.0:8081->80/tcp
です
cat /etc/sysctl.conf
# net.ipv6.conf.all.disable_ipv6 = 1
# net.ipv6.conf.all.disable_ipv6 = 1
net.ipv4.ip_forward = 0
net.ipv6.conf.all.forwarding = 0
(netstat -ltunp | head -2) && (netstat -ltunp | grep docker)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 :::9000 :::* LISTEN 28216/docker-proxy
tcp 0 0 :::5000 :::* LISTEN 28165/docker-proxy
tcp 0 0 :::8081 :::* LISTEN 30341/docker-proxy
iptables -n --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
DOCKER-ISOLATION all -- 0.0.0.0/0 0.0.0.0/0
DOCKER all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain DOCKER (1 references)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 172.17.0.11 tcp dpt:5000
ACCEPT tcp -- 0.0.0.0/0 172.17.0.13 tcp dpt:9000
ACCEPT tcp -- 0.0.0.0/0 172.17.0.2 tcp dpt:80
Chain DOCKER-ISOLATION (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
iptables -nt nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0
MASQUERADE tcp -- 172.17.0.11 172.17.0.11 tcp dpt:5000
MASQUERADE tcp -- 172.17.0.13 172.17.0.13 tcp dpt:9000
MASQUERADE tcp -- 172.17.0.2 172.17.0.2 tcp dpt:80
Chain DOCKER (2 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:5000 to:172.17.0.11:5000
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:9000 to:172.17.0.13:9000
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8081 to:172.17.0.2:80
docker network ls
NETWORK ID NAME DRIVER SCOPE
20c691cc38e6 bridge bridge local
cd95c7d14c38 Host Host local
eb6d8228f366 none null local
docker network inspect bridge
[
{
"Name": "bridge",
"Id": "20c691cc38e65be9bf0a377fd8560d49430f523608094b68145e8769e24b1764",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Containers": {
"26887c686d3c8612e460b923692f371bef881065a525496dff9af993ed4b7949": {
"Name": "sleepy_fermi",
"EndpointID": "3e79d8c15423b2e145a900e796d316159d2dc51dcc10ced2099b77d1111b03e7",
"MacAddress": "02:49:68:4D:40:9B",
"IPv4Address": "172.17.0.6/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.Host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION
-A FORWARD -j DOCKER-ISOLATION
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A DOCKER -d 172.17.0.11/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 5000 -j ACCEPT
-A DOCKER -d 172.17.0.13/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 9000 -j ACCEPT
-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT
-A DOCKER-ISOLATION -j RETURN
docker version
Client:
Version: 1.12.6
API version: 1.24
Go version: go1.6.2
Git commit: 78d1802
Built: Thu Mar 2 12:26:00 2017
OS/Arch: linux/AMD64
Server:
Version: 1.12.6
API version: 1.24
Go version: go1.6.2
Git commit: 78d1802
Built: Thu Mar 2 12:26:00 2017
OS/Arch: linux/AMD64
ここでは、Dockerコンテナはdocker0(ネットワーク:172.17.x.x)を介して到達可能です
ブラウザから、10.x.x.xアドレスに接続しようとしています。
ブラウザからローカルでホストされているコンテナに接続するだけの場合は、コンテナアドレス(172.17.x.x)にアクセスする方が簡単です。
場合によっては、Dockerホストに接続するssh -X
を使用して、LANに公開せずにWebブラウザーを起動することもできます。
LAN上のクライアントにhttp/httpsサービスを公開したい場合は、リバースプロキシ(nginx、traefik、Apacheなど)を使用できます。
dnf install httpd
setsebool -P httpd_can_network_connect on
cat <<EOF >/etc/httpd/conf.d/welcome.conf
<VirtualHost *:80>
ServerName my-application.example.com
LogLevel debug
ErrorLog logs/tunnel_error.log
CustomLog logs/tunnel_access.log combined
<Location />
Require all granted
</Location>
ProxyPass / http://<container-address>:8080/
ProxyPassReverse / http://<container-address>:8080/
</VirtualHost>
EOF
systemctl enable httpd
systemctl start httpd
LAN上のクライアントにtcp/udpサービスを公開したい場合は、それに応じてファイアウォールを設定できます。
sysctl -w net.ipv4.conf.all.forwarding=1
echo net.ipv4.conf.all.forwarding=1 >>/etc/sysctl.conf
iptables -A FORWARD -i docker0 -o eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -p tcp -d <my-eth0-address> --dport 8080 -j DNAT --to <my-container-address>:8080
システムを再起動したり、何らかの方法でファイアウォールをリセットしたりすると、これらのiptablesルールは保持されないことに注意してください。ウィキッドにはあまり詳しくありません。