【发布时间】:2021-09-28 09:20:26
【问题描述】:
我创建了一个 docker 文件并使用该文件创建了一个 docker 容器。但是无法从主机访问 docker webapp。 我正在使用 WSL2 来运行 docker。我的 docker 容器在我的 ubuntu 发行版中。当我启动容器时,它说应用程序正在运行。但是当我尝试从我的 windows 机器(主机)的 chrome 访问网络服务器时,它说无法连接。我的端口映射看起来都很好。
这是我的 docker-compose.yml 文件
version: '2'
services:
db:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: dp
MYSQL_USER: app
MYSQL_PASSWORD: appuser
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
ports:
- "3307:3306"
volumes:
- "./db_dump:/docker-entrypoint-initdb.d/:ro"
container_name: mysql_db
app:
build:
context:
./
volumes:
- "./dp:/app"
ports:
- "3000:3000"
depends_on:
- db
links:
- db
environment:
MYSQL_HOST: db
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: dp
MYSQL_USER: app
MYSQL_PASSWORD: appuser
container_name: dp_app
这是我的 Dockerfile
FROM node:14.15.5-alpine3.13
RUN mkdir -p /app
WORKDIR /app
#RUN adduser -S app
COPY ./dp/ .
RUN npm install
RUN npm install sharp --ignore-scripts=false
#RUN chown -R app /app
#USER app
EXPOSE 3000
CMD [ "npm", "run", "deploy" ]
我的根目录中有一个名为 dp 的文件夹,它是下一个 js 应用程序。我还有一个名为 db_dump 的文件夹,其中包含用于数据库设置的初始 db 脚本。
这是 dp 文件夹中 package.json 文件中的脚本
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint",
"deploy": "next build && next start"
}
当我运行docker-compose up 时,会构建映像,然后构建下一个应用程序并使用消息启动
ready - started server on 0.0.0.0:3000, url: http://localhost:3000
由于我将容器的 3000 端口绑定到主机的 3000 端口,我应该可以从 localhost:3000 访问网络服务器,对吧?但我无法访问它。我什至尝试通过docker inspect 获取 docker 容器 ip,但这也不起作用。我尝试使用 3307 端口连接 mysql 服务器,但也无法正常工作。似乎没有错误。但无法连接。
我从另一个 wsl 实例尝试了 curl -I http://localhost:3000,它显示 200 响应。但是当我从 Windows 命令提示符尝试相同的操作时,它不起作用。无法理解问题所在。
【问题讨论】:
-
在您的
package.json中尝试将"deploy": "next build && next start"设置为"deploy": "next build && next start -p 3000"。 3000 实际上是一个开发端口,你不应该将它用于生产 -
@Superbman,我按照您的建议更改了脚本。但还是不行。
-
澄清一下,您是从 Windows 还是从 Ubuntu (WSL) 执行
docker-compose up? -
我正在从 Ubuntu WSL 运行
docker-compose up。
标签: docker docker-compose wsl-2