我正在尝试在MAC OSX上运行的NodeJS应用程序中执行以下操作:(Docker REST API' s用于与docker交互。 API参考:https://docs.docker.com/engine/reference/api/docker_remote_api_v1.23/)
创建mysql docker容器,将其端口3306映射到其中一个主机端口。这是docker容器配置POST正文:
{
'Env': ['MYSQL_ROOT_PASSWORD=root'],
'Image': 'test-mysql',
'ExposedPorts': {
'3306/tcp': {}
},
'HostConfig': {
'PortBindings': { '3306/tcp': [{}]}
}
启动这个新创建的mysql docker容器。
使用以下mysql npm模块https://www.npmjs.com/package/mysql创建一个mysql连接。 连接配置是:
{
host: dockerHostIp, // 192.168.99.100 -- docker host IP
port: portMappingFromStep3, //32789
user: mySQLUser,
password: mySQLUserPassword,
database: 'mysql'
}
在设置mysql连接时,按顺序运行所有这一步会引发错误。它产生以下输出:
{
[Error: connect ECONNREFUSED 192.168.99.100:32789]
code: 'ECONNREFUSED',
errno: 'ECONNREFUSED',
syscall: 'connect',
address: '192.168.99.100',
port: 32800,
fatal: true
}
但是,如果我在建立mysql连接之前提供大约7-8秒的超时,则连接成功建立。
不确定,这里发生了什么。我无法理解,为什么没有超时mysql连接失败。我认为这与端口映射有关。端口映射需要一些时间来设置并提供大约7秒的超时,这掩盖了映射时间。
我正在尝试建立一个端到端测试环境,其中多个mysql容器将并行运行。连接设置的等待时间为7-8秒是一个很大的开销。
解开这个谜团的任何帮助都会非常有帮助。 感谢