介绍:通过docker构建以nginx为基础的镜像;将vue生成的dist包拷贝至nginx目录下;实现项目的部署与反向代理。
(1)由于是使用docker来构建镜像,所以本地需要有docker环境。
(2)如果要将镜像推送到私服镜像仓库,则需要修改docker的配置文件daemon.json,如下:
在insecure-registries中添加仓库地址
{
"experimental": false,
"debug": true,
"registry-mirrors": [
"https://japmlaqu.mirror. aliyuncs.com"
],
"insecure-reaistries" [
"192.168.100.90:5000",
"192.168.100.91:5000"
]
}
注意:修改之后需要重启docker才会生效。
脚本位置就在项目根目录下,脚本build.sh内容如下:
#注意:以下两行命令不需要每次都执行,如果本地已经安装了项目依赖包,则可以注释掉这两行命令
#设置registry为淘宝镜像
npm set registry https://registry.npm.taobao.org
#从registry下载安装项目所需依赖包
npm install
#生成dist包
npm run build
#构建镜像:
# docker build:根据dockerfile文件内容构建镜像;
# -f:指定Dockerfile位置,省略则默认为此脚本同目录下名为"Dockerfile"的文件;
# -t:指定构建镜像的名称及版本号;
# .:制定镜像构建过程中的上下文环境目录;比如dockerfile指定了COPY dist/ /usr/nginx/html,其拷贝的不是本地目录的dist包,而是docker引擎中展开的构建上下文中的文件
#docker build -f ./my-DockerFile -t 192.168.100.90:5000/myapp/front_dev:1.1 .
docker build -t 192.168.100.90:5000/myapp/front_dev:1.1 .
#登录镜像仓库:如果192.168.100.90:5000设有密码则需要登录,如果没有则注释掉此行命令;
#docker login 192.168.100.90:5000 --username=admin --password=admin@server1
#推送镜像:将镜像推送到192.168.100.90:5000仓库;这样其他人就可以直接从镜像仓库拉取构建好了的镜像。
docker push 192.168.100.90:5000/myapp/front_dev:1.1
成功执行完脚本命令就完成构建、推送镜像的操作了。
脚本中指定的Dockerfile文件内容接下来会做详细解释。
#指定所创建镜像的基础镜像为nginx,如果本地不存在,则默认会去Docker Hub下载;
FROM docker.io/library/nginx:latest
#维护作者信息
LABEL MAINTAINER="lgr<[email protected]>"
#删除源文件及软链接
RUN unlink /var/log/nginx/access.log
RUN unlink /var/log/nginx/error.log
# 覆盖default配置:将nginx目录下defaulut.conf文件替换为my-nginx.conf配置文件
COPY my-nginx.conf /etc/nginx/conf.d/default.conf
# 将nginx下的html目录替换为dist包
COPY dist/ /usr/share/nginx/html
# 拷贝证书(ssl证书:http://blog.itpub.net/69996004/viewspace-2763244)
RUN mkdir -p /etc/nginx/cert
COPY certificate/ /etc/nginx/cert
#暴露端口
EXPOSE 80
该文件指定构建一个以nginx为基础的镜像,并将dockerfile同目录下的my-nginx.conf文件和dist包复制到nginx指定位置下。
#压缩设置
#开启gzip压缩
gzip on;
#http的协议版本
gzip_http_version 1.0;
#IE版本1-6不支持gzip压缩,关闭
gzip_disable 'MSIE[1-6].';
#需要压缩的文件格式 text/html默认会压缩,不用添加
gzip_types text/css text/javascript application/javascript image/jpeg image/png image/gif;
#设置压缩缓冲区大小,此处设置为4个8K内存作为压缩结果流缓存
gzip_buffers 4 8k;
#压缩文件最小大小
gzip_min_length 1k;
#压缩级别1-9
gzip_comp_level 4;
#给响应头加个vary,告知客户端能否缓存
gzip_vary on;
#反向代理时使用
gzip_proxied off;
#上传文件大小限制
client_max_body_size 20M;
#解决代理中丢失下划线信息配置
underscores_in_headers on;
#监听https(端口443),并包括ssl证书和其他ssl配置
server {
listen 443 ssl;
server_name myapp.custom.com.cn;
# ssl认证,dockerfile文件中命令已经将ssl证书文件拷贝到nginx/目录下
ssl_certificate /etc/nginx/cert/9125385_myapp.custom.com.cn.pem;
ssl_certificate_key /etc/nginx/cert/9125385_myapp.custom.com.cn.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log error;
root /usr/share/nginx/html;
# 配置vue刷新报404
location / {
try_files $uri $uri/ /index.html; #检测文件存在性重定向到首页目录,防止404
index index.html;
}
location @router {
rewrite ^.*$ /index.html break;
}
#项目后端接口
location /api/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
#反向代理地址
proxy_pass http://192.168.200.92:8080/;
proxy_connect_timeout 60000;
proxy_read_timeout 60000;
proxy_send_timeout 60000;
}
#后端文件存储服务器ip代理
location /minio/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://192.168.200.92:10001/;
proxy_connect_timeout 60000;
proxy_read_timeout 60000;
proxy_send_timeout 60000;
}
#后端从某数据中心1拉取数据的接口代理
location /dcapi/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
#反向代理地址, 对应的是上面设置的upstream的名字。
proxy_pass http://192.199.201.12:9010/;
proxy_connect_timeout 60000;
proxy_read_timeout 60000;
proxy_send_timeout 60000;
}
#后端从某数据中心2拉取数据的接口代理
location /infoapi/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://192.134.200.21:443/;
proxy_connect_timeout 60000;
proxy_read_timeout 60000;
proxy_send_timeout 60000;
}
}
# 监听http(端口80),并将所有的http请求重定向到https
# nginx实现http自动跳转https:https://cloud.tencent.com/developer/article/2253799
server {
listen 80; #监听80端口
server_name myapp.custom.com.cn; #请求域名
return 301 https://$host$request_uri; #重定向至https访问。
}
本文件配置了后端服务反向代理、http请求重定向到https。
bash deploy.sh start myAppService my-compose.yaml
在镜像所在服务器的(deploy.sh、my-compose.yaml文件)目录下执行此脚本命令即可。
说明:myAppService为自定义的服务名,my-compose.yaml是与deploy.sh脚本在同目录下的compose文件。deploy.sh脚本内容如下:
#!/bin/bash
cmd="$1"
service="$2"
config="$3"
basepath=$(cd `dirname $0`; pwd)
login(){
docker login 192.168.100.99:5000 --username=admin --password=admin@server1
}
start(){
#如果192.168.100.90:5000设有密码则需要登录,如果没有则注释掉此行命令;
#docker login 192.168.100.99:5000 --username=admin --password=admin@server1
echo "启动/更新服务"
#部署镜像,-c指定compose.yaml位置
docker stack deploy -c $basepath/$config $service --with-registry-auth
}
down(){
docker stack rm $service
}
# 查询stack服务中的容器运行状态
ps(){
docker stack ps $service
}
usage(){
echo "start version - 启动/更新服务"
echo "down - 删除服务"
echo "ps - 查看服务中容器的运行状态"
echo "login - 登录镜像仓库"
}
if [[ $cmd = "start" ]]; then
start
elif [[ $cmd = "down" ]]; then
down
elif [[ $cmd = "ps" ]]; then
ps
elif [[ $cmd = "login" ]]; then
login
else
usage
fi
my-compose.yaml文件内容如下:
version: '3'
services:
front:
#镜像名称必须要与build.sh中起的名称一模一样
image: 192.168.100.90:5000/myapp/front_dev:1.1
deploy:
replicas: 1
update_config:
parallelism: 1
delay: 10s
restart_policy:
condition: any
delay: 10s
max_attempts: 3
window: 120s
resources:
limits:
memory: 512M
reservations:
memory: 128M
#80端口映射到8888
ports:
- "8888:80"