docker 新手求指导,应用 docker 化,但是数据库未 docker 化,容易出现应用和数据库连接的问题。

2019-04-01 15:41:03 +08:00
 autotesting

服务实现方式:

服务使用 flask + postgresql + gunicorn + supervisor + nginx 实现

用 docker 部署时, 运行服务后,访问 api 时候,

报错日志:

File "/usr/local/lib/python2.7/site-packages/sqlalchemy/sql/elements.py", line 287, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1107, in _execute_clauseelement
    distilled_params,
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1248, in _execute_context
    e, statement, parameters, cursor, context
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1466, in _handle_dbapi_exception
    util.raise_from_cause(sqlalchemy_exception, exc_info)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/util/compat.py", line 383, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1244, in _execute_context
    cursor, statement, parameters, context
  File "/usr/local/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 552, in do_execute
    cursor.execute(statement, parameters)
OperationalError: (psycopg2.OperationalError) SSL SYSCALL error: EOF detected

我已经搜索了报错OperationalError: (psycopg2.OperationalError) SSL SYSCALL error: EOF detected,但是没找到有效的解决办法。

不知道有没有同学遇到过类似问题,可否分享一下解决思路?

5097 次点击
所在节点    Docker
14 条回复
fishcg
2019-04-02 00:40:01 +08:00
OperationalError 异常一般是数据库连接意外断开、 数据库名未找到、事务处理失败、内存分配错误等等,是不是连接池大小的问题
autotesting
2019-04-02 09:25:03 +08:00
@fishcg 我没有单独指定连接池,我用的默认值,我看默认值 SQLALCHEMY_POOL_SIZE=5,按道理应该不是,我如果不用 docker 启动服务,直接命令行 gunicorn 启动服务,没有出现类似的数据库连接问题。
learningman
2019-04-02 12:24:14 +08:00
可以用 host 的网络模式试试
autotesting
2019-04-03 09:14:40 +08:00
@learningman 你好,我试了一下启动命令,我 docker 刚开始接触,我执行 docker run -t -i -d --net=host -p 80:80 --name web_flask1 --mount type=bind,source=/app/,target=/app/ app:0.0.3,命令行提示-p 参数就无效了,那么我怎么实现指定端口去访问容器中服务?
julyclyde
2019-04-03 14:29:07 +08:00
@autotesting 容器技术解决了其他社会制度不存在的问题
autotesting
2019-04-03 15:23:29 +08:00
@julyclyde 那我遇到的问题有解决思路吗?😆
julyclyde
2019-04-03 19:10:52 +08:00
你这个看着像网络问题。不确定
fohnwind
2019-04-05 18:05:43 +08:00
@autotesting 已经指定了网络是 host 模式,-p 参数就无效了。-p 的意思是 bridge 方式启动
autotesting
2019-04-05 20:23:31 +08:00
@fohnwind 恩我了解,那这个时候该怎么用呢,比如我在 docker 中启动服务的时候暴露了 nginx 的 80 端口,那么我在宿主机该访问什么 ip:port 去访问 docker 中的服务呢?
learningman
2019-04-06 13:08:16 +08:00
@autotesting host 模式下内部端口就是外部端口,你在外部访问的就是你 nginx listen 的端口
fire9
2019-04-06 16:21:55 +08:00
容器之间可以用 link 啊. 感觉开发环境用 docker-compose 挺方便的.
autotesting
2019-04-15 22:22:31 +08:00
@learningman 我是在 mac 下启动的 docker 命令,然后比如 docker run --network host -d 4c81e42e4e0d,我想开启 80 端口,就是无效的
petercui
2019-04-16 11:15:15 +08:00
@autotesting macOS 不支持 host 模式,不用试了。
autotesting
2019-04-16 14:12:28 +08:00
@petercui 悲剧了,我现在想在 macOS 上启动的 nginx 服务内限制 ip 访问,发现 nginx 内无法获取真实 ip,所以无法配置限制。都蛋疼了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/550868

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX