为什么我无法在Windows 10上连接本地docker-compose容器?

7
我正在尝试将一个Python应用程序docker化,我一直在遵循这篇教程:这里。该教程发布于2015年4月,仍然使用Docker Machine,但根据这个答案,在Windows本地运行Docker容器时不再需要它。
我之前已经使用Docker Machine使其工作,并能够查看Web应用程序并与其交互。但现在我正在尝试在Windows 10上使用Docker版本17.06.0-ce,构建02c1d87,而不使用Docker Machine来实现这一目标。
下面是docker-compose.yml
web:
  restart: always
  build: ./web
  expose:
    - "8000"
  links:
    - postgres:postgres
  volumes:
    - /usr/src/app/static
  env_file: .env
  command: /usr/local/bin/gunicorn -w 2 -b :8000 app:app

nginx:
  restart: always
  build: ./nginx/
  ports:
    - "80:80"
  volumes:
    - /www/static
  volumes_from:
    - web
  links:
    - web:web

data:
  image: postgres:latest
  volumes:
    - /var/lib/postgresql
  command: "true"

postgres:
  restart: always
  image: postgres:latest
  volumes_from:
    - data
  ports:
    - "5432:5432"

我启动了容器:

$ docker-compose up -d
Creating polly_data_1 ...
Creating polly_data_1 ... done
Creating polly_postgres_1 ...
Creating polly_postgres_1 ... done
Creating polly_web_1 ...
Creating polly_web_1 ... done
Creating polly_nginx_1 ...
Creating polly_nginx_1 ... done

然后,当我运行 docker ps 命令时,它会显示以下三个正在运行的容器:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
9b2c1048f3a5        polly_nginx         "/usr/sbin/nginx"        4 seconds ago       Up 3 seconds        0.0.0.0:80->80/tcp       polly_nginx_1
d561ac5b901a        polly_web           "/usr/local/bin/gu..."   5 seconds ago       Up 4 seconds        8000/tcp                 polly_web_1
ecb029d6ec3a        postgres:latest     "docker-entrypoint..."   7 seconds ago       Up 5 seconds        0.0.0.0:5432->5432/tcp   polly_postgres_1

此时,在Chrome中导航到http:// localhost:8000 / 已经出现ERR_CONNECTION_REFUSED

然后,按照教程运行脚本以设置数据库(因为我在Windows 10上使用Git Bash,所以有额外的 // ):

$ docker-compose run web ///usr/local/bin/python create_db.py
Starting polly_data_1 ...
Starting polly_data_1 ... done
Starting polly_postgres_1 ... done

现在当我运行docker ps命令时,会显示以下四个正在运行的容器:
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                  PORTS                    NAMES
a129c12f5982        polly_web           "//usr/local/bin/p..."   5 seconds ago       Up Less than a second   8000/tcp                 polly_web_run_1
9b2c1048f3a5        polly_nginx         "/usr/sbin/nginx"        16 seconds ago      Up 15 seconds           0.0.0.0:80->80/tcp       polly_nginx_1
d561ac5b901a        polly_web           "/usr/local/bin/gu..."   17 seconds ago      Up 16 seconds           8000/tcp                 polly_web_1
ecb029d6ec3a        postgres:latest     "docker-entrypoint..."   19 seconds ago      Up 17 seconds           0.0.0.0:5432->5432/tcp   polly_postgres_1

而且localhost:8000仍然拒绝连接。Web容器公开了端口8000,所以我不明白为什么我无法连接到它。

我该如何使其工作,以便我可以在本地访问web容器中的Web应用程序?


就你的 docker ps 显示,没有任何容器正在暴露端口8000 ... :/ - Rafaf Tahsin
@200OK 但是 webexpose: - "8000",并且它在 Docker Machine 中运行良好。我对 Docker 还很新,所以我不太确定这里出了什么问题。 - Leon Overweel
3个回答

8

只需更改:

expose:
  - "8000"

通过

ports:
  - "8000:8000"

顺便问一下,http://localhost:80不能用了吗?

祝好


我有同样的问题,ports 已经按照要求设置了,但是仍然无法通过 localhost:8000 访问运行在容器中的网站,我必须使用 docker container ip 来访问页面。 - Sachith Muhandiram
运行 docker ps 命令,查看容器是否正在暴露端口。 - Carlos Rafael Ramirez

2
原来,正如Carlos和200_OK在他们的回答和评论中所建议的那样,它是按预期工作的——它正在端口80上运行,而不是8000

1
在容器内部,Web使用端口8000。但是该端口没有映射到主机端口上。
我认为问题出在你的命令中。选项应该是-p而不是-b
web:
  restart: always
  build: ./web
  expose:
    - "8000"
  links:
    - postgres:postgres
  volumes:
    - /usr/src/app/static
  env_file: .env
  command: /usr/local/bin/gunicorn -w 2 -p :8000 app:app

1
但是到目前为止,我猜你的解决方案并不打算从主机内部映射8000端口。你应该从http//:localhost获取你想要的东西。 - Rafaf Tahsin
那并不是真正的解决方案,但像@200_OK建议的那样,这是一个端口问题。这是一个gunicorn命令,它绑定了像docker一样的端口,-b应该是--bind。将端口从5000更改为80就解决了问题。看起来docker-compose中的ports:-5000:8080和docker中的-p 5000:8080不同。感谢您的帮助! - Mr Bonjour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接