首页 > 解决方案 > 无法在网络外访问 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

标签: pythondockerflaskgunicorn

解决方案


推荐阅读