【问题标题】:Specifying ports both for the docker and compose file为 docker 和 compose 文件指定端口
【发布时间】:2019-05-22 10:34:49
【问题描述】:

我已经构建了一个 Docker compose 文件来在它们自己的容器中运行数据库和一个 nodejs 微服务。

如果我没有指定 EXPOSE 端口,数据库似乎会停止工作,即使我已经在撰写文件中指定了它们。我们必须在两个地方都指定端口吗?

数据库/Dockerfile

FROM mysql

ENV MYSQL_DATABASE=test
ENV MYSQL_ROOT_PASSWORD=password

EXPOSE 6603:3306

COPY ./schema.sql /docker-entrypoint-initdb.d/

docker-compose.yml

version: '3'

services:
  database:
    build:
      ./database
    ports:
      - "6603:3306"
    image: "test-mysql"
    container_name: "test-mysql"

  web:
    build:
      ./service
    ports:
      - "8080:8080"
    depends_on:
      - database
    image: "test-nodejs"
    container_name: "test-nodejs"
    restart: on-failure

我是否必须在 Database/Dockerfiledocker-compose.yml 文件中指定端口 6603:3306

【问题讨论】:

标签: docker docker-compose


【解决方案1】:

在现代 Docker 上,EXPOSE 语句几乎是纯粹的文档。一旦端口在 Dockerfile 中公开,您也无法取消公开端口,并且标准的 mysql 映像已经 EXPOSE 3306,因此您不需要在自己的 Dockerfile 中添加 EXPOSE 行。

(在任何情况下,Dockerfile 都不能指定它想要使用的特定主机端口,只能指定一个应该可见的容器端端口。)

【讨论】:

  • 谢谢,这很有帮助,我还有另一个问题,我应该在我的 Web 应用程序 (nodejs) 的数据库主机中指定什么,host: "database"host: "127.0.0.1" 它们实际上都没有工作.
【解决方案2】:

EXPOSE 3306 - 在 dockerfile 中告诉容器 DB 在该端口上运行。

端口: - “6603:3306”

这很完美,它告诉外部容器您可以使用 6603 端口访问数据库。

【讨论】:

  • 问题是为什么要在两个文件中指定端口,一个文件还不够吗?
  • 你必须告诉你的应用程序在容器内运行的哪个端口,所以在 Docker 中的第一次 EXPOSE 是强制性的。在 compose 中,您可能希望将不同的端口缩放或映射到该 msql 容器。所以 compose 中的端口映射。
  • Dockerfile 是命令形式的运行时应用程序蓝本。 Compose 是运行和管理容器。所以,两个不同的实体,因此在两个文件中都需要
【解决方案3】:

是的,必须在文件中指定端口,如果没有它,将无法公开容器端口,而在 docker compose 中,如果您不指定端口,它将无法建立连接。

但是在 docker 文件中你可以这样做

EXPOSE 3360

【讨论】:

  • 我的问题是关于在两个文件中指定端口?为什么不能是一个?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
  • 1970-01-01
  • 1970-01-01
  • 2022-11-05
  • 2019-10-24
相关资源
最近更新 更多