我正在尝试对Flask / React Web应用程序进行Docker化,以简化开发/协作,但是在从该应用程序获得正确响应方面存在问题。我能够构建图像并在容器中启动Flask服务器,但实际上遇到了问题。
我们使用HAProxy转发请求,当我在本地运行代理和Web服务器时,一切正常。问题一直在使docker混入其中。我相信这一定是端口映射问题,但是我没有主意,觉得我可能缺少关键的HAProxy / Docker细微之处。 proxy.cfg文件如下所示(不包括无关的主机):
global
maxconn 4096
pidfile ~/tmp/haproxy.pid
defaults
log global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
mode http
timeout connect 300000
timeout client 300000
timeout server 300000
maxconn 2000
option redispatch
retries 3
option httpclose
option httplog
option forwardfor
option httpchk HEAD / HTTP/1.0
frontend dev
bind *:8080 ssl crt ./proxy.pem
acl allow_web path_beg /app/
use_backend be_web if allow_web
backend be_web
balance roundrobin
server web_5000 localhost:5000
Dockerfile:
FROM node:10.6.0
RUN apt-get update
RUN apt-get install -y python-pip python-dev build-essential
WORKDIR /usr/src/app
COPY ./package.json .
RUN npm install
COPY . .
RUN pip install -e ./server
CMD ["npm", "start"]
docker-compose.yml:
version: "3"
services:
userportal:
build: .
volumes:
- /usr/src/app/node_modules
- .:/usr/src/app
ports:
- "5000:5000"
Flask服务器绑定到端口5000,因此映射。我尝试将容器IP地址替换为localhost
(例如172.19.0.2:5000
),但结果相同。
编辑:
我尝试将代理作为服务添加到docker-compose.yml中,并将主机从localhost:5000
更改为userportal_1:5000
,但这导致了503。docker-compose.yml:
services:
userportal:
build: .
volumes:
- /usr/src/app/client/node_modules
- ./client:/usr/src/app/client
- ./server:/usr/src/app/server
ports:
- "5000:5000"
proxy:
image: haproxy:alpine
volumes:
- ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
- ./proxy.pem:/certs/proxy.pem
ports:
- "8080:8080"
您应该提前知道您的容器IP
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id
在某些时候,如果您想使用HAProxy,将其更容易地置于docker中以解决Avoir网络问题
如果您不想要,可以尝试:haproxy.conf
global
maxconn 4096
pidfile ~/tmp/haproxy.pid
defaults
log global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
mode http
timeout connect 300000
timeout client 300000
timeout server 300000
maxconn 2000
option redispatch
retries 3
option httpclose
option httplog
option forwardfor
option httpchk HEAD / HTTP/1.0
frontend dev
bind 0.0.0.0:8080 ssl crt ./proxy.pem // <-- change wildcard with 0.0.0.0
acl allow_web path_beg /app/
use_backend be_web if allow_web
default_backend be_web // <-- add this line
backend be_web
balance roundrobin
mode http
option forwardfor // <-- add this line
option httpchk GET / HTTP/1.1 // <-- add this line
server web_5000 userportal_1:5000 check // <-- change localhost to the nane of running container "userportal_1" or the IP if you get it
Dockerfile:
FROM node:10.6.0
RUN apt-get update
RUN apt-get install -y python-pip python-dev build-essential
WORKDIR /usr/src/app
COPY ./package.json .
RUN npm install
COPY . .
RUN pip install -e ./server
EXPOSE 5000 // <-- add this ine
CMD ["npm", "start"]
docker-compose.yml
version: "3"
services:
userportal:
build: .
volumes:
- /usr/src/app/node_modules
- .:/usr/src/app
ports:
- "5000:5000"
尝试将您的HAProxy包含在docker-compose.yml中会很有帮助