我希望标题足够具有描述性。我正在尝试在 docker 中执行我的节点应用程序(使用 mongo 和 mysql)。我在用docker-compose
启动应用程序并docker-compose.yml
文件如下:
version: "3.3"
services:
app:
container_name: app
restart: always
build: .
volumes:
- ./:/app
ports:
- "3000:3000"
links:
- mongo
- mysql
mongo:
container_name: mongo
image: mongo
ports:
- "27017:27017"
mysql:
container_name: mysql
image: mysql
ports:
- "3306:3306"
每当我尝试使用以下命令开始此操作时docker-compose up
我收到以下错误:
ERROR: for mysql Cannot start service mysql: driver failed programming external connectivity on endpoint mysql (785b03daaa662bb3c344025f89fd28f49eabb43104b1c9a16ab425ab5120309f): Error starting userland proxy: listen tcp 0.0.0.0:3306: bind: address already in use
ERROR: for mysql Cannot start service mysql: driver failed programming external connectivity on endpoint mysql (785b03daaa662bb3c344025f89fd28f49eabb43104b1c9a16ab425ab5120309f): Error starting userland proxy: listen tcp 0.0.0.0:3306: bind: address already in use
ERROR: Encountered errors while bringing up the project.
我做了一些研究,看来gitlab-runner
正在使用mysql服务。我的理解是,如果我通过 docker 容器运行此设置,它们将与主机系统隔离,因此不会出现任何端口冲突。我公开的唯一端口是我的端口Dockerfile
- 就我而言 3000。我是否遗漏了一些东西?docker-compose.yml
?还有什么可能是错误的?
停止绑定到本地端口并让docker-compose
为您选择一个临时端口。就您而言,您的应用程序无需任何帮助即可访问默认端口。如果您正在遵循12 因素应用程序 https://12factor.net方法,然后使用环境变量,如以下代码片段所示。
version: "3.3"
services:
app:
restart: always
build: .
volumes:
- ./:/app
ports:
- 3000 # will be bound to an ephemeral port
environment:
MONGODB_URL: mongodb://mongo/db # can reach port 27017 without help
mongo:
image: mongo
ports:
- 27017
这是通过环境变量或命令行标志来配置应用程序的主要原因。
您可以使用docker-compose 端口 https://docs.docker.com/compose/reference/port/如果您需要从主机访问 docker 应用程序,则获取临时端口。我通常使用如下所示的 shell 函数:
get_exposed_port() { # SERVICE PORT
docker-compose port $1 $2 | cut -d: -f2
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)