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

news2025/2/27 4:52:35

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

一、window系统中开发go程序

程序实现的功能:

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

代码实现:
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

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

效果展示:

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

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

1、windows命令窗口中设置go环境变量GOOS=linux
//在windows命令窗口中设置
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),内容如下:

# 使用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镜像
# -t 表示指定镜像的名称和标签   
# 特别注意末尾的 .: 表示 Dockerfile 所在的上下文目录
docker build -t aliyundocker .

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

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

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

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

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

# -- 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 newnt,这样各个容器之间能根据容器名访问,而不用根据IP访问(容器的IP会变化)。

六、测试

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1841440.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用JAVA语言调用GLM-4接口实战指南

一、什么是API接口 API(Application Programming Interface,应用程序编程接口)是一种软件接口,它定义了不同应用程序之间如何相互通信、交互。API接口分为很多种,常见的有Web API,数据库API,操…

windows文件及文件夹加密后无法解除加密

windows加密文件及文件夹的方法 window EFS加密 1、右键点击文件夹选择“属性”,在属性常规窗口中点击“高级”。 2、勾选“加密内容以便保护数据”,点击“确定”。 3、选择加密范围,点击“确定”即可加密。 使用这种方法加密之后文件夹将只…

赋能AI未来,景联文科技推出高质量亿级教育题库、多轮对话以及心理大模型数据

当前,大模型正如雨后春笋般不断涌现,不断推动着大模型产业的应用实践进入加速发展的新阶段。 景联文科技是AI数据服务公司,提供海量优质大模型数据集,涵盖文本、图像、视频、音频等多类型数据,致力于为不同训练阶段的算…

Stable Diffusion 3 大模型文生图实践

windows教程2024年最新Stable Diffusion本地化部署详细攻略,手把手教程(建议收藏!!)_stable diffusion 本地部署-CSDN博客 linux本地安装教程 1.前期准备工作 1)创建conda环境 conda create --name stable3 python3.10 2)下…

【C++ | 友元(friend)】友元函数、友元类、友元成员函数详解及例子代码

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

「iOS」UI——无限轮播图实现与UIPageControl运用

「OC」UI 文章目录 「OC」UI无限轮播图的实现以及UIPageControl的实际运用明确要求简单滚动视图的实现UIPageControl的实现设置NSTimer实现自动移动补充实现 进行无限滚动视图的修改思路实现 完整代码展示 无限轮播图的实现以及UIPageControl的实际运用 明确要求 我们要实现一…

LabVIEW与数字孪生

LabVIEW与数字孪生技术在工业自动化、智慧城市、医疗设备和航空航天等领域应用广泛,具备实时数据监控、虚拟仿真和优化决策等特点。开发过程中需注意数据准确性、系统集成和网络安全问题,以确保数字孪生模型的可靠性和有效性。 经典应用:LabV…

算法人生(23):跟着“生成对抗网络”思维走出“拖延”

生成对抗网络(GANs)是一种深度学习模型,其核心思想是通过两个神经网络——生成器和判别器的对抗过程来学习数据分布,进而生成新的、类似真实数据的样本。它基本原理基于一个博弈论框架,其中生成器尝试生成尽可能逼真的…

Solkane 冷媒性能计算软件-管路计算

下载 制冷管道设计 制冷管路的压降会降低制冷量,增大功耗。但不同部分的管路允许的压降的数量级是不同的。 制冷管路的压降不是唯一的考虑因素,制冷剂的流速往往比压降更重要。 制冷系统中,压缩机、阀、汽液分离器或其他附件上的连接件的尺…

地下管线管网三维建模系统MagicPipe3D

地下管网是保障城市运行的基础设施和“生命线”。随着实景三维中国建设的推进,构建地下管网三维模型与地上融合的数字孪生场景,对于提升智慧城市管理至关重要!针对现有三维管线建模数据差异大、建模交互弱、模型效果差、缺乏语义信息等缺陷&a…

swagger下载文件名中文乱码、swagger导出文件名乱码、swagger文件导出名称乱码、解决swagger中文下载乱码bug

文章目录 一、场景描述:swagger导出文件名称乱码二、乱码原因三、解决方法3.1、方法一、在浏览器中输入地址下载3.2、方法二、swagger升级为2.10.0及以上 四、可能遇到的问题4.1、DocumentationPluginsManager.java:152 一、场景描述:swagger导出文件名称…

时间复杂度的相关概念

1. 统计时间增长趋势 时间复杂度分析统计的不是算法运行时间,而是算法运行时间随着数据量变大时的增长趋势,也就是算法运行时间与输入数据的关系。 // 算法 A 的时间复杂度:常数阶 function algorithm_A(n) {console.log(0); } // 算法 B 的…

反激开关电源EMI电路选型及计算

EMI :开关电源对电网或者其他电子产品的干扰 EMI :传导与辐射 共模电感的滤波电路,La和Lb就是共模电感线圈。这两个线圈绕在同一铁芯上,匝数和相位都相 同(绕制反向)。 这样,当电路中的正常电流(差模&…

快速搭建Jenkins自动化集成cicd工具

一、简介 jenkins是一款优秀的自动化持续集成运维工具,可以极大的简化运维部署的步骤。 传统的项目部署需要手动更换最新的项目代码,然后打包并运行到服务器上。 使用Jenkins可以自动化实现,当代码编写完成并提交到git后,Jenki…

[C++][数据结构][图][下][最短路径]详细讲解

目录 1.最短路径1.单源最短路径 -- Dijkstra算法2.单源最短路径 -- Bellman-Ford算法3.多源最短路径 -- Floyd-Warshall算法原理 1.最短路径 最短路径问题:从在带权有向图G中的某一顶点出发,找出一条通往另一顶点的最短路径,最短也就是沿路径…

linux中“PXE高效批量装机”

在大规模的 Linux 应用环境中,如 Web 群集、分布式计算等,服务器往往并不配备光驱设备,在这种情况下,如何为数十乃至上百台服务器裸机快速安装系统呢?传统的 USB光驱、移动硬盘等安装方法显然已经难以满足需求。 PXE …

Javase.抽象类和接口

抽象类和接口 【本节目标】1.抽象类1.1抽象类的概念1.2 抽象类语法1.3 抽象类特性1.4 抽象类的作用 2. 接口2.1 接口的概念2.2 语法规则2.3 接口使用2.4 接口特性2.5 实现多个接口2.6 接口间的继承2.7 接口使用实例2.8Clonable 接口和深拷贝2.9 抽象类和接口的区别 3. Object类…

C#的Switch语句2(case后的值与模式匹配)

文章目录 switch语法结构case具体的值枚举值字符串const关键字 如果没有匹配的值default语句不一定要在最后 模式匹配与C的差异-case穿透(Fall-through)下一篇文章 switch语法结构 基础的语法结构,在上一篇文章已经写了,具体请看…

Pyshark——安装、解析pcap文件

1、简介 PyShark是一个用于网络数据包捕获和分析的Python库,基于著名的网络协议分析工具Wireshark和其背后的libpcap/tshark库。它提供了一种便捷的方式来处理网络流量,适用于需要进行网络监控、调试和研究的场景。以下是PyShark的一些关键特性和使用方…

顺势而为:雷军、小米与创业成功的深层思考

一、引言 在当今快速发展的商业环境中,成功的企业家如马云和雷军,都以其独特的商业智慧和不懈的勤奋精神赢得了业界的尊重。然而,当我们深入探讨他们的成功之道时,会发现一个更为核心的因素——“顺势而为”。本文将基于雷军对不…