小机智1900

V1

2022/08/05阅读:9主题:橙心

hexo博客使用docker自动化部署阿里云

起因

接上一篇hexo博客docker部署阿里云的一点心得 之后,第二次上传文章的时候发现,从dockerhub仓库拉取自己的镜像非常慢,而且基本都是timeout拉不下来,尝试改镜像源什么的没啥效果。

在修改镜像源的过程中发现了阿里云容器镜像服务,发现它个人版还是免费的,经测试,拉取镜像速度很快,于是就用上了它。

又想到,每次发文章都要push代码,然后登陆ecs再用docker pull下来,然后再run起来.......是不是太麻烦了,是不是可以一步到位,只要push完代码就行了,其他的交给git action。

自己在本地登录ecs是需要输入密码的,在gitaction上是通过脚本执行,怎么做呢?在网上找了后发现也有教程案例,那就是使用ssh密钥来登陆ecs,然后执行登陆后的操作。

思路

  1. push代码
  2. 触发git action
  3. 使用阿里云容器镜像服务保存镜像
  4. 使用ssh远程登录ecs,从阿里云的镜像上pull镜像,然后run

过程

一、使用阿里云容器镜像服务

登陆阿里云,搜索容器镜像服务,创建一个个人版镜像仓库,记住命名空间和仓库名称,选择类型时选择公开。

仓库管理--访问凭证设置一个固定密码。

至此,这里需要用到:

  • 容器镜像用户名(阿里账户全名)
  • 容器镜像密码(设置好的固定密码)
  • 个人镜像的命名空间
  • 镜像仓库名称

二、在ecs上建立ssh密钥

登陆可以使用密码登陆,也可以使用ssh密钥登陆,为了安全,使用ssh密钥。

  1. 登陆ecs,执行
    mkdir -p ~/.ssh && cd ~/.ssh
    ssh-keygen -t rsa
  2. 执行命令,一路回车,得到id_rsa和id_rsa.pub,其中id_rsa是私钥,id_rsa.pub是公钥
  3. 在服务器上安装公钥,设置好权限:
    cat id_rsa.pub >> authorized_keys
    chmod 600 authorized_keys
    chmod 700 ~/.ssh
  4. 设置ssh,打开密钥登陆:
    # 编辑 /etc/ssh/sshd_config 文件,进行如下设置
    RSAAuthentication yes
    PubkeyAuthentication yes

后面两步验证即可,后面也是查了才知道,默认情况下都是正确的。

查看私钥文件,复制备用。

三、配置git secrets

在github上打开项目目录,Settings -> Secrets -> actions,添加好需要用到的参数:

  • REGISTRY_USERNAME :镜像仓库用户名
  • REGISTRY_PASSWORD:镜像仓库密码
  • SERVER_HOST:服务器地址
  • SERVER_USER:服务器用户名
  • SERVER_TOKEN:ssh私钥

四、编写git actions

actions中新建一个action动作,选择nodejs模版,然后编写内容:

# deploy.yml
name: deploy blog to dockerhub
on:
push:
branches:
- hexo # 上传到此分支触发
jobs:
build:
runs-on: ubuntu-latest
steps:
# 检查代码
- name: Checkout # 将仓库内master分支的内容下载到工作目录
uses: actions/checkout@v2 # 脚本来自 https://github.com/actions/checkout
# 发布
- name: Login to Aliyun Container Registry (ACR)
uses: aliyun/acr-login@v1 # 使用阿里云镜像服务action
with:
login-server: registry.cn-shenzhen.aliyuncs.com # 务必正确填写镜像容器服务的登录地址
region-id: cn-shenzhen # 务必正确填写镜像容器服务的登录地址
username: "${{ secrets.REGISTRY_USERNAME }}" # 引用GitHub repo设置的镜像容器服务用户名
password: "${{ secrets.REGISTRY_PASSWORD }}" # 引用GitHub repo设置的镜像容器服务密码
- name: Build and Push Docker Image
env:
app_name: "my-blog"
app_space: "maya1900"
app_url: "registry.cn-shenzhen.aliyuncs.com"
run: |
docker build -t $app_url/$app_space/$app_name:latest .
docker push $app_url/$app_space/$app_name:latest
# 部署
- name: Login aliEcs
uses: appleboy/ssh-action@master
env:
app_name: "my-blog"
app_space: "maya1900"
app_url: "registry.cn-shenzhen.aliyuncs.com"
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SERVER_TOKEN }}
port: 22
script: |-
app_name="my-blog"
app_space="maya1900"
if test -n "$(docker ps -a |grep $app_name)"; then
echo "停止并且删除容器和上版本镜像"
docker stop $app_name
docker rm $app_name
docker rmi registry.cn-shenzhen.aliyuncs.com/$app_space/$app_name:latest
else
echo "未检查到$app_name容器运行"
fi

echo "获取最新的镜像"
docker pull registry.cn-shenzhen.aliyuncs.com/$app_space/$app_name:latest
echo "启动服务"
docker run --name $app_name -p 8082:80 -d registry.cn-shenzhen.aliyuncs.com/$app_space/$app_name:latest

保存后,action就应该第一次启动了(当然我试了n次才成功...)。

以后push完代码就可以等代码部署到网站了。(里面使用到的docker命令与上一篇文章有关,有兴趣可自行查看)

遇到的坑:

  1. 镜像推到阿里云上,拉取不下来?
    1. 把仓库设置为公开
    2. 拉取路径有问题,先在本地尝试
  2. 使用了阿里镜像服务,执行时还在dockerhub上拉取?
    1. 因为上一篇中使用了docker-compose,pull完后就docker-compose up,执行docker-compose里的指令,这里其实设置images时使用阿里镜像的地址,一样使用docker-compose,为了直接使用脚本,就不另外建文件了
  3. linux使用变量总是出错?
    1. 在给镜像地址一个变量时(这里是registry.cn-shenzhen.aliyuncs.com),总是出错,执行app_url="registry.cn-shenzhen.aliyuncs.com"才发现这条出错,于是把它直接写死里面了。。

发现还需要学的:

  • linux操作学习
  • 脚本语言学习

最后,感谢前辈们的无私分享,谢谢。

参考

  1. 使用GitHub Action自动构建和推送Docker镜像_BulletTech2021的博客-CSDN博客_github自动构建docker
  2. Java项目基于github actions、dockerhub、aliyunECS构建CICD流水线 - 掘金 (juejin.cn)
  3. 使用 GitHub Actions 实现博客自动化部署 | Frost's Blog (frostming.com)

分类:

后端

标签:

后端

作者介绍

小机智1900
V1