Docker:如何打开到主机的端口?

时间:2016-12-05 21:08:05

标签: docker

Docker容器无法通过端口连接到主机系统的原因是什么?

具体来说,我正在尝试连接到Docker主机上运行的MySQL服务器(Docker桥上的172.17.0.1)。但是,由于某种原因,端口3306始终关闭。

重现的步骤非常简单:

  1. 配置MySQL(或任何服务)以收听0.0.0.0 bind-address=0.0.0.0中的~/.my.cnf
  2. 运行

    $ docker run -it alpine sh
    # apk add --update nmap
    # nmap -p 3306 172.17.0.1
    
  3. 就是这样。无论我做什么,它总会显示

    PORT     STATE  SERVICE
    3306/tcp closed mysql
    

    我也尝试过使用ubuntu映像,Windows主机和其他端口。

    如果可能的话,我想避免使用--net=host,只是为了正确使用集装箱化。

1 个答案:

答案 0 :(得分:0)

事实证明IP不正确。什么都没有阻塞端口,服务也运行正常。 package Demo import interop.wrappers.EditableText.EditableText import interop.wrappers.react_sortable_hoc.SortableContainer.Props import japgolly.scalajs.react.ReactComponentC.ReqProps import japgolly.scalajs.react._ import japgolly.scalajs.react.vdom.prefix_<^._ import interop.wrappers.react_sortable_hoc.{SortableContainer, SortableElement} object EditableSortableListDemo { trait Action type Handler=Action=>Unit object CompWithState { case class UpdateElement(s:String) extends Action class Backend($: BackendScope[Unit, String],r:Handler) { def handler(s: String): Unit = { println("handler:"+s) $.setState(s) //USAGE OF Handler <<<<<======================================= } def render(s:String) = { println("state:"+s) <.div(<.span(s),EditableText(s, handler _)()) } } val Component = (f:Handler)=>(s:String)=> ReactComponentB[Unit]("EditableText with state").initialState(s).backend(new Backend(_,f)) .renderBackend.build } // Equivalent of ({value}) => <li>{value}</li> in original demo val itemView: Handler=>ReqProps[String, Unit, Unit, TopNode] = (f:Handler)=> ReactComponentB[String]("liView") .render(d => { <.div( <.span(s"uhh ${d.props}"), CompWithState.Component(f)("vazzeg:"+d.props)() ) }) .build // As in original demo val sortableItem = (f:Handler)=>SortableElement.wrap(itemView(f)) val listView = (f:Handler)=>ReactComponentB[List[String]]("listView") .render(d => { <.div( d.props.zipWithIndex.map { case (value, index) => sortableItem(f)(SortableElement.Props(index = index))(value) } ) }) .build // As in original demo val sortableList: (Handler) => (Props) => (List[String]) => ReactComponentU_ = (f:Handler)=>SortableContainer.wrap(listView(f)) // As in original SortableComponent class Backend(scope: BackendScope[Unit, List[String]]) { def render(props: Unit, items: List[String]) = { def handler = ??? // TOP LEVEL , INJECTION POINT<<<<<<======================================== sortableList(handler)( SortableContainer.Props( onSortEnd = p => scope.modState( l => p.updatedList(l) ), useDragHandle = false, helperClass = "react-sortable-handler" ) )(items) } } val defaultItems = Range(0, 10).map("Item " + _).toList val c = ReactComponentB[Unit]("SortableContainerDemo") .initialState(defaultItems) .backend(new Backend(_)) .render(s => s.backend.render(s.props, s.state)) .build } ping将IP显示为在线,但出于某种原因,它不是主机系统。

获得的经验教训:不要依赖容器中的nmap来返回正确的主机地址。而是分别在Linux或Windows主机上检查routeifconfig,并通过环境变量传递此IP。

现在我正在转换到使用ipconfig并将所有必需的服务放入容器中,因此主机系统不需要参与其中,我可以简单地依赖Docker的DNS。这更令人满意。