3

我有一个简单的 Dockerfile 来创建一个图像来充当我节点应用程序的开发环境。问题是容器和我的机器之间的端口绑定没有按预期工作。

Dockerfile:

FROM node:10.12.0
EXPOSE 8080

从这个文件中,我使用以下命令创建一个图像:

docker build -t node:10.12.0.bern ./images/node/

我使用以下命令启动一个容器:

docker run --rm --name=run-client \
    -v $(CURDIR)/client:/app/client:rw \
    -v $(CURDIR)/kawax-js:/app/kawax-js:rw \
    -v $(CURDIR)/enigma:/app/enigma:rw \
    -v $(CURDIR)/client-init/init-client.sh:/usr/local/bin/init-client.sh:rw \
    -p 8080:8080 \
    node:10.12.0.bern \
    /bin/sh -c "sh /usr/local/bin/init-client.sh"

这是我的脚本 init-client.sh:

#!/usr/bin/env bash

cd /app/enigma/
npm link

cd /app/kawax-js/
npm link

cd /app/client/
npm link enigma
npm link kawax-js

npm run dev

最后从 package.json 文件运行我的开发脚本:

  "scripts": {
    "dev": "npm run dev:server & npm run sass:watch & npm run lint:watch",
    "build": "npm run client:build && npm run sass:build",
    "dev:server": "webpack-dev-server --mode development --hot",
    "dev:watchOnly": "webpack --progress --watch -d",
    "client:build": "webpack --mode production",
    "client:minify": "NODE_ENV=production npm run client:build",
    "client:analyze": "___WEBPACK_ANALYZE__=true webpack",
    "sass:build": "node-sass --source-map true --include-path scss scss/app.scss dist/css/bernstein.css",
    "sass:watch": "npm run sass:build & nodemon -e scss -x 'npm run sass:build'",
    "lint": "eslint src/**",
    "lint:changed": "git status | grep .js\\$ | awk '{print $NF}' | xargs eslint ",
    "lint:watch": "nodemon -e js -x 'npm run lint -- --fix'",
    "test": "jest --verbose",
    "test:watch": "jest --verbose --debug --watchAll",
    "deploy:staging": "./scripts/deploy.staging.sh",
    "deploy:production": "./scripts/deploy.production.sh"
  },

在我的机器或容器上运行此脚本将在端口 8080 处启动 webpack 服务器。在我的机器上或从 docker 容器(来自容器的日志)启动服务器完全没有问题:

Rendering Complete, saving .css file...
Wrote Source Map to /app/client/dist/css/bernstein.css.map
Wrote CSS to /app/client/dist/css/bernstein.css
[nodemon] clean exit - waiting for changes before restart
clean-webpack-plugin: /app/client/dist/js has been removed.
ℹ 「wds」: Project is running at http://localhost:8080/
ℹ 「wds」: webpack output is served from /assets
ℹ 「wds」: Content not from webpack is served from /app/client/public
ℹ 「wds」: 404s will fallback to /index.html

如果我查看已安装的卷,我可以看到所有捆绑都已正确完成。运行docker ps我得到:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
db2c5d45c9a6        node:10.12.0.bern        "sh /usr/local/bin/i…"   2 minutes ago       Up 2 minutes        0.0.0.0:8080->8080/tcp   run-client

问题是当我0.0.0.0:8080在浏览器上访问时,我什么也看不到。我不明白,为什么尽管服务器已经启动并且在容器中运行良好,但端口绑定却不起作用?

4

2 回答 2

2

注意 webpack-dev-server!它是localhost默认绑定的。

将其更改为:

"dev:server": "webpack-dev-server --mode development --hot --host 0.0.0.0"

您需要更新您的 webpack-dev-server(在您的package.json命令和webpack.config.json)配置以将主机绑定到 0.0.0.0 而不是 localhost(默认!)。localhost只是alias您的操作系统中的一个,它在容器中不可用。

https://webpack.js.org/configuration/dev-server/#devserver-host

于 2018-10-19T16:04:12.243 回答
0

重要更改 替换Project is running at http://localhost:8080/

应该在http://0.0.0.0:8080/运行

在您的应用程序中。

使用 netstate -tulpn. 或ss -tln在主机上找到端口 8080 ,并确保它绑定到 0.0.0.0 或主机的 ip。

此外,在您的浏览器中,如果它仅绑定到本地主机,则像这样访问它:

http://127.0.0.1:8080

或者这个 if 绑定到主机 ip 或 0.0.0.0

http://host-ip:8080

还要确保你可以在容器内部和主机上使用 127.0.0.1 或 localhost 和主机 IP 在 8080 上卷曲它

于 2018-10-19T15:35:07.647 回答