我使用docker-compose来设置带有一些数据库和播种器的API。直到几天前,一切都像魅力一样运作,但是现在我再也无法播种数据库了。
这是我的docker-compose.yml文件的示例:
version: '3'
services:
api:
image: <API image>
ports: {API_PORT}:5000 //Flask's default port
depends_on:
- db
db:
image: <DB image>
ports: {DB_PORT}:27017 //MongoDB Default port
db-seed:
image: <seeder image>
// pretty classic docker-compose file, nothing fancy
播种者使用docker网络访问API容器(http:// api:80 /)并对其进行播种。但是,绑定到API容器时,播种者的脚本(用Python编写)现在返回错误:
$> docker-compose up db-seed
<LOT OF ERRORS>...
requests.exceptions.ConnectionError: HTTPConnectionPool(host='api', port=80): Max retries exceeded with url: /ping (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f65e78a4310>: Failed to establish a new connection: [Errno 111] Connection refused'))
似乎种子容器无法访问数据库容器。造成此错误的原因是什么?我该如何解决?
这是我的网络的docker网络检查:
[{ "Name": "staging-sensei-api_default", "Id": "b5bd162d27f9a1addaacf1b0f2c09ad799d3ae195cc6e8c9cbb54bfffc27651c", "Created": "2019-07-22T14:18:05.080114521Z", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "172.26.0.0/16", "Gateway": "172.26.0.1" } ] }, "Internal": false, "Attachable": true, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "08672fe92d72b111f1a006a2ff20e885ef395a420525953b696672753cb73ff7": {
"Name": "com.frcyber.sensei.elasticsearch",
"EndpointID": "7ba9a1af1af5635d22c9cbd38fad8be222f351e5c0013f0280e2879cdd6e9e40",
"MacAddress": "02:42:ac:1a:00:03",
"IPv4Address": "172.26.0.3/16",
"IPv6Address": ""
},
"364f873d069e4ecd371cdd99ca952d1469ee875aacbf9ee2227bbf25ab65d841": {
"Name": "com.frcyber.sensei.api",
"EndpointID": "e5a3f4cd2099aff2a04efdeb7a5c5d0a8ade4248b76df048f20a8a75bf85ddba",
"MacAddress": "02:42:ac:1a:00:04",
"IPv4Address": "172.26.0.4/16",
"IPv6Address": ""
},
"f4bfaf323a8c8c6300156d3091ec70f091fc3492175bfa00faa1717e4f83d2a2": {
"Name": "com.frcyber.sensei.mongodb",
"EndpointID": "b5df4e0d3721ffe5cd28ce55f642e6a0bc7f5be1a12cc49bb2eb12a58eb82e7a",
"MacAddress": "02:42:ac:1a:00:02",
"IPv4Address": "172.26.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {
"com.docker.compose.network": "default",
"com.docker.compose.project": "staging-sensei-api",
"com.docker.compose.version": "1.24.0"
}
}
]
另外,我发现当API_PORT设置为5000时,它可以工作:
api:
ports: 5000:5000
考虑到它在特定情况下有效,即:
另外,我发现当API_PORT设置为5000时,它可以工作
api: ports: 5000:5000
我建议问题不在于docker方面,而在于您如何设置项目。这个建议是基于我的一个假设:您的db-seeder容器使用in值API_PORT
作为连接到api容器的端口(在您的帖子中没有明确定义,我假设在以下内容中会用到)。
由于您的python错误显示"api"
为主机,因此您尝试连接到DNS,根据您的docker network inspect
输出,DNS等效于IP 172.26.0.4 。在此IP上,无论端口API_PORT
的值如何,容器都在侦听端口5000 (根据docker-compose的定义,因为您始终将主机的API_PORT
端口绑定到容器的5000)。
奇怪的是,您曾说过它曾经起作用过,但事实并非如此,除非您的数字API_PORT
是5000。
如果要在另一个端口的docker网络内部进行连接,则需要在构建或运行时更改容器中的某些内容,而不仅是绑定到主机的端口。
从你的 docker-compose
version: '3'
services:
api:
image: <API image>
ports: "80:${API_PORT:-5000}" //Flask's default port
depends_on:
- db
environment:
- DB_PORT=${DB_PORT:-27017}
- API_PORT=${API_PORT:-5000}
db:
image: mongo:latest
command: --port ${DB_PORT:-27017}
db-seed:
image: <seeder image>
environment:
- API_PORT=${API_PORT:5000}
这不会将您的数据库端口暴露给主机的外部。您需要从外壳环境(或.env文件)中检索API_PORT和DB_PORT值,并按以下方式使用它们:
http(s)://api:$API_PORT
db:$DB_PORT
uwsgi
使用API_PORT启动生产中用于api的cgi服务器(例如),例如在api容器ENTRYPOINT
脚本的末尾:# Some other config / checks / setup at runtime
exec uwsgi --port "$API_PORT" [ OTHER_OPTIONS ... ] path/to/your/application.py
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句