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

系列文章目录
第一章 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.1port: 330678

3.3 main.go文件

package mainimport ("fmt""github.com/gin-gonic/gin""gopkg.in/yaml.v3""os"
)type Config struct {Mysql Mysql `json:"mysql"`
}type Mysql struct {Url  stringPort 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 builderLABEL 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/mainFROM 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/ShanghaiWORKDIR /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.1port: 3306

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

五、总结

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

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

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

相关文章

解决Android Studio Iguana版本不显示原创的GradleTask问题

问题描述: 下面是我的AndroidStudio版本号,升级后我发现项目里面自定义的gradletask找不到了??? 解决方案: 1、去setting里面把下面红框里面的选项勾选一下,缺点就是sync的时候会慢一些。 2、…

可以抛弃纸质礼金簿了,以后登记礼金可以用这款小程序

可以抛弃纸质礼金簿了,以后登记礼金可以用这款小程序 小程序介绍使用主要技术代码来源项目演示首页和我的关于和设置收礼功能送礼功能我的家庭和数据统计 总结 大家好,这里是程序猿代码之路,先说说为什么想搞这一个小程序呢,主要是…

linux部署运维3——centos7下导入导出mysql数据库的sql文件以及查询数据量最大的表信息

在实际项目开发或者项目运维过程中,数据库的导入导出操作比较频繁,如果可以借助第三方工具那当然算喜事一桩;但是如果不允许外部访问,那么就只能使用数据库自带的命令,也是相当方便的。 一.导入sql文件 1.在linux命令…

pxe自动装机与无人值守

一、pxe与无人值守 pxe:c/s 模式,允许客户端通过网络从远程服务器(服务端)下载引导镜像,加载安装文件,实现自动化安装操作系统。 pxe的优点: 1、规模化 同时装配多台服务器(20多&…

zookeeper启动(一)

1.zookeeper启动入口 在zkServer.sh的启动命令中,我们可以找到zookeeper启动的关键类org.apache.zookeeper.server.quorum.QuorumPeerMain QuorumPeerMain#main 我们可以直接看org.apache.zookeeper.server.quorum.QuorumPeerMain中的main方法,从下面的main方法中,我们可以…

专为Mac设计的窗口管理Magnet 中文

Magnet是一款专为Mac设计的窗口管理工具软件。它具备强大的多窗口管理能力,支持用户通过简单的拖放操作,将应用程序窗口快速对齐、排列和分组。此外,Magnet还提供了预设的布局选项和自定义设置功能,帮助用户实现个性化的窗口布局。…

本地部署GLM-4-9B清华智谱开源大模型方法和对话效果体验

GLM-4-9B是清华大学和智谱AI推出的最新一代预训练模型GLM-4系列中的开源版本。在语义、数学、推理、代码和知识等多方面的数据集测评中,GLM-4-9B及其人类偏好对齐的版本GLM-4-9B-Chat均表现出较高的性能,其通用能力评测结果甚至超越了Llama-3-8B开源大模…

多样本上下文学习:开拓大模型的新领域

大模型(LLMs)在少量样本上下文学习(ICL)中展现出了卓越的能力,即通过在推理过程中提供少量输入输出示例来学习,而无需更新权重。随着上下文窗口的扩展,我们现在可以探索包含数百甚至数千个示例的…

pdf怎么编辑修改内容?3个实用软件!

在当今数字化时代,PDF文件因其跨平台、格式固定的特性,成为我们日常工作和生活中不可或缺的一部分。然而,PDF文件的修改和编辑往往成为许多人的难题。本文将为您详细介绍如何编辑修改PDF文件的内容,并推荐几款实用的编辑软件&…

搭建多平台比价系统需要了解的电商API接口?

搭建一个多平台比价系统涉及多个步骤,以下是一个大致的指南: 1. 确定需求和目标 平台选择:确定你想要比较价格的平台,例如电商网站、在线旅行社等。数据类型:明确你需要收集哪些数据,如产品价格、产品名称…

nginx中配置ssl证书(宝塔面板)

首先申请一个SSL证书,这里我申请的joyssl的免费证书。提交订单申请后,按照页面提示在域名解析中将CNAME和记录值配置好。 比如我用的阿里云, 这是好后,需要等几分钟,然后域名检验成功。 然后点击joyssl的左侧菜单的“证…

消息队列笔记

异步技术 企业级应用中广泛使用的三种异步消息传递技术 原文链接:https://blog.csdn.net/qq_55917018/article/details/122122218 三种异步消息传递技术 JMS (java message service) 一个Java规范,等同于JDBC规范,提供了与消息服务相关的…

Web后端开发(请求-简单参数)(一)

原始方式: 在原始的web程序中,获取请求参数,需要通过HttpServletRequest 对象手动获取。 RequestMapping("/simpleParam") public String simpleParam(HttpServletRequest request){//获取请求参数String name request.getParame…

小阿轩yx-iptables 防火墙

小阿轩yx-iptables 防火墙 Linux 防火墙基础 体系主要工作在 网络层针对TCP/IP 数据包实施过滤和限制 属于典型的包过滤防火墙(或者称为网络层防火墙) 体系基于内核编码实现 好处 具有非常稳定的性能高效率 防火墙两个表示 netfilteriptables …

优化扩散模型中的采样计划

在生成模型领域,扩散模型(Diffusion Models, DMs)因其卓越的生成质量而成为最新的技术趋势。但这些模型的一个关键缺点是它们的采样速度较慢,需要通过大型神经网络进行多次顺序函数评估。扩散模型通过一个称为采样计划的离散噪声水…

Golang | Leetcode Golang题解之第130题被围绕的区域

题目&#xff1a; 题解&#xff1a; var (dx [4]int{1, -1, 0, 0}dy [4]int{0, 0, 1, -1} ) func solve(board [][]byte) {if len(board) 0 || len(board[0]) 0 {return}n, m : len(board), len(board[0])queue : [][]int{}for i : 0; i < n; i {if board[i][0] O {q…

实验八、地址解析协议《计算机网络》

水逆退散&#xff0c;学业进步&#xff0c;祝我们都好&#xff0c;不止在夏天。 目录 一、实验目的 二、实验内容 &#xff08;1&#xff09;预备知识 &#xff08;2&#xff09;实验步骤 三、实验小结 一、实验目的 完成本练习之后&#xff0c;您应该能够确定给定 IP 地…

【python】python商业客户流失数据模型训练分析可视化(源码+数据集+课程论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

论文复现:Track to Detect and Segment: An Online Multi-Object Tracker

论文下载链接&#xff1a;链接 简单介绍&#xff1a;大多数在线多目标跟踪器在神经网络中独立执行目标检测&#xff0c;无需任何跟踪输入。在本文中提出了一种新的在线联合检测和跟踪模型TraDeS&#xff08;TRAck to DEtect and Segment&#xff09;&#xff0c;利用跟踪线索…

基于协调过滤算法商品推荐系统的设计#计算机毕业设计

基于协调过滤算法商品推荐系统的设计#计算机毕业设计 管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;商品管理&#xff0c;论坛管理&#xff0c;商品资讯管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;论坛&#xf…