golang&vue前后端分离项目部署至云服务器

golang&vue前后端分离项目部署至云服务器

所需工具

  • Docker
  • Nginx
  • Portainer
  • 阿里云服务器
  • 阿里云容器镜像服务

1、docker打包代码并推向阿里云仓库

前端准备

先执行npm run build 打包代码到disk文件夹

nginx.conf

server {
    listen 80;
	location / {
      root /usr/share/nginx/html;
      index index.html;
    }
}

Dockerfile

FROM nginx:alpine

COPY ./nginx.conf /etc/nginx/conf.d/default.conf
COPY ./dist /usr/share/nginx/html

后端准备

Dockerfile

FROM golang as build

ENV GOPROXY=https://goproxy.io

ADD . /项目名

WORKDIR /项目名

RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o api_server

FROM alpine:3.7

ENV GIN_MODE="release"
ENV PORT=3000

RUN echo "http://mirrors.aliyun.com/alpine/v3.7/main/" > /etc/apk/repositories && \
    apk update && \
    apk add ca-certificates && \
    echo "hosts: files dns" > /etc/nsswitch.conf && \
    mkdir -p /www/conf

WORKDIR /www

COPY --from=build /cmall/api_server /usr/bin/api_server
ADD ./conf /www/conf

RUN chmod +x /usr/bin/api_server

ENTRYPOINT ["api_server"]

以上为使用了go mod的写法

阿里云容器镜像服务

前后端准备完成后,进入到阿里云容器镜像服务页面

首先 创建命名空间

之后点击访问凭证->设置固定密码

然后在终端登录$sudo docker login --username=你的用户名 registry.cn-shenzhen.aliyuncs.com

执行完上述操作后分别在终端上前后端文件位置执行

$docker build -t registry.cn-shenzhen.aliyuncs.com/命名空间/镜像仓库:[镜像版本号] ./

$sudo docker push registry.cn-shenzhen.aliyuncs.com/命名空间/镜像仓库:[镜像版本号]

执行完这两句后,就可以看到镜像仓库处新增了两个仓库啦

2.云服务器准备

首先先购买云服务器=-=,配置好实例密码

在终端通过$ssh root@公网ip远程连接云服务器(需要密码)

(tips:可以使用 $ssh-copy-id root@公网ip记住密码,之后就可以免密码连接)

安装docker以及nginx

执行如下命令创建portainer容器

$ docker volume create portainer_data
$ docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

云服务器开放9000端口给本机访问

开启后 通过 公网ip:9000进入portainer界面

创建账号->选择Local->进入local

进入后在 Registries->Custom registry 新建registry 选中Authentication 把阿里云容器镜像服务的地址、账号、固定密码记录进去(因为阿里云镜像仓库默认为私有仓库所以需要在registry保存账号固定密码以便访问)

3、新建Stacks以及编写docker-compose.yaml

在Portainer 新建Stacks编写docker-compose.yaml

首先是前端的Stacks

version: '2'

services:
  nginx:
    image: 你的前端镜像地址
    restart: always
    ports:
      - 3001:80

新建后端接口的Stacks之前需要先创建数据卷实现数据持久化,在宿主机上挂一个文件夹,具体操作如下:

在portainer界面下 选择Volumes-Create volume 创建数据卷

(mysql和redis要分别创建)

新建后端Stacks

version: '2'

services:
  cmall-api:
    image: 容器镜像地址
    container_name: 名称
    restart: always
    environment:
      MYSQL_DSN: "..."
      ...环境变量
    ports:
      - 3002:3000
    depends_on:
      - redis
      - mysql
  mysql:
    container_name: mysql
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ...
      MYSQL_DATABASE: ...
    volumes:
      - 容器卷名:/var/lib/mysql/data
    ports:
      - "3306:3306"
  redis:
    container_name: redis
    image: redis
    restart: always
    volumes:
      - 容器卷名:/data
    ports:
      - "6379:6379"

4、配置nginx.conf

首先 $ cd /etc/nginx/sites-enabled进入该文件夹

在该文件夹新建xxx.conf文件

server {
    listen 80;
    server_name 配置的网址;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:3001;
    }

        location /api {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:3002;
    }
}

/ 为前端地址 /api 为后端地址

然后执行 $ service nginx restart

通过 $nginx -t验证.conf文件格式是否正确

至此项目就部署完毕了!通过输入server_name来访问页面

5、其他

阿里云服务器默认没有开放80端口,需要自己开放才能够访问

如果想要自己的域名可以通过域名解析来完成(.conf的server_name要与解析的网址一致)

本人也是第一次部署,如上有写的不对的地方欢迎指正!

你可能感兴趣的:(docker,nginx,golang,vue,阿里云)