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

Leo*_*eel 2 docker dockerfile docker-compose

我正在尝试 dockerize 一个 Python 应用程序,为此我一直在关注本教程。本教程从 2015 年 4 月开始,仍然使用 Docker Machine,从这个答案来看,不再需要在 Windows 上本地运行 Docker 容器。

我之前在 Docker Machine 上使用过它,并且能够看到 Web 应用程序并与之交互。但是现在我正在尝试在没有 Docker Machine 的情况下使用 Docker 版本 17.06.0-ce,在 Windows 10 上构建 02c1d87。

这是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"
Run Code Online (Sandbox Code Playgroud)

我启动了容器:

$ 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
Run Code Online (Sandbox Code Playgroud)

然后,当我运行时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
Run Code Online (Sandbox Code Playgroud)

(此时,http://localhost:8000/在 Chrome 中导航到已经产生了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
Run Code Online (Sandbox Code Playgroud)

现在,当我运行时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
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能让它工作,以便我可以在web本地访问容器中的 Web 应用程序?

Car*_*rez 5

只是改变:

expose:
  - "8000"
Run Code Online (Sandbox Code Playgroud)

经过

ports:
  - "8000:8000"
Run Code Online (Sandbox Code Playgroud)

顺便说一句http://localhost:80不工作?

问候


Raf*_*sin 1

8000Web在容器内部公开端口。但该端口未映射到您的主机端口。

我认为问题出在你的指挥上。选项是-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
Run Code Online (Sandbox Code Playgroud)