7

docker 部署前后端分离项目记录

 2 years ago
source link: https://zhuanlan.zhihu.com/p/363928964
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

docker 部署前后端分离项目记录

俺,只想跪在床上娇喘,不想隔着网线叫唤

如题,最近想要复活 c 站,c 站是一个 go + deno + fre + flutter 的网站,本次复活将全面使用 docker 进行部署,使用 github action 做到持续集成

这也是 c站 这种 github开源 中型个人项目 前后端分离 最合适的部署方案

c站旧版最开始使用手动部署,后来

将 deno 接口 docker 化,然后 go 我也做了自动化,但 mysql 和 nginx 一直没有 docker 化

新版c站将全部使用 docker 部署

docker

先安装 docker,因为我是香港服务器,所以速度有点慢

ssh -p 22 [email protected]
sudo yum install docker-ce docker-ce-cli containerd.io
sudo usermod -aG docker root
sudo systemctl start docker
docker info

nginx

在部署之前,先用一行命令部署一下 nginx,用来测试一下 docker

docker run -p 8080:80 -d -v ./html:/usr/share/nginx/html nginx

这一行命令,包含了端口映射,守护进程,卷映射

docker-compose

我们真正部署的时候,一般不这么搞,一般会使用 docker-compose

curl -L https://github.com/docker/compose/releases/download/1.29.1/docker-compose-Linux-x86_64 > /usr/local/bin/docker-compose
chmod a+x /usr/local/bin/docker-compose
docker-compose --version

简单三行命令,docker compose 就成功装上了,接下来开始真正的部署工作

docker-composer.yml

version: "3"

networks:
  clicli:

services:
  api:
    image: "yisar/clicli_api"
    networks:
      - clicli
    depends_on:
      - db
    ports:
      - "8080:8080"
    environment:
      dbstr: "root:root@tcp(localhost:3306)/clicli?charset=utf8"

  nginx:
    image: "yisar/clicli_nginx"
    networks:
      - clicli
    depends_on:
      - api
    ports:
      - "80:80"

  db:
    image: "mariadb"
    networks:
      - clicli
    environment:
      MYSQL_ROOT_PASSWORD: mysqlroot
      MYSQL_DATABASE: clicli
      MYSQL_USER: root
      MYSQL_PASSWORD: root
    volumes:
      - $PWD/data:/var/lib/mysql
    ports:
      - "3306:3306"

准备好了 docker-compose-yml 以后,我们还需要写两个 DockerFile

nginx

FROM nginx
COPY ./conf/ /etc/nginx/conf/
COPY ./dist/ /root/dist/
EXPOSE 80

nginx 做的事情很简单,主要是拷贝配置两个文件目录,一个是 conf 目录,一个是前端目录

golang

FROM golang
WORKDIR $GOPATH/src/github.com/yisar
ADD . $GOPATH/src/github.com/yisar
RUN go build .
EXPOSE 4000
ENTRYPOINT  ["./api"]

golang 主要是设置一下工作目录以及执行脚本

mysql

mysql 什么也不用做,直接使用默认镜像就好了,生产环境我一般使用 MariaDB,它是 mysql 兼容版本

到这一步,我们可以说已经全部准备好了,可以直接跑了

docker-compose up -d

github action

为了方便持续部署,我们使用 github action 来自动化部署,其实主要是将构建镜像这一步放到 CI 中做,其中 go 是后端 api,nginx 主要是负责前端项目

on:
  push:
    branches:
      - master
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        uses: actions/setup-go@master
      - name: Build images
        env:
          DockerUsername: ${{ secrets.DOCKER_USERNAME }}
          DockerPassword: ${{ secrets.DOCKER_PASSWORD }}
        run:
          docker login -u $DockerUsername -p $DockerPassword
          docker build -t yisar/clicli_api .
          docker push yisar/clicli_api  
          docker build -t yisar/clicli_api ./nginx
          docker push yisar/clicli_nginx  
           
  deploy:
    runs-on: ubuntu-latest
    needs: [publish]
    steps:
      - uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.DEPLOY_HOST }}
          username: ${{ secrets.DEPLOY_USERNAME }}
          password: ${{ secrets.DEPLOY_PASSWORD }}
          port: 22
          script: docker-compose up -d

总结

经过一番折腾,终于可以理顺整个构建的过程了,其实还蛮简单的说,但我最头疼写脚本了,虽然这是一劳永逸的事情

但有一点比较重要,那就是能放到 github 上的文件,一定不放,不然就和我一样惨,好不容易配好了一整套,然后突然文件没了,又得重新折腾


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK