最近有一个私有化部署项目的需求。由于不能提前确定后端地址,所以服务地址需要可配置,于是想到了使用docker
。
分析
后端地址在docker
启动时通过环境变量参数传入,在nginx
配置中读取,并反向代理给项目。
代码
首先准备好两份nginx
配置。
nginx.conf
添加了gzip
压缩等功能,根据需求可选。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| worker_processes auto;
pid /var/run/nginx.pid;
events { worker_connections 1024; }
http { include /etc/nginx/mime.types; default_type application/octet-stream;
sendfile on;
keepalive_timeout 65; ... gzip on; gzip_vary on; gzip_proxied expired no-cache no-store private auth; gzip_comp_level 5; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_types application/javascript application/x-javascript application/xml application/xml+rss application/x-httpd-php text/plain text/javascript text/css image/jpeg image/gif image/png; gzip_disable "MSIE [1-6]\."; ... include /etc/nginx/conf.d/*.conf; }
|
nginx.template
用来配置具体网站代理。${SERVER}
参数即为传入的docker
环境变量。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| upstream httpd{ server ${SERVER}; keepalive 1; }
server { listen 80; server_name _;
location / { root /usr/share/nginx/html; index index.html index.htm; try_files $uri $uri/ /index.html; } location ^~ /api/ { proxy_pass http://httpd/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
|
现在我们来处理docker
部分。
Dockerfile
如下,使用envsubst
命令将环境变量传给文件。
1 2 3 4 5 6 7 8 9 10 11 12
| FROM nginx:stable-alpine
COPY ./dist /usr/share/nginx/html COPY ./docker/nginx.conf /etc/nginx/nginx.conf
RUN rm /etc/nginx/conf.d/default.conf COPY ./docker/nginx.template /etc/nginx/conf.d
EXPOSE 80 WORKDIR /etc/nginx/conf.d ENTRYPOINT envsubst '${SERVER}' < nginx.template > web.conf && nginx -g 'daemon off;'
|
测试
打包镜像
运行
1
| docker run -d -p 80:80 -e SERVER=x.x.x.x:8000 web
|
打开浏览器访问 localhost:80
,网站运行成功。
参考
Docker Desktop WSL 2 backend
Docker启动nginx并读取环境变量
envsubst——将环境变量传递给文件
如何在 Docker 容器中连接到本地主机