所需工具
- Docker
- Nginx
- Portainer
- 阿里云服务器
- 阿里云容器镜像服务
1、docker打包代码并推向阿里云仓库
前端准备
npm run build
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
$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
创建账号->选择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
至此项目就部署完毕了!通过输入server_name来访问页面
5、其他
阿里云服务器默认没有开放80端口,需要自己开放才能够访问
如果想要自己的域名可以通过域名解析来完成(.conf的server_name要与解析的网址一致)
本人也是第一次部署,如上有写的不对的地方欢迎指正!