为docker和compose文件指定端口

为docker和compose文件指定端口,docker,docker-compose,Docker,Docker Compose,我已经构建了一个Docker compose文件,在它们自己的容器中运行数据库和nodejs微服务 如果我没有指定暴露端口,数据库似乎会停止工作,即使我已经在compose文件中指定了它们。我们必须在这两个地方指定端口吗 数据库/Dockerfile FROM mysql ENV MYSQL_DATABASE=test ENV MYSQL_ROOT_PASSWORD=password EXPOSE 6603:3306 COPY ./schema.sql /docker-entrypoint

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

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

数据库/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

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

在Dockerfile中仅
EXPOSE 3306
,它告诉在该端口上运行的容器内部数据库

端口: -“6603:3306”


这非常完美,它告诉外部容器您可以使用6603端口访问DB。

暴露3306
-在dockerfile中,它告诉内部容器DB在该端口上运行

端口: -“6603:3306”


这非常完美,告诉外部容器您可以使用6603端口访问DB。

在现代Docker上,
EXPOSE
语句几乎完全是文档。一旦端口在Dockerfile中公开,您也不能取消公开,标准的
mysql
映像将已经
expose 3306
,因此您不需要在自己的Dockerfile中使用
expose


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

在现代Docker上,
EXPOSE
语句几乎完全是文档。一旦端口在Dockerfile中公开,您也不能取消公开,标准的
mysql
映像将已经
expose 3306
,因此您不需要在自己的Dockerfile中使用
expose


(在任何情况下,docker文件都不能指定要使用的特定主机端口,只能指定应显示的容器端端口。)

是的,必须在文件中指定端口,否则将无法显示容器端口,在docker compose中,如果不指定端口,则无法建立连接

但在docker文件中,您可以

EXPOSE 3360

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

但在docker文件中,您可以

EXPOSE 3360

问题是为什么要在两个文件中都指定端口,一个文件还不够吗?您必须告诉应用程序在容器中运行的端口,以便第一次在Docker中公开。在compose中,您可能希望将不同的端口缩放或映射到该msql容器。因此,compose.Dockerfile中的端口映射是运行时应用程序bluepriint,形式为命令。Compose用于运行和管理容器。所以,两个不同的实体,因此需要在两个文件中都指定端口问题是,为什么在两个文件中都指定端口,一个文件还不够?您必须告诉您的应用程序在容器中运行的端口,所以必须在Docker中首次公开。在compose中,您可能希望将不同的端口缩放或映射到该msql容器。因此,compose.Dockerfile中的端口映射是运行时应用程序bluepriint,形式为命令。Compose用于运行和管理容器。所以,两个文件中有两个不同的实体,因此需要我的问题是在两个文件中指定端口?为什么不能是一个?我的问题是在两个文件中指定端口?为什么不能成为一个呢?谢谢,这很有帮助,我还有另一个问题,我应该在我的web应用程序(nodejs)的数据库主机中指定什么,
host:“database”
host:“127.0.0.1”
它们都没有实际工作。谢谢,这很有帮助,我还有另一个问题,我应该在我的web应用程序(nodejs)的数据库主机中指定什么,
host:“database”
host:“127.0.0.1”
它们都没有实际工作。