「Docker」如何在苹果电脑上构建简单的Go云原生程序「MacOS」

介绍

使用Docker开发Golang云原生应用程序,使用Golang服务和Redis服务

 注:写得很详细 为方便我的朋友可以看懂 

环境部署

确保已经安装Godocker等基础配置
官网下载链接直达:Docker官网下载         Go官网下载

操作步骤

第一步 创建一个Go应用程序

  1. 创建新Go工程,编辑main.go文件内容如下:
package main

import (
    "fmt"
    "log"
    "net/http"
    "github.com/go-redis/redis/v8"
    "context"
)

var ctx = context.Background()

func main() {
    // 设置Redis客户端
    client := redis.NewClient(&redis.Options{
        Addr: "redis:6379", // 使用Docker服务名作为地址
    })

    // 确认Redis连接
    _, err := client.Ping(ctx).Result()
    if err != nil {
        log.Fatalf("Could not connect to Redis: %v", err)
    }

    // 设置HTTP服务器
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        // 尝试从Redis获取值
        val, err := client.Get(ctx, "counter").Result()
        if err == redis.Nil {
            val = "0"
            _, err := client.Set(ctx, "counter", "1", 0).Result()
            if err != nil {
                fmt.Fprintf(w, "Error setting value in Redis: %v", err)
                return
            }
        } else if err != nil {
            fmt.Fprintf(w, "Error getting value from Redis: %v", err)
            return
        } else {
            // 增加计数器
            newVal, err := client.Incr(ctx, "counter").Result()
            if err != nil {
                fmt.Fprintf(w, "Error incrementing value in Redis: %v", err)
                return
            }
            val = fmt.Sprintf("%d", newVal)
        }

        fmt.Fprintf(w, "Counter value is: %s", val)
    })

    // 启动HTTP服务器
    log.Fatal(http.ListenAndServe(":8080", nil))
}

第二步 使用Docker编排Go应用程序和Redis服务

  1. 创建 Dockerfile文件(无文件后缀名)如图:
    在这里插入图片描述

  2. 然后编辑该文件:

FROM golang:1.16

WORKDIR /app

COPY go.mod .
COPY go.sum .
RUN go mod download

COPY *.go .

RUN go build -o /hello-redis

EXPOSE 8080

CMD [ "/hello-redis" ]

第三步 初始化Go模块

继续在Terminal编辑(确保还是在这个go程序的路径):

go mod init hello-redis
go mod tidy

第四步 创建并编辑docker-compose.yml文件

在文件夹下创建文件,添加内容如下:

version: '3'
services:
  app:
    build: .
    ports:
      - "8080:8080"
    depends_on:
      - redis
  redis:
    image: "redis:alpine"

第五步 构建和运行应用程序

继续在Terminal上输入代码:

docker-compose up --build

此时将会试图构建Go应用程序和Redis服务,并启动它们,在这个过程中需要等待Docker下载相应的依赖配置。

第六步 测试应用程序

使用curl访问http://localhost:8082
输入代码:

curl http://localhost:8080

这个时候会打开浏览器并访问http://localhost:8080,页面上会显示计数值

附录

比较快一点的编辑文件的方法就是使用Terminal
具体的步骤如下:(一个小案例:创建Dockerfile文件并编辑)

1. 切换到工作目录

在工作目录上右击打开Terminal

在这里插入图片描述



或者直接打开Terminal 然后输入代码切换到工作目录

cd Go应用程序的路径

在这里插入图片描述

忘记路径的时候 如何查看Go应用程序的工作路径

右击go文件夹,点击get info
在这里插入图片描述
以下信息就是go文件夹的位置
在这里插入图片描述

2. 创建文件

输入代码:

vim Dockerfile

3. 编辑文件,保存并退出

复制粘贴前文代码
在这里插入图片描述
复制粘贴好之后,直接输入代码,回车即可退出:
注意一定要是英文输入法

:wq!

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

scrapy框架流程

