代码之家  ›  专栏  ›  技术社区  ›  Bercovici Adrian

通过telnet连接到Docker容器

  •  0
  • Bercovici Adrian  · 技术社区  · 6 年前

    我有一个 NET Core Console Application 哪个有 socket 绑定到 port .
    我有 码头工人 我尝试公开绑定的 港口 .
    当我使用时,程序显示正确的输出 docker attach [instance] .
    但是,当尝试连接时 Telnet 我得到错误:

    误差

    $ telnet 127.0.0.1 20001
    Connecting To 127.0.0.1...Could not open connection to the host, on port 8806: Connect failed
    

    .NET服务器

    class Program {
    
        public const int BUFFER_SIZE = 1024;
        public const int EXPOSED_PORT = 20001;
        public const string ADDRESS = "127.0.0.1";
        public const int MAX_CONNECTIONS = 1;
    
        public static ReadOnlyMemory<byte> CreateMessage(ReadOnlyMemory<byte>request) {
            Memory<byte> response= Encoding.UTF8.GetBytes($"Response from Daemon:{DateTime.Now.ToString()}");
            ///------code------//
            return response;
        }
    
        static async Task Main(string[] args) {
    
            Memory<byte> buffer = ArrayPool<byte>.Shared.Rent(BUFFER_SIZE);
    
            using (Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) {
                serverSocket.Bind(new IPEndPoint(IPAddress.Parse(ADDRESS), EXPOSED_PORT));
                Console.WriteLine($"Server started at {DateTime.Now.ToShortTimeString()} \r\nListening on port{EXPOSED_PORT}");
                serverSocket.Listen(MAX_CONNECTIONS);
    
                var client =await serverSocket.AcceptAsync();
                while (true) {
                    int rxCount =await  client.ReceiveAsync(buffer, SocketFlags.None);
                    if ((char) buffer.Span[0] == 'x'){
                        break;
                    }
                    await client.SendAsync(CreateMessage(buffer.Slice(0, rxCount)), SocketFlags.None);
                }
            }
            ArrayPool<byte>.Shared.Return(buffer.ToArray());
    
        }
    }
    

    文档文件

    FROM microsoft/dotnet:latest
    WORKDIR /app
    COPY ./bin/Release/netcoreapp2.1/publish .
    ENTRYPOINT [ "dotnet","DockerContainerDaemon.dll" ]
    EXPOSE 20001
    

    Docker和Build命令脚本

    dotnet build -c Release
    dotnet publish
    docker build --build-arg Port=20001 -t  daemon  .
    docker stop inst1
    docker rm inst1
    docker run --name inst1 -p 20001:20001 -d daemon 
    

    运行 docker -ps -a

    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
    f675c3e502ad        daemon              "dotnet DockerContai…"   5 seconds ago       Up 3 seconds        0.0.0.0:20001->20001/tcp   inst1
    

    附笔 正如有人指出的,我试图用两种方法暴露 127.0.0.1 0.0.0.0 .NET Application . 无济于事。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Mikki    6 年前

    尝试将应用程序绑定到0.0.0.0而不是127.0.0.1。这将解决你的问题。