"Empty reply from server" when trying to run webpack-dev-server inside a docker container with docker-compose on windows running docker-toolbox

huangapple go评论96阅读模式
英文:

"Empty reply from server" when trying to run webpack-dev-server inside a docker container with docker-compose on windows running docker-toolbox

问题

我遇到了一个问题,无法在docker-machine中访问使用docker-compose运行的React容器。我可以在容器内使用curl访问网页,但无法从docker-machine(或主机的浏览器)访问它。后端的Golang容器可以从docker-machine和主机的浏览器访问(如片段中所示,它返回404 not found)。

在docker-compose日志中,一切似乎都运行顺利,webpack-dev-server按预期运行,只是无法从容器外部访问它。

我正在使用Windows的Docker Toolbox。

最好使用一些片段进一步描述问题。

Docker-compose文件:

version: '2'
services:
    postgres:
        image: postgres
        environment:
            - POSTGRES_PASSWORD=postgres
    server:
        build: ./server
        command: gin
        volumes:
            - ./server:/go/src/app
        ports:
            - "8080:3000"
        environment:
            - POSTGRES_PASSWORD=postgres
    client:
        build: ./client
        command: npm start
        volumes:
            - ./client:/usr/src/app
            # mount node_modules as a workaround for it disappearing
            # after adding /client as a mounted folder
            - /usr/src/app/node_modules
        ports:
            - "9000:3000"

用于node容器的Dockerfile:

FROM node:6.5.0-slim

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY package.json /usr/src/app/
ENV NODE_ENV development
RUN npm install

在docker-machine(默认)中运行以下命令的输出:
> docker@default:~$ sudo iptables -t nat -L -n

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0
MASQUERADE  all  --  172.19.0.0/16        0.0.0.0/0
MASQUERADE  all  --  172.18.0.0/16        0.0.0.0/0
MASQUERADE  tcp  --  172.19.0.2           172.19.0.2           tcp dpt:3000
MASQUERADE  tcp  --  172.19.0.3           172.19.0.3           tcp dpt:3000

Chain DOCKER (2 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0
RETURN     all  --  0.0.0.0/0            0.0.0.0/0
RETURN     all  --  0.0.0.0/0            0.0.0.0/0
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8080 to:172.19.0.2:3000
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:9000 to:172.19.0.3:3000

以下是主要问题:
> docker@default:~$ curl 0.0.0.0:9000

curl: (52) Empty reply from server

> docker@default:~$ curl 0.0.0.0:8080

404 page not found

> docker@default:~$ docker ps

CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS
           NAMES
f93fd1833de2        goreacttodo_client   "npm start"              32 minutes ago      Up 5 minutes        0.0.0.0:9000->
3000/tcp   goreacttodo_client_1
ff1fa9c33b05        postgres             "/docker-entrypoint.s"   3 days ago          Up 5 minutes        5432/tcp
           goreacttodo_postgres_1
e4581f8e368b        goreacttodo_server   "gin"                    3 days ago          Up 5 minutes        0.0.0.0:8080->
3000/tcp   goreacttodo_server_1

在node容器内运行以下命令的输出:

> root@f93fd1833de2:/usr/src/app# curl localhost:3000

<!doctype html>
<html>
<head>
</head>
<body lang="en">
<div id="react-app"></div>
<script src="/bundle.js" type="text/javascript"></script>
</body></html>

希望能得到帮助。

英文:

I am having problems accessing a react container run with docker-compose inside docker-machine. I can curl the webpage inside the container, but I cannot access it inside docker-machine (or on the host's browser for that matter). The backend Golang container can be accessed from docker-machine and from the host's browser (as seen in the snippets, it returns a 404 not found).

In the docker-compose logs everything seems to be running smoothly, webpack-dev-server runs as expected, I just can't access it from outside the container.

I am using docker toolbox for windows.

Best to additionally describe the problem with some snippets.

Docker-compose file:

version: &#39;2&#39;
services:
    postgres:
        image: postgres
        environment:
            - POSTGRES_PASSWORD=postgres
    server:
        build: ./server
        command: gin
        volumes:
            - ./server:/go/src/app
        ports:
            - &quot;8080:3000&quot;
        environment:
            - POSTGRES_PASSWORD=postgres
    client:
        build: ./client
        command: npm start
        volumes:
            - ./client:/usr/src/app
            # mount node_modules as a workaround for it disappearing
            # after adding /client as a mounted folder
            - /usr/src/app/node_modules
        ports:
            - &quot;9000:3000&quot;

Dockerfile for the node container:

FROM node:6.5.0-slim

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY package.json /usr/src/app/
ENV NODE_ENV development
RUN npm install

Output of the following commands inside docker-machine (default):
> docker@default:~$ sudo iptables -t nat -L -n

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0
MASQUERADE  all  --  172.19.0.0/16        0.0.0.0/0
MASQUERADE  all  --  172.18.0.0/16        0.0.0.0/0
MASQUERADE  tcp  --  172.19.0.2           172.19.0.2           tcp dpt:3000
MASQUERADE  tcp  --  172.19.0.3           172.19.0.3           tcp dpt:3000

Chain DOCKER (2 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0
RETURN     all  --  0.0.0.0/0            0.0.0.0/0
RETURN     all  --  0.0.0.0/0            0.0.0.0/0
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8080 to:172.19.0.2:3000
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:9000 to:172.19.0.3:3000

Here comes the main problem:
> docker@default:~$ curl 0.0.0.0:9000

curl: (52) Empty reply from server

> docker@default:~$ curl 0.0.0.0:8080

404 page not found

> docker@default:~$ docker ps

CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS
           NAMES
f93fd1833de2        goreacttodo_client   &quot;npm start&quot;              32 minutes ago      Up 5 minutes        0.0.0.0:9000-&gt;
3000/tcp   goreacttodo_client_1
ff1fa9c33b05        postgres             &quot;/docker-entrypoint.s&quot;   3 days ago          Up 5 minutes        5432/tcp
           goreacttodo_postgres_1
e4581f8e368b        goreacttodo_server   &quot;gin&quot;                    3 days ago          Up 5 minutes        0.0.0.0:8080-&gt;
3000/tcp   goreacttodo_server_1

Output of the following commands inside the node container:

> root@f93fd1833de2:/usr/src/app# curl localhost:3000

&lt;!doctype html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;/head&gt;
&lt;body lang=&quot;en&quot;&gt;
&lt;div id=&quot;react-app&quot;&gt;&lt;/div&gt;
&lt;script src=&quot;/bundle.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;/body&gt;&lt;/html&gt;

Any help would be greatly appreaciated.

答案1

得分: 20

Webpack开发服务器默认只监听本地主机。

如果你想将其端口暴露到Docker容器之外,你需要明确指定要监听的主机:

webpack-dev-server --host 0.0.0.0 --port 80

英文:

Webpack development server by default listens on localhost only.

If you want to expose it's port outside of Docker container you need to explicitly specify host to listen to:
> webpack-dev-server --host 0.0.0.0 --port 80

huangapple
  • 本文由 发表于 2016年9月9日 05:00:56
  • 转载请务必保留本文链接:https://go.coder-hub.com/39400128.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定