Я создал файл компоновки 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?
только EXPOSE 3306
- В файле докеров, который сообщает, что внутри контейнера БД работает на этом порту.
ports: - "6603:3306"
Это идеально, что говорит внешнему контейнеру, что вы можете получить доступ к БД с портом 6603.
вопрос зачем указывать порты в обоих файлах, разве одного файла недостаточно?
Вы должны указать, на каком порту ваше приложение работает внутри контейнера, поэтому 1st EXPOSE в Docker является обязательным. При составлении вы можете захотеть масштабировать или сопоставить другой порт с этим контейнером msql. Итак, сопоставление портов в compose.
Dockerfile — это схема приложения времени выполнения в виде команд. Compose предназначен для запуска контейнеров и управления ими. Итак, 2 разных объекта и, следовательно, нужны оба файла
В современном Docker операторы EXPOSE
почти полностью являются документацией. Вы также не можете отменить доступ к порту после того, как он был открыт в Dockerfile, а стандартный образ mysql
уже будет EXPOSE 3306
, поэтому вам не нужна строка EXPOSE
в вашем собственном файле Dockerfile.
(В любом случае Dockerfile никогда не может указывать конкретный порт хоста, который он хочет использовать, только порт на стороне контейнера, который должен быть видимым.)
спасибо, это полезно, у меня есть еще одна проблема, что я должен указать в хосте базы данных в моем веб-приложении (nodejs), host: "database"
или host: "127.0.0.1"
на самом деле ни один из них не работает.
Да, необходимо указать порты в файле, без него нельзя будет выставить порт контейнера, а в docker compose, если вы не укажете порт, он не сможет установить соединение.
Но в файле докера вы можете сделать
EXPOSE 3360
мой вопрос касается указания портов в обоих файлах? почему не может быть один?
Проверить В чем разница между «разоблачением» и «публикацией» в Docker?