Docker大学生看了都会系列(八、Dokcerfile部署go项目)

news2024/11/25 0:44:09

系列文章目录
第一章 Docker介绍
第二章 2.1 Mac通过Homebrew安装Docker
第二章 2.2 CentOS安装Docker
第三章 Docker常用命令
第四章 常用命令实战
第五章 Docker镜像详解
第六章 Docker容器数据卷
第七章 Dockerfile详解
第八章 Dokcerfile部署go项目

文章目录

  • 一、前言
  • 二、环境
  • 三、新建Go项目
    • 3.1 go项目目录
    • 3.2 config.yaml文件
    • 3.3 main.go文件
    • 3.4 本地测试运行
  • 四、编写Dockerfile文件
    • 4.1 新建Dockerfile文件
    • 4.2 编写Dockerfile文件
    • 4.3 构建镜像
    • 4.4 运行容器
    • 4.5 本地测试运行
  • 五、总结


一、前言

实践是检验真理的唯一标准,有了之前的Dockerfile基础之后,编写一个简单的go项目,并通过Dockerfile部署,Mac本机测试

二、环境

名称备注
MackBook Pro2023年
芯片Apple M2 Pro(arm64)
macOSSonoma 14.5
操作命令对象Docker 版本26.1.3
简单go项目Go 版本1.22.2

三、新建Go项目

有go基础的可以直接跳过,查看Dockerfile编写

3.1 go项目目录

新建个名为gindemo的项目,包含config.yamlmain.go2个文件

3.2 config.yaml文件

mysql:
  url: 127.0.0.1
  port: 330678

3.3 main.go文件

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"gopkg.in/yaml.v3"
	"os"
)

type Config struct {
	Mysql Mysql `json:"mysql"`
}

type Mysql struct {
	Url  string
	Port int
}

func main() {
	dataBytes, err := os.ReadFile("config.yaml")
	if err != nil {
		fmt.Println("读取文件失败:", err)
		return
	}
	config := Config{}
	err = yaml.Unmarshal(dataBytes, &config)
	if err != nil {
		fmt.Println("解析 yaml 文件失败:", err)
		return
	}

	r := gin.Default()
	r.GET("/", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"Mysql": config.Mysql,
		})
	})
	r.Run(":8080")
}

3.4 本地测试运行

依次安装gindemo需要的依赖

go get -u github.com/gin-gonic/gin
go get -u gopkg.in/yaml.v3

引用项目需要的依赖增加到go.mod文件

go mod tidy

依次执行如下代码,运行服务

go build main.go
./main

新起个terminal执行如下代码

curl 127.0.0.1:8080 

当看到控制台输出如下字符串就说明gindemo项目服务跑起来了
{"Mysql":{"Url":"127.0.0.1","Port":330678}}%

四、编写Dockerfile文件

4.1 新建Dockerfile文件

gindemo工程目录下新建Dockerfile文件,只能以Dockerfile命名,开头不能小写。

编译镜像,这里main二进制文件,不需要用到,可以删除

4.2 编写Dockerfile文件

#由于我电脑是arm64的芯片所以用了1.22.4-alpine3.20的镜像
FROM golang:1.22.4-alpine3.20 AS builder

LABEL author="donkor"

#设置国内软件仓库镜像
ENV GOPROXY https://goproxy.cn,direct
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

#alpine 基础镜像中没有包含时区信息文件 所以需要安装tzdata
RUN apk update --no-cache && apk add --no-cache tzdata
#设置工作目录
WORKDIR /build
#拷贝当前所有文件到build目录
COPY . .
#安装go项目依赖
RUN go mod download
#-ldflags="-s -w" -w为去掉调试信息(无法使用gdb调试),-s为去掉符号表。 -o 编译输出的名称,代替默认的包名
RUN go build -ldflags="-s -w" -o /build/main


FROM scratch
#设置时区
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/Asia/Shanghai
ENV TZ Asia/Shanghai

WORKDIR /app
#拷贝编译后的二进制文件
COPY --from=builder /build/main .
#设置数据卷
VOLUME ["/app/config.yaml"]
#暴漏的端口
EXPOSE ["8080"]
#运行程序
ENTRYPOINT ["/app/main"]

由于mac电脑芯片不同,我的是arm64,所以用到了1.22.4-alpine3.20。这里第一个From可以理解是进行编译二进制文件,第二个From是构建镜像。其他的注释写的很清晰,我就不过多赘述。

terminal中输入uname -a可以查到自己mac电脑芯片的处理器
DockerHub arm64 golang镜像地址

4.3 构建镜像

terminal中构建镜像,docker/my_gin_demo为镜像名。如果构建失败了,那你要想想是不是网络问题,或者是命令没有写对。

