鍍金池/ 問答/Linux/ 如何讓遠(yuǎn)方客戶端訪問docker容器?

如何讓遠(yuǎn)方客戶端訪問docker容器?

如題

首先我iptables -F清掉了所有的規(guī)則

然后我用express-generator創(chuàng)建了一個(gè)項(xiàng)目test,進(jìn)入里面創(chuàng)建了一個(gè)Dockerfile,為了方便我直接npm install了所有需要的包

express test
cd test
npm install

然后我直接把所有東西都放到容器里就不用安裝一遍了……

from node:latest
workdir /app
add . /app
expose 3000
cmd npm start

之后構(gòu)建了自己的鏡像,運(yùn)行

docker build -t test0
docker container run -d -p3000:3000 test0
# 5380
docker logs 5380
# test@0.0.1 start /app
# node ./bin/www
docker container ls
# 5380...     test0     "bin/sh -c..."          ...    0.0.0.0:3000:3000/tcp

我自己curl了一下本地訪問沒問題

curl http://172.17.0.2:3000
# <!DOCTYPE....
curl http://192.168.2.2:3000
# <!DOCTYPE....

按說就應(yīng)該沒問題可以運(yùn)行了……

但是我用同一局域網(wǎng)的其它機(jī)器(比如2.5或者2.7)訪問就無(wú)法訪問,而且我docker logs一查根本沒有訪問信息…………

用docker之前我在本機(jī)npm start測(cè)試過其它機(jī)器直接訪問沒問題,我不明白為啥會(huì)這樣了……求助!

docker 內(nèi)

ip a

1: lo: <LOOPBACK.....
4: eth0@if5: <BROADCAST, MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default

    link/ether 02:42:ac:11:00:02    brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
        valid_lft forever preferred_lft forever

ip r

default via 172.17.0.1 dev eth0
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
192.168.2.0/24 dev eno1 proto kernel scope link src 192.168.2.115
192.168.2.254 dev eno1 proto shcp scope link src 192.168.2.115 metric 100

docker container ls

7c... mariadb "docker-entrypoint.s..." 12 days ago up 6 minutes 0.0.0.0:3306->3306/tcp

Docker外的系統(tǒng)

ip a

eno1 直連192.168.2.0,與外網(wǎng)邏輯隔離,通過DHCP自動(dòng)獲得IP地址(不固定)

docker0: <BROADCAST, MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default

    link/ether 02:42:ac:11:87:74    brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
        valid_lft forever preferred_lft forever
    inet 6 ................ scope link
        valid_lft forever preferred_lft forever

ip r

default via 192.168.2.254 dev eno1 proto dhcp src 192.168.2.127 metric 100
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
192.168.2.0/24 dev eno1 proto kernel scope link src 192.168.2.115
192.168.2.254 dev eno1 proto dhcp scope link src 192.168.2.127 metric 100
回答
編輯回答
逗婦乳

dockerfile 里 npm install

2017年9月12日 21:41
編輯回答
熟稔

要么防火墻的問題,要么網(wǎng)絡(luò)路由問題。


(2018年9月6日更新)
因你沒有明確列出測(cè)試機(jī)的網(wǎng)絡(luò)信息,這里假設(shè)它的 IP 是 192.168.2.5/24。

那么從測(cè)試機(jī)到 docker 宿主機(jī),再到 docker 內(nèi)系統(tǒng)的網(wǎng)絡(luò)流向如下

測(cè)試機(jī)  <<<------------>>>  宿主機(jī)  <<<---------------->>> docker 內(nèi)系統(tǒng)
192.168.2.5/24          192.168.2.2/24 
                         172.17.0.1/16                  172.17.0.2/16

根據(jù)你所貼的 docker 內(nèi)系統(tǒng)路由表

default via 172.17.0.1 dev eth0
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
192.168.2.0/24 dev eno1 proto kernel scope link src 192.168.2.115
192.168.2.254 dev eno1 proto shcp scope link src 192.168.2.115 metric 100

這里不應(yīng)該出現(xiàn) 192.168.2.X 的路由項(xiàng),不知道是不是你的筆誤,還是手動(dòng)添加的路由記錄。

解決辦法

將宿主機(jī)設(shè)置成路由,轉(zhuǎn)發(fā) 192.168.2.0/24 與 172.17.0.2 之間的流量即可。

對(duì) Linux 而言,主要修改兩個(gè)地方

  1. 允許轉(zhuǎn)發(fā),參考 /proc/sys/net/ipv4/ip_forward,及 iptables FORWARD 設(shè)置。
  2. 在 192.168.2.2/24 網(wǎng)絡(luò)接口設(shè)置 MASQUERADE,參考 iptables MASQUERADE 設(shè)置。
2017年3月15日 14:30