如何使用Docker打包,部署Go项目

一、为什么使用Docker打包部署项目
  • 与宿主机隔离,增加安全性
  • 使用容器部署,便于服务编排,管理
  • 对接云原生,便于服务迁移
  • 轻量高效,操作简单
二、docker-compose和Dockerfile的功能/联系
  • dockerfile功能简介
    *dockerfile是用来构建docker镜像的文件!*命令参数脚本!,其中包含 docker build 收集映像所需的命令,完成镜像组装,Docker 可以通过读取 Dockerfile 中的指令自动构建镜像。
    配置解析:Dockerfile文件全面详解 - 知乎 (zhihu.com)
  • docker-compose功能简介
    Docker Compose是一个用来定义和运行复杂应用的Docker工具,复杂的Docker容器的应用,通常由多个容器组成,在这种情况下,单独的管理单一多个容器变得复杂,使用Compose 通过一个配置文件可以管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,达到对docker容器的服务编排和管理的作用。
  • 区别与联系
  • dockerfile是用于生成适用于所部署服务运行环境的镜像的打包工具
  • docker-compse是基于dockerfile生成的镜像的多容器服务编排,相当于多个docker run命令的统一管理。
  • docker和docker-compose可以完成从服务基础环境镜像到服务容器化部署到服务容器化运行的全部流程,完成服务上云的目的。
三、项目通过docker启动的基本原理
  • 一般来说,项目开发完成后,会通过编译器编译成对应操作系统(指令集)可以识别执行的代码程序,比如.exe文件,二进制可执行文件,然后由系统将程序拉起,分配对应的进程去处理程序的具体操作,实现具体功能。
    即:项目代码->编译->机器语言->系统加载到内存->进程管理->功能表现
  • 作为开发者,一般只需要关注项目代码编码,以及对编译后的程序进程管理编排,比如在Linux中,常见的使用system来管理服务,或者使用supervisor管理,在本文中,虽然标题是通过docker启动,但其实本质也是通过这些基础的工具/命令来管理服务,其原理支撑是:
  • docker技术本质上是容器虚拟技术,及相对于宿主机进行环境虚拟隔离,使用过VMware产品的应该不陌生,docker相比VMware的技术,则更加轻量、高效且用于操作简单,交付速度更快。
  • docker通过多个容器共用宿主机的内核,构建对应的镜像,能够达到资源消耗更低。
  • 每个容器可以定制自己的容器环境,比如基于centos:7版本镜像,基于基础镜像还可以安装supervisor等管理服务,将项目编译后的产物,则可以通过这些管理服务,或者基本的nohub来拉起服务,这些动作都可以通过docker和docker-compose来实现。

docker部署jeecg项目 docker部署go_centos

四、创建一个Gin服务
package main

import "github.com/gin-gonic/gin"

func main() {
    //Default返回一个默认的路由引擎
    r := gin.Default()
    r.GET("/say_hello", func(c *gin.Context) {
        //输出json结果给调用方
        c.JSON(200, gin.H{
            "message": "hello world",
        })
    })
    // listen and serve on 0.0.0.0:8080
    r.Run() 
}
五、编写dockerfile,基于centos镜像
  • 上面的gin成打包执行go build后移动到 /opt/result下面
  • dockerfile:比如基于centos7,更佳的可以基于alpine镜像来;基于dockerfile,执行命令:
FROM centos:7

# 初始化目录,用于存放二进制文件
RUN mkdir -p /opt/gin_hello/cmd

# 复制文件到对应位置,/result为当前目录下的相对路径,完整为/opt/result
COPY "./result/" /opt/gin_hello/cmd

# 安装基础工具链
RUN yum install -y gcc \
                   libtool \
                   make \
                   wget  && \
    yum clean all

# 安装go-1.17
#RUN yum install -y wget
#RUN wget https://golang.org/dl/go1.17.linux-amd64.tar.gz
#RUN tar -C /usr/local -xzf go1.17.linux-amd64.tar.gz
#ENV PATH=$PATH:/usr/local/go/bin

# CMD ,在这里定义容器启动时执行哪个命令拉起服务
CMD ["/opt/gin_hello/cmd/xxx"]
  • 打包镜像:
docker build -f $dockerfile_name . -t centos_gin:latest
# 如果打包镜像没有tag,再次执行
docker tag centos_gin:latest centos_gin:latest
六、编写docker-compose
version: '3'
services:
  gin_dc:
    restart: always
    image: centos_gin:latest
    container_name: gin_hello
    stdin_open: true
    tty: true
    privileged: true
    working_dir: /opt/
    ports:
      - "8080:8080"
    volumes:
      - /opt/result/:/opt/result/
七、 部署打包操作
docker-compose -f  ${docker_compose_name} -p ${PROJECT_NAME} up -d
八、全自动部署(使用脚本代替手动)
  • 将上述命令使用脚本编排顺序即可,使用对应的参数触发,例如编写两个脚本
  • dc_images.sh : 操作dockerfile生成基础镜像
  • dc_opt.sh: 操作docker-compose,基于基础镜像,生成容器,可操作选项:up/down