我使用下面的命令
在Docker中安装了Redisdocker 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虚拟机中更改任何内容?
答案 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上是否有任何端口阻塞。
此外,还存在其他解决方案,例如Kubernetes或Mesos,但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的端口之间存在不匹配。有几种可能性:
还有其他人正在收听127.0.0.1:6379。运行sudo netstat -lntp | grep 6379
以使用该端口查找进程。
容器很可能没有运行。我说这是因为6380上没有任何内容。检查你的容器是否与docker ps -a
一起运行。如果容器正在运行,ps输出将包括任何端口绑定。如果容器存在,即使退出,您也可以使用docker logs container_id
检查其日志,看是否有任何错误。
Docker未在您的本地主机上运行。如果echo $DOCKER_HOST
指向ip或主机名,则客户端将在那里发送命令。如果您在VM中运行命令并检查物理主机上的结果,这也适用。
不太可能,但您可以使用--ip
标志将dockerd上的默认IP更改为127.0.0.1。默认情况下,发布的端口侦听所有接口(0.0.0.0)。
上面列出的运行命令可能不准确。如果您使用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容器访问该计算机。
ping IPOFDOCKERMACHINE
。如果步骤1成功,请尝试telnet命令以确保您可以访问端口require。有关telnet命令,请参阅this article。 This article显示了如何在Windows操作系统中启用telnet。
telnet IPOFDOCKERMACHINE 6380
telnet IPOFDOCKERMACHINE 6379
如果telnet失败,则表示您无权访问所需的端口。在继续前进之前,您需要解决此问题。
答案 4 :(得分:0)
答案 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)的容器。