技术咨询、项目合作、广告投放、简历咨询、技术文档下载
点击这里 联系博主
# 私有项目如何使用 github action 打包 docker 镜像并部署到服务器
总有一些项目不太想开源,为了方便部署 希望改完代码之后通过 docker 自动部署到不同的服务器上。本文简单讲述一下整个流程,希望对你有帮助
# 一、先来创建一个项目
首先在 github 上面创建一个私有项目
此处主要以一个前端项目为例(使用 umi 创建的项目)
mkdir myapp && cd myapp
pnpm dlx create-umi@latest
# 二、聊聊 Docker 的基础命令
# 1. 镜像常见相关命令
# 去下载镜像,先从本地找,没有去镜像,最后没有去 hub,标签不写默认为 lastest
docker pull [镜像名]:[标签Tag]
# 列出本机的所有 image 文件,-a 显示本地所有镜像(包括中间镜像),-q 只显示镜像ID,--digests 显示镜像的摘要信息
docker image ls
docker images
# 删除 image 文件, -f 强制删除镜像
docker rmi [镜像名][:标签Tag]
docker rmi [镜像名1][:标签Tag] [镜像名2][:标签Tag] # 删多个
docker rmi $(docker ps -a -q) # 删全部,后面是子命令
# 查询镜像名称,--no-trunc 显示完整的镜像描述,--filter=stars=30 列出star不少于指定值的镜像,--filter=is-automated=true 列出自动构建类型的镜像
docker search [关键字]
# 下载镜像,标签 tag 不写默认为 lastest,也可以自己加比如 :3.2.0
docker pull [镜像名][:标签Tag]
# 2. 容器常见相关命令
# 列出本机正在运行的容器,-a 列出本机所有容器包括终止运行的容器,-q 静默模式只显示容器编号,-l 显示最近创建的容器
docker container ls # 等价于下面这个命令
docker ps
# 新建并启动容器; 这个一般用的比较多
docker run [option] [容器名]
# 启动容器
docker start [容器ID]/[容器Names]
# 重启容器
docker restart [容器ID]/[容器Names]
docker stop [容器ID] # 从容终止,相当于向容器里面的主进程发出 SIGTERM 信号,然后过一段时间再发出 SIGKILL 信号
docker stop $(docker ps -a -q) # 终止所有容器
# 终止运行的容器文件,依然会占据硬盘空间,可以使用 docker container rm 命令删除,-f 强制删除可以删除正在运行的容器
docker rm [容器ID]
docker rm `docker ps -aq` # 删除所有已经停止的容器,因为没停止的rm删不了需要加-f
# 设置容器在docker启动时自动启动
$ docker container update --restart=always [容器名字]
这里要特别说一下 docker run
的 option
,因为最常用:
- --name 为容器指定一个名称;
- -d 容器启动后进入后台,并返回容器 ID,即启动守护式容器;
- -P 随机端口映射;
- -p 80:8080 将本地 80 端口映射到容器的 8080 端口;
- -i 以交互模式运行容器,通常与 -t 同时使用;
- -t 为容器重新分配一个伪输入终端,容器的 Shell 会映射到当前的 Shell,然后在本机窗口输入的命令,就会传入容器,通常与 -i 同时使用;
- --rm 在容器终止运行后自动删除容器文件;
- --restart=always 设置容器自启动;
- -v /xxx:/yyy 映射命令,把本机的 xxx 目录映射到容器中的 yyy 目录,也就是说改变本机的 xxx 目录下的内容, 容器 yyy 目录中的内容也会改变;
#
# 三、编写 Dockerfile
由于 umi
构建之后产物会放在 dist
目录下面,所以我们可以编写如下的 Dockerfile;
Dockerfile 用于声明镜像执行的步骤; 对于如下命令不熟悉的同学可以点击查看此文章 (opens new window)
FROM nginx:latest # 使用nginx 作为基础镜像
LABEL maintainer "你的github邮箱"
ADD ./dist /usr/share/nginx/html # 将产物放在 nginx 的 /usr/share/nginx/html 目录下
EXPOSE 80 # 暴露出80 端口
# 四、编写 github action
由于 hub.docker.io
目前只支持一个 私有镜像,所以我们暂不考虑使用;推荐大家使用 github
自带的 镜像源 ghcr.io
前置准备工作
- 去 https://github.com/settings/tokens (opens new window) 生成一个 token,注意此 token 需要读写 packages 等权限 详情请见这里 (opens new window)
- 准备好你的要部署的服务器的 账号 和密码(当前页可以使用秘钥登录,这里暂且使用密码)
- 想好你的镜像名称(此处以 web-image 为例)
在.github/workflows
目录创建一个 publish-image.yml
name: Publish Image
on:
push: # push 到主分支自动 发布
branches: ["main"]
paths-ignore: # 忽略一些不必要的文件
- ".gitignore"
- "README.md"
- ".vscode/**"
pull_request:
branches: ["main"]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: docker/login-action@v1
with:
registry: ghcr.io # 声明镜像源
username: ${{ github.actor }} # 当前github 用户名
password: ${{ secrets.HUB_GITHUB_TOKEN }} # 需要去 https://github.com/settings/tokens 生成一个 名为 token,注意此token 需要读写 packages 等权限
- uses: actions/setup-node@v2
with:
node-version: "16.14"
- uses: actions/cache@v2
id: cache
with:
path: node_modules
key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
# Runs a single command using the runners shell
- name: pnpm install
run: npm install -g pnpm --registry https://registry.npm.taobao.org
- name: Install
if: steps.cache.outputs.cache-hit != 'true'
run: npm config set registry https://registry.npm.taobao.org && pnpm i
- name: Build
run: npm run build
- name: Show Dir
run: ls
- name: Build the Docker image
run:
| # 使用 上一步写的 Dockerfile 构建镜像并发布到私有仓库; 发布完成可以去 https://github.com/MrGaoGang?tab=packages 查看
docker build . --file Dockerfile --tag ghcr.io/你的github名称/web-image:latest
docker push ghcr.io/你的github名称/web-image:latest
- name: 更新服务器
uses: appleboy/ssh-action@v0.1.10
with:
host: ${{ secrets.SERVER_HOST }} # 服务器ip地址 ; 需要去仓库的 settings/secrets/actions 去创建
username: ${{ secrets.SERVER_USER }} # 服务器用户名称;需要去仓库的 settings/secrets/actions 去创建
password: ${{ secrets.SERVER_PWD }} # 服务器密码;需要去仓库的 settings/secrets/actions 去创建
port: ${{ secrets.SERVER_PORT }} # 服务器端口,默认22;需要去仓库的 settings/secrets/actions 去创建
script: | # 重启更新镜像
docker stop web-image
docker rm web-image
docker login -u 你的github名称 -p 你的github token https://ghcr.io
docker pull ghcr.io/你的github名称/web-image:latest
docker run -dp 80:80 --restart=always --name web-image ghcr.io/你的github名称/web-image
# 上面使用 80端口启动,当然你也可以换成自己想要的端口
# 五、私有 docker 镜像
上面我们使用到 github
的私有镜像 ghcr
; 当然你也可以自己基于 docker/register 弄一个私有镜像; 可以在自己服务器上运行如下命令
# 1、下载镜像
docker pull registry:2
# 2、运行容器
$ docker run -d --restart=always -v /opt/registry:/var/lib/registry -p 5000:5000 --name myregistry registry:2
然后再本地构建镜像并上传镜像:
# 私有化构建
$ docker build . --file Dockerfile --tag 服务器ip地址:5000:web-image:latest
# 私有化发布
$ docker push 服务器ip地址:5000:web-image:latest
# 注意,上传镜像时报错了:http: server gave HTTP response to HTTPS client
# 【在docker push 的客户端执行,而不是私有服务器】解决办法1:
# 1、编辑 /etc/docker/daemon.json,在文件中写入:(如果你的镜像实在linux/centos 上)
{ "insecure-registries":["服务器ip地址:5000"] }
# 【在docker push 的客户端执行,而不是私有服务器】或者 解决办法2 (如果你的镜像实在linux/centos 上)
$ sudo vim /usr/lib/systemd/system/docker.service
# 修改里面的内容 为
ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock --insecure-registry 你的ip:5000
# 2、重启生效:
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
# 再次上传,问题解决:
$ docker push 服务器ip地址:5000:web-image:latest
如果你使用的是 windows/mac 可以直接在 docker 的设置里面添加
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"features": {
"buildkit": true
},
"insecure-registries": ["你的服务器ip地址:5000"]
}
- 本文链接: https://mrgaogang.github.io/other/docker_deploy_github.html
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 许可协议。转载请注明出处!