Docker:能够从主机telnet到远程机器,但不能从容器telnet到远程机器

时间:2017-07-11 14:07:38

标签: docker networking amazon-ecs

我们在ECS上部署了几个docker容器。容器内的应用程序使用远程服务,因此需要使用10.X.X.X私有IP访问它们。

我们使用Docker 1.13和CentOS 7以及docker / alpine作为我们的基本图像。我们还使用netwokMode: host作为容器。当我们可以从主机成功运行telnet 10.X.X.X 9999但是如果我们从容器内部运行相同的命令时,问题就出现了,它只是挂起而且无法连接。

此外,我们在主机(容器运行的位置)中启用了net.ipv4.ip_forward,但在远程计算机中禁用了。{/ p>

不确定可能是什么问题,也许iptables

1 个答案:

答案 0 :(得分:2)

我花了一天同样的问题(尝试使用网络模式'bridge'和'host'),看起来在ECS中使用busybox的telnet是一个问题 - Alpine的telnet是busybox的符号链接。我不太了解busybox / networking来说明根本原因是什么,但我能够通过使用其他工具证明网络路径是明确的。

我的'去'用于测试网络路径正在使用netcat,如下所示。 “成功”或“失败”消息因版本而异,但拒绝或超时(-w#)非常明显。所有netcat都在这里请求一个套接字 - 它实际上并不与监听应用程序通信,所以你需要其他东西来测试它。

class FetchUserProfileController: UIViewController {


@IBOutlet weak var userFullName: UILabel!
@IBOutlet weak var userProfileImage: UIImageView!


override func viewDidLoad() {
    super.viewDidLoad()

    userFullName.text = ""

    if let _ = FBSDKAccessToken.current()
    {
        fetchUserProfile()
    }

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

}


func fetchUserProfile()
{
    let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields":"id, email, name, picture.width(200).height(200)"])

    graphRequest.start(completionHandler: { (connection, result, error) -> Void in

        if ((error) != nil)
        {
            print("Error took place: \(error)")
        }
        else
        {
            print("Print entire fetched result: \(result)")

            let fbData:[String:AnyObject] = result as! [String : AnyObject]

            let userName : NSString? = fbData["name"]! as? NSString
            let facebookID : NSString? = fbData["id"]! as? NSString

            if let imageURL = ((fbData["picture"] as? [String: Any])?["data"] as? [String: Any])?["url"] as? String {
                //Download image from imageURL
            }

        }
    })
}

我今天的问题是对应用的mongo连接进行故障排除。 nc显示路径清晰,但telnet与你报告的问题相同。我最终安装了mongo客户端并检查了它,我可以正常连接。

如果您需要从ECS容器内部通过telnet实际运行命令,可能尝试安装不同的telnet工具并避免使用内置的busybox。