docker build -t docker/my_gin_demo:v1 .

成功后输出

也可以通过docker images查看镜像是否创建成功

4.4 运行容器

交互运行的方式后台启动名称为mygindemo01端口8080映射给8899,挂载容器内/app/config.yaml文件的容器

docker run -itd --name mygindemo01 -p 8899:8080 -v 你的主机目录/config.yaml:/app/config.yaml 容器id

也可以写成,一般建议用下面这种方式,如果太长了可以写个.sh文件。

docker run -itd --name mygindemo01 \
-p 8899:8080 \
-v 你的主机目录/config.yaml:/app/config.yaml \
容器id

4.5 本地测试运行

通过docker ps查看容器是否创建运行成功

在terminal执行如下代码

curl 127.0.0.1:8899 

当看到控制台输出如下字符串就说明gindemo项目服务跑起来了
{"Mysql":{"Url":"127.0.0.1","Port":330678}}%
修改本机config.yaml文件

mysql:
  url: 127.0.0.1
  port: 3306

通过重启容器docker restart 容器ID,在terminal再次执行curl 127.0.0.1:8899 ,本机文件挂载容器成功。

五、总结

今天周六端午节第一天,祝大家端午节安康。

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

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

相关文章

How to: Add and Customize the Ribbon Skin List and Skin Gallery

皮肤列表和皮肤库允许用户选择皮肤。本文介绍如何在功能区中显示“皮肤列表”或“皮肤库”并对其进行自定义。 DevExpress演示中心中的大多数应用程序都允许您选择皮肤。例如,运行XtraGrid演示并导航到皮肤功能区页面以更改当前皮肤。 在功能区UI中显示皮肤列表或…

Python YOLOv5 7.0 基于深度学习的口罩检测识别系统

目录 1,演示视频和资源下载 1.1 演示视频 1.2 资源下载 2,数据集 3,代码 3.1 带 PyQt5 UI 的检测程序,基于YOLOv5 7.0 3.1.1 根据训练结果进行检测 3.1.2 自动保存每张图片/每帧的检测结果 3.1.3 筛选查看每张图片/每帧检…

【Git教程】(二十一)与其他版本控制系统并行使用 — 概述及使用要求,执行过程及其实现,替代解决方案 ~

Git教程 与其他版本控制系统并行使用 1️⃣ 概述2️⃣ 使用要求3️⃣ 执行过程及其实现3.1 初始部署版本库3.2 得到中央版本控制管理中的更新修改3.3 将修改提交传输到中央本版控制系统 在许多企业和组织中,会统一管理版本控制工具和相关的流程。其中的个人和小团队…

服务器数据恢复—服务器raid5上层zfs文件系统数据恢复案例

服务器数据恢复环境&故障: 一台某品牌X3650M3服务器,服务器中有一组raid5磁盘阵列,上层采用zfs文件系统。 服务器未知原因崩溃,工作人员排查故障后发现服务器的raid5阵列中有两块硬盘离线导致该阵列不可用,服务器内…

Scikit-Learn随机森林分类

Scikit-Learn随机森林分类 1、随机森林分类1.1、随机森林分类概述1.2、随机森林分类的优缺点2、Scikit-Learn随机森林分类2.1、Scikit-Learn随机森林分类API2.2、Scikit-Learn随机森林分类初体验(葡萄酒分类)2.3、Scikit-Learn随机森林分类实践(鸢尾花分类)2.4、参数调优与…

1.Vue2使用ElementUI-初识及环境搭建

目录 1.下载nodejs v16.x 2.设置淘宝镜像源 3.安装脚手架 4.创建一个项目 5.项目修改 代码地址:source-code: 源码笔记 1.下载nodejs v16.x 下载地址:Node.js — Download Node.js 2.设置淘宝镜像源 npm config set registry https://registry.…

获取东方财富网股票的实时数据股票的数据,并保存到Excel文件中

可以运行python文件获取东方财富网:【序号,代码,名称,最新价,涨跌幅,涨跌额,成交量,成交额,振幅,最高,最低,今开,昨收,量比,换手率,市盈率-动态,市净率,总市值,流通市值,涨速,5分钟涨跌,60日涨跌幅,年初至今涨跌幅,】数据,保存到Excel文件中。 import pandas as pd import re…

在Cisco Packet Tracer上配置NAT

目录 前言一、搭建网络拓扑1.1 配置PC机1.2 配置客户路由器1.3 配置ISP路由器 二、配置NAT2.1 在客户路由器中配置NAT2.2 测试是否配置成功 总结 前言 本篇文章是在了解NAT的原理基础上,通过使用Cisco Packet Tracer 网络模拟器实现模拟对NAT的配置,以加…

