如何让远方客户端访问docker容器?

如题

首先我iptables -F清掉了所有的规则

然后我用express-generator创建了一个项目test,进入里面创建了一个Dockerfile,为了方便我直接npm install了所有需要的包

express test
cd test
npm install

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

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

之后构建了自己的镜像,运行

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....

按说就应该没问题可以运行了……

但是我用同一局域网的其它机器(比如2.5或者2.7)访问就无法访问,而且我docker logs一查根本没有访问信息…………

用docker之前我在本机npm start测试过其它机器直接访问没问题,我不明白为啥会这样了……求助!

docker 内

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外的系统

ip a

eno1 直连192.168.2.0,与外网逻辑隔离,通过DHCP自动获得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
阅读 2.8k
2 个回答

dockerfile 里 npm install

要么防火墙的问题,要么网络路由问题。


(2018年9月6日更新)
因你没有明确列出测试机的网络信息,这里假设它的 IP 是 192.168.2.5/24。

那么从测试机到 docker 宿主机,再到 docker 内系统的网络流向如下

测试机  <<<------------>>>  宿主机  <<<---------------->>> docker 内系统
192.168.2.5/24          192.168.2.2/24 
                         172.17.0.1/16                  172.17.0.2/16

根据你所贴的 docker 内系统路由表

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

这里不应该出现 192.168.2.X 的路由项,不知道是不是你的笔误,还是手动添加的路由记录。

解决办法

将宿主机设置成路由,转发 192.168.2.0/24 与 172.17.0.2 之间的流量即可。

对 Linux 而言,主要修改两个地方

  1. 允许转发,参考 /proc/sys/net/ipv4/ip_forward,及 iptables FORWARD 设置。
  2. 在 192.168.2.2/24 网络接口设置 MASQUERADE,参考 iptables MASQUERADE 设置。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进