起因
接上一篇hexo博客docker部署阿里云的一点心得 之后,第二次上传文章的时候发现,从dockerhub仓库拉取自己的镜像非常慢,而且基本都是timeout拉不下来,尝试改镜像源什么的没啥效果。
在修改镜像源的过程中发现了阿里云容器镜像服务,发现它个人版还是免费的,经测试,拉取镜像速度很快,于是就用上了它。
又想到,每次发文章都要push代码,然后登陆ecs再用docker pull下来,然后再run起来.......是不是太麻烦了,是不是可以一步到位,只要push完代码就行了,其他的交给git action。
自己在本地登录ecs是需要输入密码的,在gitaction上是通过脚本执行,怎么做呢?在网上找了后发现也有教程案例,那就是使用ssh密钥来登陆ecs,然后执行登陆后的操作。
思路
- push代码
- 触发git action
- 使用阿里云容器镜像服务保存镜像
- 使用ssh远程登录ecs,从阿里云的镜像上pull镜像,然后run
过程
一、使用阿里云容器镜像服务
登陆阿里云,搜索容器镜像服务,创建一个个人版镜像仓库,记住命名空间和仓库名称,选择类型时选择公开。
仓库管理--访问凭证设置一个固定密码。
至此,这里需要用到:
- 容器镜像用户名(阿里账户全名)
- 容器镜像密码(设置好的固定密码)
- 个人镜像的命名空间
- 镜像仓库名称
二、在ecs上建立ssh密钥
登陆可以使用密码登陆,也可以使用ssh密钥登陆,为了安全,使用ssh密钥。
- 登陆ecs,执行
mkdir -p ~/.ssh && cd ~/.ssh ssh-keygen -t rsa 复制代码
- 执行命令,一路回车,得到id_rsa和id_rsa.pub,其中id_rsa是私钥,id_rsa.pub是公钥
- 在服务器上安装公钥,设置好权限:
cat id_rsa.pub >> authorized_keys chmod 600 authorized_keys chmod 700 ~/.ssh 复制代码
- 设置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命令与上一篇文章有关,有兴趣可自行查看)
遇到的坑:
- 镜像推到阿里云上,拉取不下来?
- 把仓库设置为公开
- 拉取路径有问题,先在本地尝试
- 使用了阿里镜像服务,执行时还在dockerhub上拉取?
- 因为上一篇中使用了docker-compose,pull完后就docker-compose up,执行docker-compose里的指令,这里其实设置images时使用阿里镜像的地址,一样使用docker-compose,为了直接使用脚本,就不另外建文件了
- linux使用变量总是出错?
- 在给镜像地址一个变量时(这里是registry.cn-shenzhen.aliyuncs.com),总是出错,执行app_url="registry.cn-shenzhen.aliyuncs.com"才发现这条出错,于是把它直接写死里面了。。
发现还需要学的:
- linux操作学习
- 脚本语言学习
最后,感谢前辈们的无私分享,谢谢。