09.爬虫---正则解析爬取数据

09.正则解析爬取数据 1.目标网站2.具体实现3.正则表达式分析4.完整代码并存入表格 1.目标网站 直达目标网站 https://movie.douban.com/chart 2.具体实现 我们来拿取一下上面网页的代码如下: from urllib import requesturl https://movie.douban.com/chart headers {Us…

Java心跳检测机制

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 心跳检测的定义 心跳检测是一种监控机制,在Java编程和分布式系统中具有广泛的应用。心跳检测,顾名思义,就像心跳一样,是一种…

计算机网络-数制转换与子网划分

目录 一、了解数制 1、计算机的数制 2、二进制 3、八进制 4、十进制 5、十六进制 二、数制转换 1、二进制转十进制 2、八进制转十进制 3、十六进制转十进制 4、十进制转二进制 5、十进制转八进制 6、十进制转十六进制 三、子网划分 1、IP地址定义 2、IP的两种协…

【二】线控底盘

GB/T 43947-2024 低速线控底盘通用技术要求 线控协议 转向 功能子功能信号描述性能要求分辨率线控转向功能转向控制使能人工切自驾标志位上升沿0-1,有效-线控转向功能转向控制电机输出转向轴的转角。目标方向盘转角范围(deg) -500~500,右负,左正响应延…

easyexcel将csv转为excel处理数字问题

使用easyexcel可以将csv格式的文件转为.xlsx文件,但是csv中有很多数字,比如:"123","12.34","-111",默认情况下会将其作为字符串写入.xlsx文件,就如同下面一样,字符类型的数字…

transformers 阅读:BERT 模型

前言 想深入理解 BERT 模型&#xff0c;在阅读 transformers 库同时记录一下。 笔者小白&#xff0c;错误的地方请不吝指出。 Embedding 为了使 BERT 能处理大量下游任务&#xff0c;它的输入可以明确表示单一句子或句子对&#xff0c;例如<问题&#xff0c;答案>。 …

单元测试之CppTest测试框架

目录 1 背景2 设计3 实现4 使用4.1 主函数4.2 测试用例4.2.1 定义4.2.2 实现 4.3 运行 1 背景 前面文章CppTest实战演示中讲述如何使用CppTest库。其主函数如下&#xff1a; int main(int argc, char *argv[]) {Test::Suite mainSuite;Test::TextOutput output(Test::TextOut…

Vue.js ECharts使用

一、介绍 ECharts 是一个使用 JavaScript 实现的开源可视化库&#xff0c;涵盖各行业图表&#xff0c;满足各种需求。ECharts 提供了丰富的图表类型和交互能力&#xff0c;使用户能够通过简单的配置生成各种各样的图表&#xff0c;包括但不限于折线图、柱状图、散点图、饼图、雷…

【Java毕业设计】基于JavaWeb的洗衣店管理系统

文章目录 摘要ABSTRACT目 录1 概述1.1 研究背景及意义1.2 国内外研究现状1.3 拟研究内容1.4 系统开发技术1.4.1 SpringBoot框架1.4.2 MySQL数据库1.4.3 MVC模式 2 系统需求分析2.1 可行性分析2.2 功能需求分析 3 系统设计3.1 功能模块设计3.2 系统流程设计3.3 数据库设计3.3.1 …

[每周一更]-(第100期):介绍 goctl自动生成代码

​ 在自己组件库中&#xff0c;由于部分设计会存在重复引用各个模板的文件&#xff0c;并且基础架构中需要基础模块内容&#xff0c;就想到自动生成代码模板&#xff0c;刚好之前有使用过goctl&#xff0c;以下就简单描述下gozero中goctl场景和逻辑&#xff0c;后续自己借鉴将自…

【uni-app】申请高德地图key,封装map.js,实现H5、iOS、Android通过getlocation获取地图定位信息

文章目录 map组件基础使用封装map.js&#xff0c;实现定位1、使用第三方地图&#xff1a;高德&#xff0c;申请对应平台key1、申请H5 key2、申请微信小程序 key3、申请android key查看证书详情&#xff0c;可以看到SHA1查看/设置Android包名 4、申请ios key 2、封装map1、lib/m…

【阿里YYDS】通义千问正式开源 Qwen2

Qwen2–72B正式开源&#xff0c;性能全面超越开源模型Llama3-70B&#xff0c;也超过文心4.0、豆包pro、混元pro等众多中国闭源大模型。 在过去一段时间里&#xff0c;Qwen系列模型从Qwen1.5升级到Qwen2&#xff0c;Qwen2分5个尺寸&#xff0c;包括Qwen2-0.5B、Qwen2-1.5B、Qwen…