python - 无法在网络外访问 dockerized Flask 应用程序
问题描述
所以我有一个在 docker 容器内运行的 Flask 应用程序,我可以在本地机器上的容器外访问它而没有任何问题。它正在0.0.0.0:5000
容器内部监听,我在浏览器中使用 localhost:5000 访问它。但是,现在我想在我的机器外访问该应用程序,但它不起作用。这就是我尝试访问该应用程序的方式:
Machine 1 --> Machine2[Docker container]
因此,当我从 Machine2 尝试时它可以工作,但是当我从 Machine 1(Machine2IP:5000) 尝试时,Flask(Gunicorn) 正在记录:
[8] [DEBUG] Ignoring connection reset
它正在收到请求,这很好,但我不确定是什么问题......这是我用来启动容器的 docker-compose 配置
version: '3'
services:
docker-viewer-app:
restart: always
image: registry/myimage
ports:
- "5000:5000"
docker-compose ps 输出:
docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------------------------
docker_my-app_1 gunicorn --config gunicorn ... Up 0.0.0.0:5000->5000/tcp
编辑:在这里提供整个 docker 容器输出,最后 3 行实际上是我 3 次尝试访问该应用程序。
my-app_1 | [2020-02-12 12:25:59 +0000] [1] [DEBUG] Current configuration:
my-app_1 | config: gunicorn.py
my-app_1 | bind: ['0.0.0.0:5000']
my-app_1 | backlog: 2048
my-app_1 | workers: 1
my-app_1 | worker_class: sync
my-app_1 | threads: 1
my-app_1 | worker_connections: 1000
my-app_1 | max_requests: 0
my-app_1 | max_requests_jitter: 0
my-app_1 | timeout: 30
my-app_1 | graceful_timeout: 30
my-app_1 | keepalive: 2
my-app_1 | limit_request_line: 4094
my-app_1 | limit_request_fields: 100
my-app_1 | limit_request_field_size: 8190
my-app_1 | reload: False
my-app_1 | reload_engine: auto
my-app_1 | reload_extra_files: []
my-app_1 | spew: False
my-app_1 | check_config: False
my-app_1 | preload_app: False
my-app_1 | sendfile: None
my-app_1 | reuse_port: False
my-app_1 | chdir: /
my-app_1 | daemon: False
my-app_1 | raw_env: []
my-app_1 | pidfile: None
my-app_1 | worker_tmp_dir: None
my-app_1 | user: 0
my-app_1 | group: 0
my-app_1 | umask: 0
my-app_1 | initgroups: False
my-app_1 | tmp_upload_dir: None
my-app_1 | secure_scheme_headers: {'X-FORWARDED-PROTOCOL': 'ssl', 'X-FORWARDED-PROTO': 'https', 'X-FORWARDED-SSL': 'on'}
my-app_1 | forwarded_allow_ips: ['127.0.0.1']
my-app_1 | accesslog: -
my-app_1 | disable_redirect_access_to_syslog: False
my-app_1 | access_log_format: %(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"
my-app_1 | errorlog: -
my-app_1 | loglevel: debug
my-app_1 | capture_output: True
my-app_1 | logger_class: gunicorn.glogging.Logger
my-app_1 | logconfig: None
my-app_1 | logconfig_dict: {}
my-app_1 | syslog_addr: udp://localhost:514
my-app_1 | syslog: False
my-app_1 | syslog_prefix: None
my-app_1 | syslog_facility: user
my-app_1 | enable_stdio_inheritance: True
my-app_1 | statsd_host: None
my-app_1 | dogstatsd_tags:
my-app_1 | statsd_prefix:
my-app_1 | proc_name: None
my-app_1 | default_proc_name: run:app
my-app_1 | pythonpath: None
my-app_1 | paste: None
my-app_1 | on_starting: <function OnStarting.on_starting at 0x7f6b716c1510>
my-app_1 | on_reload: <function OnReload.on_reload at 0x7f6b716c1620>
my-app_1 | when_ready: <function WhenReady.when_ready at 0x7f6b716c1730>
my-app_1 | pre_fork: <function Prefork.pre_fork at 0x7f6b716c1840>
my-app_1 | post_fork: <function Postfork.post_fork at 0x7f6b716c1950>
my-app_1 | post_worker_init: <function PostWorkerInit.post_worker_init at 0x7f6b716c1a60>
my-app_1 | worker_int: <function WorkerInt.worker_int at 0x7f6b716c1b70>
my-app_1 | worker_abort: <function WorkerAbort.worker_abort at 0x7f6b716c1c80>
my-app_1 | pre_exec: <function PreExec.pre_exec at 0x7f6b716c1d90>
my-app_1 | pre_request: <function PreRequest.pre_request at 0x7f6b716c1ea0>
my-app_1 | post_request: <function PostRequest.post_request at 0x7f6b716c1f28>
my-app_1 | child_exit: <function ChildExit.child_exit at 0x7f6b716dc0d0>
my-app_1 | worker_exit: <function WorkerExit.worker_exit at 0x7f6b716dc1e0>
my-app_1 | nworkers_changed: <function NumWorkersChanged.nworkers_changed at 0x7f6b716dc2f0>
my-app_1 | on_exit: <function OnExit.on_exit at 0x7f6b716dc400>
my-app_1 | proxy_protocol: False
my-app_1 | proxy_allow_ips: ['127.0.0.1']
my-app_1 | keyfile: None
my-app_1 | certfile: None
my-app_1 | ssl_version: 2
my-app_1 | cert_reqs: 0
my-app_1 | ca_certs: None
my-app_1 | suppress_ragged_eofs: True
my-app_1 | do_handshake_on_connect: False
my-app_1 | ciphers: None
my-app_1 | raw_paste_global_conf: []
my-app_1 | strip_header_spaces: False
my-app_1 | [2020-02-12 12:25:59 +0000] [1] [INFO] Starting gunicorn 20.0.4
my-app_1 | [2020-02-12 12:25:59 +0000] [1] [DEBUG] Arbiter booted
my-app_1 | [2020-02-12 12:25:59 +0000] [1] [INFO] Listening at: http://0.0.0.0:5000 (1)
my-app_1 | [2020-02-12 12:25:59 +0000] [1] [INFO] Using worker: sync
my-app_1 | [2020-02-12 12:25:59 +0000] [8] [INFO] Booting worker with pid: 8
my-app_1 | [2020-02-12 12:25:59 +0000] [1] [DEBUG] 1 workers
my-app_1 | [2020-02-12 12:26:07 +0000] [8] [DEBUG] Ignoring connection reset
my-app_1 | [2020-02-12 12:26:07 +0000] [8] [DEBUG] Ignoring connection reset
my-app_1 | [2020-02-12 12:26:12 +0000] [8] [DEBUG] Ignoring connection reset
解决方案
推荐阅读
- javascript - 如何(sinon)存根外部模块功能?
- python - 从 CSV 中的 JSON 中提取数据
- asp.net - 对 dotnet 代码的 LINQ 查询以及 concat 将如何在此处工作
- android - 运行“npm run android”时无法从“11.0.1”确定 java 版本
- javascript - 灯箱内的 AMP 轮播未打开录制/点击的图像
- ruby - 如何从 Ruby/Rake 获取调用者路径?
- c# - 删除 asp.net 文本标签中生成的 Span 标签
- php - 如何为 wp 中的某些用户隐藏特定页面(来自 wp-admin)?
- class - 关于项目管理中关系类型的UML类图
- c - 如何在与 c 的 http 连接中获得特殊的内容类型?