Указание портов как для докера, так и для файла компоновки

Я создал файл компоновки Docker для запуска базы данных и микросервиса nodejs в их собственных контейнерах.

База данных перестает работать, если я не укажу порты EXPOSE, даже если я указал их в файле компоновки. Должны ли мы указывать порты в обоих местах?

база данных/файл Docker

FROM mysql

ENV MYSQL_DATABASE=test
ENV MYSQL_ROOT_PASSWORD=password

EXPOSE 6603:3306

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

докер-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

Нужно ли указывать порты 6603:3306 как в файле База данных/файл Docker, так и в файле докер-compose.yml?

0
1
142
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

только EXPOSE 3306 - В файле докеров, который сообщает, что внутри контейнера БД работает на этом порту.

ports: - "6603:3306"

Это идеально, что говорит внешнему контейнеру, что вы можете получить доступ к БД с портом 6603.

вопрос зачем указывать порты в обоих файлах, разве одного файла недостаточно?

Developer 22.05.2019 12:41

Вы должны указать, на каком порту ваше приложение работает внутри контейнера, поэтому 1st EXPOSE в Docker является обязательным. При составлении вы можете захотеть масштабировать или сопоставить другой порт с этим контейнером msql. Итак, сопоставление портов в compose.

Akshay barahate 22.05.2019 12:44

Dockerfile — это схема приложения времени выполнения в виде команд. Compose предназначен для запуска контейнеров и управления ими. Итак, 2 разных объекта и, следовательно, нужны оба файла

Akshay barahate 22.05.2019 12:47
Ответ принят как подходящий

В современном Docker операторы EXPOSE почти полностью являются документацией. Вы также не можете отменить доступ к порту после того, как он был открыт в Dockerfile, а стандартный образ mysql уже будет EXPOSE 3306, поэтому вам не нужна строка EXPOSE в вашем собственном файле Dockerfile.

(В любом случае Dockerfile никогда не может указывать конкретный порт хоста, который он хочет использовать, только порт на стороне контейнера, который должен быть видимым.)

спасибо, это полезно, у меня есть еще одна проблема, что я должен указать в хосте базы данных в моем веб-приложении (nodejs), host: "database" или host: "127.0.0.1" на самом деле ни один из них не работает.

Developer 22.05.2019 12:49

Да, необходимо указать порты в файле, без него нельзя будет выставить порт контейнера, а в docker compose, если вы не укажете порт, он не сможет установить соединение.

Но в файле докера вы можете сделать

EXPOSE 3360

мой вопрос касается указания портов в обоих файлах? почему не может быть один?

Developer 22.05.2019 12:42

Другие вопросы по теме