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

相关推荐
Chrikk3 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*3 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue3 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang
杜杜的man3 小时前
【go从零单排】go语言中的指针
开发语言·后端·golang
南猿北者4 小时前
docker容器
docker·容器
二十雨辰4 小时前
[linux]docker基础
linux·运维·docker
time never ceases5 小时前
使用docker方式进行Oracle数据库的物理迁移(helowin/oracle_11g)
数据库·docker·oracle
有梦想的咸鱼_7 小时前
go实现并发安全hashtable 拉链法
开发语言·golang·哈希算法
MonkeyKing_sunyuhua7 小时前
ubuntu22.04 docker-compose安装postgresql数据库
数据库·docker·postgresql
追风林7 小时前
mac m1 docker本地部署canal 监听mysql的binglog日志
java·docker·mac