blog 使用 Github-Actions 部署 docker 服务器
前言
在现代软件开发中,持续集成和持续部署(CI/CD)是提高开发效率和确保软件质量的重要实践。Github Actions 是一个强大的工具,可以帮助我们自动化构建、测试和部署代码。本文将介绍如何使用 Github Actions 部署 docker 服务器。
准备工作
在开始之前,我们需要准备以下条件:
- 一个 Github 仓库
- 一个 Dockerfile 文件
- 一个 Github Actions 工作流
- 一个 Docker 服务器 (可以买轻量服务器安装 docker)
Github 仓库
首先,我们需要创建一个 Github 仓库。如果你还没有一个仓库,可以在 Github 上创建一个新的仓库 clone 到本地。
创建 Dockerfile
因为我们用到 docker 镜像,所以需要在仓库的根目录下创建一个 Dockerfile 文件,内容如下:
示例
# 使用官方的 Node.js 镜像作为基础镜像
FROM node:20
# 设置工作目录
WORKDIR /app
# 复制 package.json 和 package-lock.json
COPY package*.json ./
# 安装依赖
RUN npm install
# 复制应用程序代码
COPY . .
# 暴露应用程序端口
EXPOSE 8888
# 运行应用程序
CMD ["npm","run","docs:dev"]
文件作用说明
Dockerfile:用于构建 Docker 镜像的文件 此时构建的镜像并不是打包后 dist 静态文件而是一个运行环境(运行环境包含 vue 项目运行所需要的 node 环境)。
引发思考问题
这里考虑
COPY . .
将当前目录下的所有文件复制到镜像中, node_modules 会不会被复制?答案是不会, 因为 workflows 是在代码 push 后触发的,仓库里的是 node_modules 的(因为没提交 node_modules)。
这里就牵扯到执行机制的问题,在 code push 后,才会触发 workflows 执行,而在触发 workflows 时候才会去执行 dockerfile 文件。
什么时候运行
CMD ["npm", "run", "docs:dev"]
指令?构建镜像:Dockerfile 中的所有指令(如 COPY, RUN 等)会在构建镜像时执行,但 CMD 指令只是被记录下来。从而启动应用程序。
启动容器:当你使用 docker run 命令基于该镜像启动一个新容器时,CMD ["npm", "run", "docs:dev"] 才会被执行,从而启动应用程序。
注意 ⭐⭐⭐
- docker 配置文件的细节 :比如 npm run docs:dev 后面跟随的 --post 启动端口, dockerfile 配置文件暴露端口, 以及 workflows 文件镜像启动端口都要一致。
创建 Github Actions 工作流
在仓库的根目录下创建一个 .github/workflows
目录,然后在目录下创建一个 main.yml
文件,内容如下:
示例
name: CI/CD Pipeline
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Log in to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push Docker image
uses: docker/build-push-action@v2
with:
context: .
push: true
tags: ${{ secrets.DOCKER_USERNAME }}/blog:latest
deploy:
runs-on: ubuntu-latest
needs: build
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Setup SSH key
run: |
mkdir -p ~/.ssh
echo "${{ secrets.SSH_PRIVATE_KEY }}" | tr -d '\r' > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
shell: bash
- name: Add known hosts
run: |
ssh-keyscan -H 118.89.198.69 >> ~/.ssh/known_hosts
shell: bash
- name: Deploy to server
run: |
ssh -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa root@118.89.198.69 "docker pull ${{ secrets.DOCKER_USERNAME }}/blog:latest && docker stop blog || true && docker rm blog || true && docker run -d --name blog -p 80:8888 ${{ secrets.DOCKER_USERNAME }}/blog:latest"
shell: bash
文件命令说明
on: push: branches: - main
表示当 main 分支有 push 操作时,会触发工作流。runs-on: ubuntu-latest
表示在 ubuntu 环境下运行。steps
表示工作流的步骤。uses: actions/checkout@v2
表示使用 actions/checkout 动作来 checkout 代码。uses: docker/setup-buildx-action@v1
表示使用 docker/setup-buildx-action 动作来 setup docker buildx。uses: docker/login-action@v1
表示使用 docker/login-action 动作来 login docker。uses: docker/build-push-action@v2
表示使用 docker/build-push-action 动作来 build 和 push docker image。
工作流解释
build
阶段:使用
actions/checkout@v2
动作来 checkout 代码。使用
docker/setup-buildx-action@v1
动作来 setup docker buildx。使用
docker/login-action@v1
动作来 login docker。使用
docker/build-push-action@v2
动作来 build 和 push docker image。
deploy
阶段:使用
actions/checkout@v2
动作来 checkout 代码。使用
setup-ssh
动作来 setup ssh。使用
ssh
命令来 deploy 到服务器。
注意
SSH_PRIVATE_KEY
需要从 Github 仓库的 Secrets 中获取。DOCKER_USERNAME
和DOCKER_PASSWORD
需要从 Github 仓库的 Secrets 中获取。
实现以下步骤
检出代码。
设置 Docker Buildx。
登录 DockerHub。
构建并推送 Docker 镜像。
设置 SSH 密钥。
添加远程服务器的已知主机。
部署新的 Docker 容器到远程服务器。
总结
通过以上步骤,push 代码后我们成功地使用 Github Actions 部署到了一个 Docker 服务器。希望本文对你有所帮助,让你更好地理解和使用 Github Actions 部署至 Docker 服务器。