SSF0SSF0
首页
前端
  • Node
  • Go
  • C#
  • MySql
  • Bash
  • Git
  • Docker
  • VuePress
  • CI/CD
  • 服务器
  • 网站
  • 学习资料
  • 软件
Timeline
Github
标签
分类
首页
前端
  • Node
  • Go
  • C#
  • MySql
  • Bash
  • Git
  • Docker
  • VuePress
  • CI/CD
  • 服务器
  • 网站
  • 学习资料
  • 软件
Timeline
Github
标签
分类
  • Bash

    • Bash 获取路径在不同类型电脑的区别
  • Git

    • Git 使用 ssh 与 https 的区别
    • Git 回滚、重置与变基
    • 文件名大小写发生变化的坑
    • Git 提交信息规范解读与实践指南
    • Git 历史邮箱统一 + 推送 GitHub 后的远程分支处理指南
  • Docker

    • Docker 命令大全
    • nginx 镜像部署静态文件
    • Docker 运行命令说明
    • 使用 node 镜像运行本地项目
    • 挂载和卷的区别
    • Docker 打包多平台镜像
    • Docker 使用 mysql
    • Docker 容器网络访问问题总结
  • VuePress

    • 使用 VuePress 搭建个人博客概括
  • CI/CD

    • blog 使用 Github-Actions 部署 docker 服务器
  • 服务器

    • 腾讯云使用 ssh 连接服务器(Linux 实例)
    • ssl 证书安装到 docker 服务器
    • 操作系统与架构
    • ssh 连接时长问题
  • 掌握 hosts 文件:本地开发、域名重定向与回调处理完全指南
  • Cloudflare DNS与代理:完全指南

blog 使用 Github-Actions 部署 docker 服务器

前言

在现代软件开发中,持续集成和持续部署(CI/CD)是提高开发效率和确保软件质量的重要实践。Github Actions 是一个强大的工具,可以帮助我们自动化构建、测试和部署代码。本文将介绍如何使用 Github Actions 部署 docker 服务器。

准备工作

在开始之前,我们需要准备以下条件:

  1. 一个 Github 仓库
  2. 一个 Dockerfile 文件
  3. 一个 Github Actions 工作流
  4. 一个 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"]

文件作用说明

  1. Dockerfile:用于构建 Docker 镜像的文件 此时构建的镜像并不是打包后 dist 静态文件而是一个运行环境(运行环境包含 vue 项目运行所需要的 node 环境)。

  2. 引发思考问题

    • 这里考虑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"] 才会被执行,从而启动应用程序。

  3. 注意 ⭐⭐⭐

    • 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

文件命令说明

  1. on: push: branches: - main 表示当 main 分支有 push 操作时,会触发工作流。

  2. runs-on: ubuntu-latest 表示在 ubuntu 环境下运行。

  3. steps 表示工作流的步骤。

  4. uses: actions/checkout@v2 表示使用 actions/checkout 动作来 checkout 代码。

  5. uses: docker/setup-buildx-action@v1 表示使用 docker/setup-buildx-action 动作来 setup docker buildx。

  6. uses: docker/login-action@v1 表示使用 docker/login-action 动作来 login docker。

  7. uses: docker/build-push-action@v2 表示使用 docker/build-push-action 动作来 build 和 push docker image。

工作流解释

  1. 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。

  2. deploy 阶段:

    • 使用 actions/checkout@v2 动作来 checkout 代码。

    • 使用 setup-ssh 动作来 setup ssh。

    • 使用 ssh 命令来 deploy 到服务器。

注意

  1. SSH_PRIVATE_KEY 需要从 Github 仓库的 Secrets 中获取。

  2. DOCKER_USERNAME 和 DOCKER_PASSWORD 需要从 Github 仓库的 Secrets 中获取。

实现以下步骤

  1. 检出代码。

  2. 设置 Docker Buildx。

  3. 登录 DockerHub。

  4. 构建并推送 Docker 镜像。

  5. 设置 SSH 密钥。

  6. 添加远程服务器的已知主机。

  7. 部署新的 Docker 容器到远程服务器。

总结

通过以上步骤,push 代码后我们成功地使用 Github Actions 部署到了一个 Docker 服务器。希望本文对你有所帮助,让你更好地理解和使用 Github Actions 部署至 Docker 服务器。

最后更新时间:
贡献者: 何风顺