我正在尝试对React应用进行dockerize。我正在使用以下Dockerfile实现此目的。
# base image
FROM node:9.4
# set working directory
WORKDIR /usr/src/app
# install and cache app dependencies
COPY package*.json ./
ADD package.json /usr/src/app/package.json
RUN npm install
# Bundle app source
COPY . .
# Specify port
EXPOSE 8081
# start app
CMD ["npm", "start"]
此外,在我的package.json中,启动脚本定义为
"scripts": {
"start": "webpack-dev-server --mode development --open",
....
}
我将图像构建为:
docker build . -t myimage
然后我最终以
的身份运行该图像docker run IMAGE_ID
然后此命令运行映像,但是当我转到localhost:8080或localhost:8081时,我什么都看不到。
但是,当我进入docker容器中获取myimage并执行curl -X GET http:localhost:8080
时,我可以访问我的react应用程序。
我也在Google-kubernetes上部署了该工具,并在此基础上公开了负载均衡器服务。但是,发生了同样的事情,我无法在暴露的端点上访问react-app,但是当我登录到容器并发出curl请求时,我正在找回index.html。
因此,如何运行该docker映像的映像,以便可以通过浏览器访问应用程序。
答案 0 :(得分:1)
当您在Dockerfile中使用EXPOSE时,它仅声明该服务正在侦听指定端口(在您的情况下为8081),但实际上并未创建任何端口转发。
要实际上将流量从主机转发到服务,必须使用-p
标志来指定端口映射
例如:
docker run -d -p 80:8080 myimage
将启动一个容器并将请求转发到localhost:80到容器端口8080
更多有关EXPOSE的信息,请点击此处https://docs.docker.com/engine/reference/builder/#expose
更新
因此,通常在本地开发节点应用程序并运行webpack dev-server时,它将侦听127.0.0.1,这很好,因为您打算从托管的同一台计算机上访问该站点。但是由于在docker中容器可以被认为是一个单独的实例,这意味着您需要能够从“外部”世界访问它,这意味着有必要重新配置dev-server以侦听0.0.0.0(基本上是指分配给“实例”的所有IP地址)
因此,通过更新dev-server配置以侦听0.0.0.0,您应该能够从主机访问您的应用程序。 链接到文档:https://webpack.js.org/configuration/dev-server/#devserverhost