将docker container port暴露给其他机器

时间:2017-02-07 11:37:27

标签: c# docker redis

我使用下面的命令

在Docker中安装了Redis
docker run -d -p 6379:6379 redis:3.0.1
docker run -d -p 6380:6379 redis:2.8.20

现在我需要从另一台机器

访问这个redis实例
public static ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(IPOFDOCKERINSTALLEDMACHINE:6379);

我的应用程序托管在不同服务器中的另一台计算机上。

我在运行应用程序,下面是例外

  

无法连接到redis服务器;创造一个   断开多路复用器,禁用AbortOnConnectFail。 SocketFailure上   PING

是否需要在docker或oracle虚拟机中更改任何内容?

6 个答案:

答案 0 :(得分:3)

在不同服务器上通过网络连接多个容器是docker swarm的完美用例。您应该尝试创建一个覆盖网络,并将正在运行的容器连接到swarm和该网络,如here所述。 根据您对群体生态系统的了解,您可以尝试不同的解决方案。

从docker 1.12开始,如果你想手动管理容器,你可以运行

# retrieve the last swarm version
$ docker pull swarm
# running your swarm manager on your server
$ docker swarm init --advertise-addr $(hostname -I | awk '{print $1}')
# creating a cross server container network
$ docker network create --driver overlay redisnet

此命令将输出要在节点上使用的slave命令。此命令允许您将swarm作为“slave”服务器加入。如果要从该服务器启动服务,则应输出以下命令,该命令将为您提供管理器令牌。

$ docker swarm join-token manager

To add a manager to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-1ewyz5urm5ofu78vddmrixfaye5mx0cnuj0hwxdt7baywmppav-0p5n6b7hz170gb79uuvd2ipoy \
<IP_ADDRESS>:2377

当您的节点在群组中时,您可以启动带有副本的redis服务

$ docker service create --network redisnet \
                        --name redis --replicas 1 redis:3.0.1
$ docker service create --network redisnet \
                        --name old_redis --replicas 1 redis:2.8.20
$ docker service create --network redisnet --name app <APP_IMAGE>

现在,您的所有容器都可以使用服务名称作为特定服务的主机名进行http调用。基本上,如果您只需要从应用程序访问redis服务,就应该这样做。

您还可以使用与-p相同的docker选项公开端口,但您必须发现哪个服务器运行您的服务。但是,这需要您按照其他答案检查您的VM上是否有任何端口阻塞。

此外,还存在其他解决方案,例如KubernetesMesos,但swarm就像是正式的方式。

答案 1 :(得分:1)

Docker将您公开的端口绑定到localhost。这就是你找到问题的原因。为了使Docker将这些公开的端口解除绑定到localhost,您必须通过更改用于启动容器的命令来运行容器:

docker run -d -p 0.0.0.0:6380:6379 redis:2.8.20
docker run -d -p 0.0.0.0:6379:6379 redis:3.0.1

更改的部分是,现在您要为本地部件指定主机和端口(并将容器部件保留为原样;单个端口)。

我希望能帮助你交配!请注意这一点。这不像你通常想要实现的东西。如果您将其用于甚至接近生产的东西,请确保您不会将您的redis服务保留为未经身份验证。

答案 2 :(得分:1)

给出你的运行命令没有任何ip限制:

$ docker run -d -p 6379:6379 redis:3.0.1
$ docker run -d -p 6380:6379 redis:2.8.20

netstat输出显示它绑定到注释中的localhost:

$ netstat -na | grep 6379 && netstat -na | grep 6380 
TCP 127.0.0.1:6379 0.0.0.0:0 LISTENING

您发布到所有接口的端口与正在侦听localhost的端口之间存在不匹配。有几种可能性:

  1. 还有其他人正在收听127.0.0.1:6379。运行sudo netstat -lntp | grep 6379以使用该端口查找进程。

  2. 容器很可能没有运行。我说这是因为6380上没有任何内容。检查你的容器是否与docker ps -a一起运行。如果容器正在运行,ps输出将包括任何端口绑定。如果容器存在,即使退出,您也可以使用docker logs container_id检查其日志,看是否有任何错误。

  3. Docker未在您的本地主机上运行。如果echo $DOCKER_HOST指向ip或主机名,则客户端将在那里发送命令。如果您在VM中运行命令并检查物理主机上的结果,这也适用。

  4. 不太可能,但您可以使用--ip标志将dockerd上的默认IP更改为127.0.0.1。默认情况下,发布的端口侦听所有接口(0.0.0.0)。

  5. 上面列出的运行命令可能不准确。如果您使用docker run -d -p 127.0.0.1:6379:6379 redis:3.0.1发布了可以解释绑定到127.0.0.1的端口。从命令中删除127.0.0.1:将默认绑定到所有接口。

答案 3 :(得分:1)

根据您的错误;

  

无法连接到redis服务器;要创建一个&gt;已断开连接的多路复用器,请禁用AbortOnConnectFail。 PING上的SocketFailure

我认为您的其他计算机无法使用docker容器访问该计算机。

  1. 试试ping IPOFDOCKERMACHINE
  2. 如果步骤1不起作用,则表示您无法使用其他计算机上的docker容器访问该计算机。你需要先修复它。
  3. 如果步骤1成功,请尝试telnet命令以确保您可以访问端口require。有关telnet命令,请参阅this articleThis article显示了如何在Windows操作系统中启用telnet。 telnet IPOFDOCKERMACHINE 6380 telnet IPOFDOCKERMACHINE 6379

  4. 如果telnet失败,则表示您无权访问所需的端口。在继续前进之前,您需要解决此问题。

  5. 如果第3步成功,您需要确保您的泊坞广告容器按照上面回复中显示的David Gonzalez启动。

答案 4 :(得分:0)

@Prithvi:看起来你无法从本地机器访问redis ..你是否尝试在oracle虚拟机设置中进行端口转发

enter image description here

enter image description here

通过这种方式,您可以访问在Oracle中运行的应用程序,以便从本地计算机访问。

答案 5 :(得分:0)

公开容器对于主机识别哪个端口容器运行非常重要。       -p in docker run命令用于公开端口。       语法:docker run -p host_ip:host_port:container_port image_name(将host_ip添加到运行中) docker run -d -p host_ip:6379:6379 redis:3.0.1 这将容器的端口6379绑定到主机的host_ip上的端口6379。 使用iptables进行清除:iptables -L -n -t nat 假设容器ip为:172.17.0.2  现在,发送到host_ip和端口(6379)的请求被重定向到具有ip(172.17.0.2)和端口(6379)的容器。