docker容器端口暴露给其他机器

我使用下面的命令在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); 

我的应用程序托pipe在另一台机器在不同的服务器。

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

无法连接到Redis服务器。 要创build一个断开的多路复用器,请禁用AbortOnConnectFail。 在PING上SocketFailure

在docker或oracle虚拟机中是否需要更改?

在不同服务器上通过networking连接多个容器是Docker群体的理想用例。 您应该尝试创build覆盖networking,并将正在运行的容器连接到群集和该networking,如此处所述。 根据你对群体生态系统的了解,你可以尝试不同的解决scheme。

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

 # 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 

该命令将输出一个从节点上使用的从节点命令。 这个命令将允许你join群作为“从”服务器。 如果你想从服务器启动服务,你应该输出下面的命令,这将给你的经理令牌。

 $ 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 

当你的节点在swarm上时,你可以用replicas启动你的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选项公开端口,但是您必须发现哪个服务器运行您的服务。 但是,这需要您按照其他的方法来检查您的虚拟机是否有端口阻塞。

而且,像Kubernetes或Mesos这样的其他解决scheme也存在,但群体就像正式的走向。

Docker绑定你暴露的端口到本地主机。 这就是为什么你find问题。 为了使Docker将这些暴露的端口解除绑定到本地主机,您必须通过更改用于启动容器的命令来运行容器:

 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服务,如果你正在使用这个东西甚至接近生产。

鉴于你的运行命令没有任何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 

发布到所有接口的端口与正在本地主机上侦听的端口之间存在不匹配。 有几种可能性:

  1. 别的东西正在听127.0.0.1:6379。 运行一个sudo netstat -lntp | grep 6379 sudo netstat -lntp | grep 6379find使用该端口的进程。

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

  3. Docker没有在你的本地主机上运行。 如果echo $DOCKER_HOST指向一个ip或主机名,那么客户echo $DOCKER_HOST在发送命令。 这也适用于在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发布了端口, docker run -d -p 127.0.0.1:6379:6379 redis:3.0.1可以解释绑定到127.0.0.1。 从命令中删除127.0.0.1:将默认绑定到所有接口。

根据你的错误;

无法连接到Redis服务器。 创build一个>断开的多路复用器,禁用AbortOnConnectFail。 在PING上SocketFailure

我认为你的其他机器不能使用docker集装箱访问机器。

  1. 尝试ping IPOFDOCKERMACHINE
  2. 如果步骤1不起作用,那就意味着您不能使用另一台机器的docker箱来访问机器。 你需要先解决这个问题。
  3. 如果步骤1成功,请尝试telnet命令以确保您可以访问端口require。 请参阅这篇关于telnet命令的文章 。 本文介绍如何在Windows操作系统中启用telnet。 telnet IPOFDOCKERMACHINE 6380 telnet IPOFDOCKERMACHINE 6379

  4. 如果telnet失败,这意味着你不能访问你需要的端口。 在继续前,您需要解决这个问题。

  5. 如果步骤3成功,您需要确保您的docker集装箱是按照David Gonzalez在上面的回复中所显示的那样启动的。

@Prithvi:貌似你不能从本地机器访问redis ..你是否尝试在oracle虚拟机设置中的端口转发

在这里输入图像说明

在这里输入图像说明

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

公开容器对于主机识别哪个端口容器运行非常重要。 -p在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)被redirect到具有ip(172.17.0.2)和端口(6379)的容器。