【问题标题】:Docker compose service does not expose portsDocker compose 服务不公开端口
【发布时间】:2017-10-15 11:44:21
【问题描述】:

所以我正在构建一个 Elixir/Phoenix 应用程序,并且我有以下 docker-compose 服务:

dev:
    extends:
      service: common
    environment:
      POSTGRES_HOST: "postgres.dev"
      MIX_ENV: dev
    ports:
      - "4000:4000"
    depends_on:
      - postgres
    command: >
      bash -c '
      cd $$APP_HOME \
      && mix ecto.create \
      && mix ecto.migrate \
      && iex -S mix phx.server'

这有效地在0.0.0.0:4000上运行应用程序:

Erlang/OTP 20 [erts-9.1.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]

[info] Running MyApp.Endpoint with Cowboy using http://0.0.0.0:4000

docker ps检查端口没有暴露:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
7a1d80cf0511        app_dev         "bash -c ' cd $APP..."   4 minutes ago       Up 4 minutes                                 app_dev_run_2
ef7bed51cf24        postgres:10.0       "docker-entrypoint..."   16 minutes ago      Up 16 minutes       0.0.0.0:5432->5432/tcp   app_postgres_1

虽然 Postgres 服务具有公开的端口,但我可以通过 GUI 有效地连接到它:

postgres:
    image: postgres:10.0
    ports:
      - "5432:5432"
    networks:
      default:
        aliases:
          - postgres.dev
    restart: always

我不明白为什么dev 服务不公开端口,因为它们是完全相同的命令/定义,但使用 4000 而不是 5432。

我已尝试停止、删除所有容器、网络和映像,但这仍然存在。

我的 Dockerfile 中没有任何 EXPOSE 命令,我正在使用 docker-compose run dev 运行服务。

有什么帮助吗?

【问题讨论】:

  • 您刚刚说过,您没有暴露任何端口,因此,您的容器不会与外界通信。尝试在 dockerfile 中公开一个端口,然后在 docker-compose 文件中使用它,看看会发生什么
  • 我以为 EXPOSE 只是为了打开容器之间的端口?根据文档: EXPOSE 指令实际上并未发布端口。它充当构建映像的人和运行容器的人之间的一种文档类型,关于打算发布哪些端口。要在运行容器时实际发布端口,请使用 docker run 上的 -p 标志发布和映射一个或多个端口,或使用 -P 标志发布所有公开的端口并将它们映射到高阶端口。
  • 公开一个端口意味着在你的主机上打开那个端口,所以例如我有一个 NGINX 容器监听端口 443,因此在我的 docker 文件中我会有类似 EXPOSE 443 的东西,然后当我运行我的容器,我将它作为 docker run -p 1234:443 sergiu/nginx 运行,它允许我连接到容器外的 1234 和容器内的 443
  • 就像在你的例子中 postgres 暴露了 5432 :)
  • 感谢您的评论。 EXPOSE 4000 导致 CONTAINER ID IMAGE COMMAND STATUS PORTS NAMES 5806f4c39387 app_dev "bash -c ' cd $APP..." 大约一分钟前 Up 大约一分钟 4000/tcp app_dev_run_1 但是端口仍然没有暴露给主机。要实际公开它(即在docker ps 中获取0.0.0.0:4000->4000/tcp),我可以运行docker run -p 4000:4000 app_dev,但我想通过docker-compose 服务获得相同的行为

标签: docker elixir docker-compose phoenix-framework docker-networking


【解决方案1】:

所以我终于解决了这个问题,我只需要在docker run 中传递--service-ports

https://docs.docker.com/compose/reference/run/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多