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

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

一、window系统中开发go程序

程序实现的功能:

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

代码实现:
Go 复制代码
package main

import (
	"flag"
	"fmt"
	"io"
	"log"
	"os"

	"github.com/gin-gonic/gin"
	"gopkg.in/yaml.v2"
)

var flagconf string

var cfg Config

type Server struct {
	Port    int    `yaml:"port"`
	Address string `yaml:"address"`
	Name    string `yaml:"name"`
}

type Config struct {
	Server Server `yaml:"server"`
}

func initConfig() {
	// 定义命令行标志
	flag.StringVar(&flagconf, "conf", "./data/conf", "config path, eg: -conf config.yaml")

	// 解析命令行标志
	flag.Parse()

	// 打开YAML配置文件
	file, err := os.Open(flagconf + "/config.yaml")
	if err != nil {
		log.Fatalf("Error opening file: %v", err)
	}
	defer file.Close()

	// 读取文件内容
	data, err := io.ReadAll(file)
	if err != nil {
		log.Fatalf("Error reading file: %v", err)
	}

	// 解析YAML配置文件
	err = yaml.Unmarshal(data, &cfg)
	if err != nil {
		log.Fatalf("Error parsing YAML: %v", err)
	}
}

func main() {

	//初始化配置文件
	initConfig()

	//从配置文件中获取服务名
	svrname := cfg.Server.Name

	//gin框架处理http请求
	r := gin.Default()
	r.GET("/", func(context *gin.Context) {
		context.String(200, fmt.Sprintf("Hello, World! hello, %v", svrname))
	})
	r.Run(":8080")
}
配置文件路径:

./data/conf/config.yaml

Go 复制代码
server:  
  port: 8080  
  address: localhost
  name: 这是window系统开发环境中的aliyun_docker
工程目录结构:
效果展示:

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

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

1、windows命令窗口中设置go环境变量GOOS=linux
Go 复制代码
//在windows命令窗口中设置
set GOOS=linux

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

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

三、编写Dockerfile文件

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

bash 复制代码
# 使用debian基础镜像
FROM debian:stable-slim

# 将当前目录下的所有内容复制到容器的 /app 内
COPY . /app

# 设置工作目录为 /app
WORKDIR /app

# 暴露 8080 端口
EXPOSE 8080

# 声明一个卷,这些卷可以被挂载到容器中,以便持久化和共享数据
VOLUME /data/conf

# 更改文件的执行权限,重要!!!与基础镜像或系统有关
RUN chmod +x /app/aliyun-docker

# 容器启动时运行的命令
CMD ["./aliyun-docker", "-conf", "/data/conf"]

四、构建Docker镜像

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

1、进入阿里云服务实例并远程连接
2、远程连接中打开文件管理,将编译的可执行文件aliyun-docker、Dockerfile、config.yaml三个文件上传到新创建的文件夹aliyuntest文件夹中
3、远程连接的页签切换到终端,进入到aliyuntest目录,构建docker镜像
bash 复制代码
# -t 表示指定镜像的名称和标签   
# 特别注意末尾的 .: 表示 Dockerfile 所在的上下文目录
docker build -t aliyundocker .
4、查看新生成的 docker 镜像
bash 复制代码
docker images

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

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

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

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

bash 复制代码
# -- name 指定容器名为 ali
# -p 8080:8080 将容器的 8080 端口映射到宿主机的 8080 端口
# -v /data/conf:/data/conf 将容器的 /data/conf 目录映射到宿主机的 /data/conf 目录,实现数据或文件持久化,数据不随容器的删除而丢失

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和端口,检查是否能打印出配置文件中的服务名。

相关推荐
Dontla41 分钟前
go语言Windows安装教程(安装go安装Golang安装)(GOPATH、Go Modules)
开发语言·windows·golang
铁东博客1 小时前
Go实现周易大衍筮法三变取爻
开发语言·后端·golang
Benszen1 小时前
Docker容器化技术实战指南
运维·docker·容器
Hommy881 小时前
【开源剪映小助手】Docker 部署
docker·容器·开源·github·aigc
斯普信云原生组3 小时前
Prometheus 环境监控虚机 Redis 方案(生产实操版)
运维·docker·容器
喵了几个咪3 小时前
如何在 Superset Docker 容器中安装 MySQL 驱动
mysql·docker·容器·superset
工具罗某人3 小时前
docker compose部署kafka集群搭建
docker·容器·kafka
Luke~4 小时前
阿里云计算巢已上架!3分钟部署 Loki AI 事故分析引擎,SRE 复盘时间直接砍掉 80%
人工智能·阿里云·云计算·loki·devops·aiops·sre
Database_Cool_4 小时前
基于PolarDB Mem0 为 OpenClaw 构建高效记忆系统(阿里云开发者)
阿里云·云计算
wechat_Neal5 小时前
Golang的车载应用场景
开发语言·后端·golang