• windows系统中开发的GO程序生成docker镜像并部署到阿里云服务(linux系统)的操作说明


    本文简述将go程序生成docker镜像的操作方法,以及如何部署到阿里云服务。其中go程序在windows系统中开发,阿里云服务的操作系统为linux(centos7.9),以下为流程示意图:

    一、window系统中开发go程序

    程序实现的功能:

    http响应返回配置文件中设置的服务名

    代码实现:
    1. package main
    2. import (
    3. "flag"
    4. "fmt"
    5. "io"
    6. "log"
    7. "os"
    8. "github.com/gin-gonic/gin"
    9. "gopkg.in/yaml.v2"
    10. )
    11. var flagconf string
    12. var cfg Config
    13. type Server struct {
    14. Port int `yaml:"port"`
    15. Address string `yaml:"address"`
    16. Name string `yaml:"name"`
    17. }
    18. type Config struct {
    19. Server Server `yaml:"server"`
    20. }
    21. func initConfig() {
    22. // 定义命令行标志
    23. flag.StringVar(&flagconf, "conf", "./data/conf", "config path, eg: -conf config.yaml")
    24. // 解析命令行标志
    25. flag.Parse()
    26. // 打开YAML配置文件
    27. file, err := os.Open(flagconf + "/config.yaml")
    28. if err != nil {
    29. log.Fatalf("Error opening file: %v", err)
    30. }
    31. defer file.Close()
    32. // 读取文件内容
    33. data, err := io.ReadAll(file)
    34. if err != nil {
    35. log.Fatalf("Error reading file: %v", err)
    36. }
    37. // 解析YAML配置文件
    38. err = yaml.Unmarshal(data, &cfg)
    39. if err != nil {
    40. log.Fatalf("Error parsing YAML: %v", err)
    41. }
    42. }
    43. func main() {
    44. //初始化配置文件
    45. initConfig()
    46. //从配置文件中获取服务名
    47. svrname := cfg.Server.Name
    48. //gin框架处理http请求
    49. r := gin.Default()
    50. r.GET("/", func(context *gin.Context) {
    51. context.String(200, fmt.Sprintf("Hello, World! hello, %v", svrname))
    52. })
    53. r.Run(":8080")
    54. }
    配置文件路径:

    ./data/conf/config.yaml

    1. server:
    2. port: 8080
    3. address: localhost
    4. name: 这是window系统开发环境中的aliyun_docker
     工程目录结构:

    效果展示:

    二、编译go程序可执行文件

    由于阿里云服务选择的系统为linux系统(centos7.9),所以在windows系统中需要进行交叉编译,编译可在linux系统中运行的可执行文件。步骤如下:

    1、windows命令窗口中设置go环境变量GOOS=linux
    1. //在windows命令窗口中设置
    2. set GOOS=linux

    注意:set GOOS=linux 只是临时生效,当退出当前命令窗口后,GOOS还是原来的值windows。如需设置为永久生效,需执行:go env -w GOOS=linux

    2、编译生产linux下的可执行文件
    go build -o ./bin/aliyun-docker main.go

    三、编写Dockerfile文件

    Dockerfile 是一个用于自动构建 Docker 镜像的脚本文件(注意文件名必须为大写字母开头的Dockerfile),内容如下:

    1. # 使用debian基础镜像
    2. FROM debian:stable-slim
    3. # 将当前目录下的所有内容复制到容器的 /app 内
    4. COPY . /app
    5. # 设置工作目录为 /app
    6. WORKDIR /app
    7. # 暴露 8080 端口
    8. EXPOSE 8080
    9. # 声明一个卷,这些卷可以被挂载到容器中,以便持久化和共享数据
    10. VOLUME /data/conf
    11. # 更改文件的执行权限,重要!!!与基础镜像或系统有关
    12. RUN chmod +x /app/aliyun-docker
    13. # 容器启动时运行的命令
    14. CMD ["./aliyun-docker", "-conf", "/data/conf"]

    四、构建Docker镜像

    注册和购买阿里云服务后(个人账户可免费使用3个月),创建一个centos服务实例,并安装 docker(此处忽略具体操作,可自行搜索相关操作方法)。

    1、进入阿里云服务实例并远程连接

    2、远程连接中打开文件管理,将编译的可执行文件aliyun-docker、Dockerfile、config.yaml三个文件上传到新创建的文件夹aliyuntest文件夹中

     3、远程连接的页签切换到终端,进入到aliyuntest目录,构建docker镜像
    1. # -t 表示指定镜像的名称和标签
    2. # 特别注意末尾的 .: 表示 Dockerfile 所在的上下文目录
    3. docker build -t aliyundocker .

    4、查看新生成的 docker 镜像
    docker images

    五、阿里云服务中运行Docker容器

    1、阿里云实例的安全组中增加8080端口,以便我们编写的 aliyun-docker 服务能正常访问

    2、远程连接切换到文件管理,将 config.yaml 拷贝到 /data/conf文件夹下

    3、运行镜像 aliyundocker,生成 docker 容器

    1. # -- name 指定容器名为 ali
    2. # -p 8080:8080 将容器的 8080 端口映射到宿主机的 8080 端口
    3. # -v /data/conf:/data/conf 将容器的 /data/conf 目录映射到宿主机的 /data/conf 目录,实现数据或文件持久化,数据不随容器的删除而丢失
    4. docker run --name ali -p 8080:8080 -v /data/conf:/data/conf aliyundocker

    注意:①如果报错 exec: "./aliyun-docker": permission denied: unknown,是因为执行文件权限不够,需要在 Dockerfile 中增加命令 RUN chmod +x /app/aliyun-docker

    重要(今后补充详细例子):如果存在多个容器直接相互访问,需要创建一个新的网络桥接(docker network newnet),然后运行各个容器时增加命令 -network newnet,这样各个容器之间能根据容器名访问,而不用根据IP访问(容器的IP会变化)。

    六、测试

    window系统浏览器输入阿里云服务中docker容器的请求IP和端口,检查是否能打印出配置文件中的服务名。

  • 相关阅读:
    Vue基础
    基建融资与预算软约束(2015年A股大牛市与“流动性堰塞湖”)-中国视角下的宏观经济
    虚拟机安装Centos7配置静态地址
    架构解析:Dubbo3 应用级服务发现如何应对双 11 百万集群实例
    Cheat Engine 修改器获取内存数据心路历程, THREADSTACK0 C# .NET VB 获取基址 CE修改器
    Mysql判断字段是否为NULL
    面试问题-除了threading还会哪种并发
    四旋翼无人机学习第3节--cadence原理图库创建以及基础元器件绘制
    【基础算法 3.3】树与图的DFS和BFS(完结)
    android app启动卡在启动页面,无法启动。鸿蒙系统armony H4.0
  • 原文地址:https://blog.csdn.net/longchanghua_enshi/article/details/139777090