2016-11-24 108 views
0

从我的码头集装箱我想访问我的主机上运行的MySQL服务器127.0.0.1。我想从主机访问在我的容器容器上运行的Web服务器。我尝试这样做:码头:容器和主机端口的相互访问

docker run -it --expose 8000 --expose 8001 --net='host' -P f29963c3b74f 

但没有端口显示为暴露:

$ docker ps 
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS    NAMES 
093695f9bc58  f29963c3b74f  "/bin/sh -c '/root/br" 4 minutes ago  Up 4 minutes       elated_volhard 
$ 
$ docker port 093695f9bc58 

如果我没有做--net='host',端口都暴露出来,我可以在访问Web服务器容器。

主机和容器如何互相访问其他端口?

回答

0

--expose定义:

容器内的端口号码(其中服务侦听)不 不需要匹配(暴露在 容器的外部端口号,其中客户端连接)。例如,在容器 内,HTTP服务正在端口80上侦听(因此图像开发人员 在Dockerfile中指定了EXPOSE 80)。在运行时,端口可能是 绑定到主机上的42800。要查找主机端口 与外露端口之间的映射,请使用docker端口。

随着--net=host

--network =“宿主”给出了容器完全访问本地系统服务,如d-总线,因此被认为是不安全的。

在这里你没有任何“端口”,因为你有所有的端口为主机打开。

如果你不想使用host网络,你可以从码头工人容器访问主机端口与搬运工人接口
- How to access host port from docker container
- From inside of a Docker container, how do I connect to the localhost of the machine?

当您想从主机访问容器时,您需要将端口发布到主机接口。

-P选项将所有端口发布到主机接口。 Docker 将每个暴露端口的绑定到主机上的随机端口。 端口的范围在 /proc/sys/net/ipv4/ip_local_port_range定义的临时端口范围内。使用-p标志明确地 映射单个端口或端口范围

总之,当你定义的只是--expose 8000端口不暴露给8000,而是暴露给一些随机端口。当你想让端口8000对主机可见时,你需要映射发布的端口-p 8000:8000

+0

我正在测试的东西,所以我很确定docker使用主机上的一个随机端口。从程序员的帖子看来,当使用''--net = host'''时,你不能公开/映射端口。 – user2233706

+0

@ user2233706当然,使用'--net = host'时不能暴露端口(这没有意义 - 这就是为什么你在“端口”列没有任何内容)。当你不'发布'端口你的主机如何知道暴露端口例如。 '8000-> XXXX'?主机上的端口应该用'docker0'接口(分别为'IP')访问。 – VladoDemcak

0

Docker的网络模型是为您的容器创建一个新的网络名称空间。这意味着容器获得自己的127.0.0.1。如果您希望容器到达仅在主机上的127.0.0.1上侦听的mysql服务,您将无法访问它。

--net=host会将您的容器放入与主机相同的网络名称空间中,但这并不可取,因为它实际上关闭了docker所具有的所有其他网络功能 - 您无法隔离, t获取端口公开/发布等。

最好的解决方案可能是让你的mysql服务器监听一个可以从docker容器路由的接口。

如果你不想让MySQL监听你的公共接口,你可以创建一个网桥接口,给它一个随机IP(确保你没有任何冲突),将它连接到什么也没有,并配置mysql只能监听那个ip和127.0.0.1。例如:

sudo brctl addbr myownbridge 
sudo ifconfig myownbridge 10.255.255.255 
sudo docker run --rm -it alpine ping -c 1 10.255.255.255 

该IP地址可以从您的主机和在该主机上运行的任何容器进行路由。

另一种方法是容器化你的mysql服务器。您可以将它放在与其他容器相同的网络上并以此方式实现。您甚至可以将其端口3306发布到主机的127.0.0.1接口。

+1

根据[this](http://serverfault.com/questions/139323/mysql-bind-to-more-than-one-ip-address),您不能让MySQL侦听多个IP地址。我的脚本工作正常,但是当我在''my.cnf'''中设置'''bind-address = 10.255.255.255''时,我仍然无法连接到MySQL服务器。 – user2233706

+0

我将在一个容器中运行MySQL。 – user2233706

+0

你还需要配置mysql来监听该ip。 – programmerq

相关问题