Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将docker容器端口暴露给其他计算机_C#_Docker_Redis - Fatal编程技术网

C# 将docker容器端口暴露给其他计算机

C# 将docker容器端口暴露给其他计算机,c#,docker,redis,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); 我的应用程序托管在不同

我已经使用下面的命令在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);
我的应用程序托管在不同服务器的另一台计算机上

Wnen我正在运行应用程序,以下是例外情况

无法连接到redis服务器;创建 断开多路复用器,禁用中止连接失败。插座故障 平


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

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

docker run-d-p 0.0.0:6380:6379 redis:2.8.20
docker run-d-p 0.0.0:6379:6379 redis:3.0.1
改变的部分是,现在您正在为本地部分指定主机和端口(并保持容器部分的原样;单个端口)


我希望这能帮助你,伙计!请小心点。这不像你通常想要达到的目标。如果您正在使用redis服务进行生产,请确保您的redis服务未经身份验证。

如果您的run命令没有任何ip限制,则:

$ docker run -d -p 6379:6379 redis:3.0.1
$ docker run -d -p 6380:6379 redis:2.8.20
以及在注释中显示绑定到localhost的netstat输出:

$ netstat -na | grep 6379 && netstat -na | grep 6380 
TCP 127.0.0.1:6379 0.0.0.0:0 LISTENING
发布到所有接口的端口与正在本地主机上侦听的端口不匹配。有几种可能性:

  • 127.0.0.1:6379正在收听其他内容。运行一个
    sudonetstat-lntp | grep6379
    查找使用该端口的进程

  • 很可能容器没有运行。我这么说是因为6380上没有任何东西。检查您的容器是否使用
    docker ps-a
    运行。如果容器正在运行,ps输出将包括任何端口绑定。如果容器存在,即使已退出,也可以使用
    docker logs container\u id
    检查其日志,以查看是否存在任何错误

  • Docker未在本地主机上运行。如果echo$DOCKER\u HOST指向ip或主机名,则您的客户机正在那里发送命令。如果您在虚拟机中运行命令并在物理主机上检查结果,这也适用

  • 不太可能,但您可以使用
    --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:
    将默认绑定到所有接口

  • 基于你的错误

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

    我认为您的另一台机器无法使用docker容器访问该机器

  • 尝试ping IPOFDOCKERMACHINE
  • 如果步骤1不起作用,则意味着您无法从其他机器访问带有docker容器的机器。你需要先解决这个问题
  • 如果步骤1成功,请尝试telnet命令以确保可以访问所需的端口。请参考有关telnet命令的信息。演示如何在Windows操作系统中启用telnet。
    
    telnet IPOFDOCKERMACHINE 6380
    telnet IPOFDOCKERMACHINE 6379
    

  • 如果telnet失败,这意味着您无法访问所需的端口。在继续之前,您需要解决此问题

  • 如果第3步成功,您需要确保您的docker容器已启动,如上面的回复所示

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

    从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
    
    此命令将输出要在节点上使用的从属命令。此命令将允许您作为“从属”服务器加入swarm。如果要从该服务器启动服务,则应输出以下命令,该命令将为您提供manager令牌

    $ 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
    
    $docker swarm加入令牌管理器
    要将管理器添加到此群,请运行以下命令:
    docker群集加入\
    --令牌SWMTKN-1-1EWYZ5URM5Of78VDDMRIXFaye5Mx0CNUJ0HWXDT7BAYWMPPAV-0p5n6b7hz170gb79uuvd2ipoy\
    :2377
    
    当您的节点位于swarm上时,您可以启动带有副本的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>
    
    $docker服务创建--网络redisnet\
    --名称redis--副本1 redis:3.0.1
    $docker服务创建--网络redisnet\
    --名称old_redis--副本1 redis:2.8.20
    
    $docker service create--network redisnet--name app or,但swarm是正式的选择。

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


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

    公开容器对于主机识别在哪个端口容器中运行非常重要。 -用于公开端口的docker run命令中的p。 语法:docker run-p host\u ip:host\u port:container\u port image\u name(将host\u ip添加到您的跑步中) docker run-d-p主机ip:6379:6379 redis:3.0.1 这会将容器的端口6379绑定到主机的主机ip上的端口6379。 使用iptables实现清晰:iptables-L-n-tnat 假设容器ip be:172.17.0.2 现在请求发送给何