1、Scrapy从Spider子类中提取start_url,然后构造为request请求对象 2、将request请求对象传递给爬虫中间件 3、将request请求对象传递给Scrapy引擎(核心代码) 4、将request请求对象传递给调度器(它负责对多个request安排,好比交…

你不知道的库:库的种类,作用和加载方式

你不知道的库:库的种类,作用和加载方式 📟作者主页:慢热的陕西人 🌴专栏链接:Linux 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 本博客…

基于单片机声光控智能路灯系统仿真设计

**单片机设计介绍, 基于单片机声光控智能路灯系统仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的声光控智能路灯系统是一种利用单片机技术实现智能控制的路灯系统。它通过感知环境音量和光照强度…

Differences between package.json and pnpm-lock.yaml

1.pnpm-lock.yaml 是pnpm包管理工具生成的确保依赖包的版本在所有的环境里面都相同对依赖包的任何操作都会更新在该文件中,因此,需要确保提交到代码仓库中。包含了解析的依赖项和版本号。如下图: 2.package.json 列出应用所需的依赖和元数…

深入理解Java注解的实现原理以及前世今生

深入理解Java注解的实现原理以及前世今生 小雪初寒,请添衣,冬棋如意,待良人,望归期。 1.Java注解的前世今生 Java注解是一种元数据标记,它提供了一种在Java代码中添加元数据(注释)的方式。注解…

“图纸保密大作战:上海迅软DSE解决方案守护机械公司核心资料

机械行业是我国重要的工业制造行业之一,相关企业在发展中往往需要用到ERP、PDM、PLM等系统来对产品信息进行管理,其中便涉及到大量文档和图纸等重要数据。然而随着业务的快速发展和数字化转型,机械行业也面临着如数据泄露、外来袭击攻击、内部…

Nuxt.js Next.js Nest.js

Nuxt.js和Next.js都是服务端渲染框架(SSR),属于前端框架,Nest.js则是node框架,属于后端框架。 其中Nuxt.js是vue的ssr框架,Next.js是react的ssr框架。 都是比vue和react更上层的前端框架。 文章目录 1.SSR2.Nuxt2.1 Nuxt的下载2.2 Nuxt的集成2.3 Nuxt…

安装pytorch

cuda≤11.6,观察控制面板 观察torch对应cuda版本 https://download.pytorch.org/whl/torch/ 安装cuda11.6.0 CUDA Toolkit Archive | NVIDIA Developer cmd输入nvcc -V 编辑国内镜像源 .condarc anaconda prompt输入 查看环境 conda env list 安装py3.9…

c语言:用迭代法解决递归问题

题目&#xff1a; 解释&#xff1a;题目的意思就是用迭代法的空间和时间复杂的太高了&#xff0c;需要我们减小空间与时间的复杂度&#xff0c;我就想到了迭代法&#xff0c;思路和代码如下&#xff1a; #include <stdio.h> //这里是递归法转迭代法 int main() {int x,i…

【送书福利-第二十八期】《AIGC:让生成式AI成为自己的外脑》

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号&#xff1a;程序员洲洲。 &#x1f388; 本文专栏&#xff1a;本文…

LeetCode(31)无重复字符的最长子串【滑动窗口】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 无重复字符的最长子串 1.题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&…

Qt实现图片旋转的几种方式(全)

目录 一、用手搓&#xff08;QPainter&#xff09; 二、使用 QGraphicsView 和 QGraphicsPixmapItem 三、使用 QTransform 实现图像旋转 四、利用 OpenGL 实现旋转图像的效果有几种不同的方法&#xff0c;其中常见的包括&#xff1a; 手动旋转绘制&#xff1a; 使用 QPaint…

【Qt开发流程】之富文本处理

描述 Scribe框架提供了一组类&#xff0c;用于读取和操作结构化的富文本文档。与Qt中以前的富文本支持不同&#xff0c;新的类集中在QTextDocument类上&#xff0c;而不是原始文本信息。这使开发者能够创建和修改结构化的富文本文档&#xff0c;而不必准备中间标记格式的内容。…

【C++】泛型编程 ⑫ ( 类模板 static 关键字 | 类模板 static 静态成员 | 类模板使用流程 )

文章目录 一、类模板使用流程1、类模板 定义流程2、类模板 使用3、类模板 函数 外部实现 二、类模板 static 关键字1、类模板 static 静态成员2、类模板 static 关键字 用法3、完整代码示例 将 类模板 函数声明 与 函数实现 分开进行编码 , 有 三种 方式 : 类模板 的 函数声明…

linux ld 链接器学习笔记

ld链接器笔记 1. 首先编写一段汇编代码 这里的汇编语法时 AT&T语法,是gcc原生支持的语法,底层使用 gas(gnu assembler) 完成汇编,相较于 Intel x86语法, AT&T 语法要更加古老,因此大多数人更加偏向于使用 Intel 的语法. nasm 编译器支持x86语法.自从2.10版本&#xf…

问鼎web服务

华子目录 www简介常见Web服务程序介绍&#xff1a;服务器主机主要数据浏览器网址及http介绍urlhttp请求方法 http协议请求的工作流程www服务器类型静态网站动态网站 快速安装Apache安装准备工作httpd所需目录主配置文件 实验操作 www简介 Web网络服务也叫www&#xff08;world…

晶振有哪几种?晶振旁边的两个电容起什么作用?

晶振可以分为普通晶振、温补晶振、压控晶振、恒温晶振、差分晶振。 普通晶振通常用作微处理器的时钟器件&#xff0c;主要应用于那些稳定度要求不要的设备中&#xff0c;例如电视机、微波炉。 温补晶振&#xff0c;在晶振内部采取了对晶体频率、温度特性进行补偿&#xff0c;已…

Vue3常用操作

一、Vue3项目构建 1、安装最新版本vue npm create vuelatest 2、选择需要的配置 3、进入项目 cd 项目名称 4、下载依赖 npm install 5、启动项目 npm run dev

数据结构—链表

链表结构-----“银行自助叫号” 链表&#xff08;Linked List&#xff09;是一种常见的数据结构&#xff0c;用于存储一个序列的元素。它由一系列结点组成&#xff0c;每个结点包含两个部分&#xff1a;数据部分和指针部分。数据部分存储着当前结点的数据&#xff0c;而指针部分…