Docker容器无法通过端口连接到主机系统的原因是什么?
具体来说,我正在尝试连接到Docker主机上运行的MySQL服务器(Docker桥上的172.17.0.1
)。但是,由于某种原因,端口3306
始终关闭。
重现的步骤非常简单:
0.0.0.0
bind-address=0.0.0.0
中的~/.my.cnf
运行
$ docker run -it alpine sh
# apk add --update nmap
# nmap -p 3306 172.17.0.1
就是这样。无论我做什么,它总会显示
PORT STATE SERVICE
3306/tcp closed mysql
我也尝试过使用ubuntu映像,Windows主机和其他端口。
如果可能的话,我想避免使用--net=host
,只是为了正确使用集装箱化。
答案 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主机上检查route
或ifconfig
,并通过环境变量传递此IP。
现在我正在转换到使用ipconfig
并将所有必需的服务放入容器中,因此主机系统不需要参与其中,我可以简单地依赖Docker的DNS。这更令人满意。