15分钟学 Go 第 44 天: 项目部署基础

第44天:项目部署基础

学习目标

在这一课中,我们将学习如何部署Go应用程序。重点包括:

  1. Go应用的构建与打包
  2. 选择合适的部署环境
  3. 使用Docker容器化Go应用
  4. 云平台部署基础
  5. 常见问题与调试方法

1. Go应用的构建与打包

1.1 构建应用

在部署之前,首先需要构建Go应用。这里的构建是指将代码编译成可执行文件。

使用以下命令构建你的Go项目:

go build -o myapp main.go

这会生成myapp可执行文件。

1.2 目录结构

一个典型的Go项目目录结构如下:

myapp/
│
├── main.go         // 入口文件
├── go.mod          // 模块定义文件
├── go.sum          // 依赖文件
├── cmd/            // 命令行工具
│   ├── server.go
│   └── ...
├── pkg/            // 可复用的库代码
├── internal/       // 内部应用逻辑
└── deployments/     // 部署相关文件

1.3 示例代码

下面是一个简单的HTTP服务器示例:

// main.go
package mainimport ("fmt""net/http"
)func handler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "Hello, World!")
}func main() {http.HandleFunc("/", handler)fmt.Println("Server starting on :8080")if err := http.ListenAndServe(":8080", nil); err != nil {fmt.Println("Failed to start server:", err)}
}

1.4 运行示例代码

将上面的代码保存为main.go,然后在终端中运行以下指令:

go run main.go

打开浏览器,访问 http://localhost:8080,你应该会看到“Hello, World!”的提示。


2. 选择合适的部署环境

部署Go应用时,可以选择多种环境,如:

部署方式描述优点缺点
本地服务器在本地或自有服务器上运行控制力强运维成本高
虚拟专用服务器(VPS)租用虚拟机,部署应用灵活性高需自行管理
容器化(Docker)使用Docker容器打包和运行应用一致的运行环境学习曲线
云平台如AWS、Google Cloud、Azure等扩展性好,易于管理成本可能较高

3. 使用Docker容器化Go应用

3.1 Docker简介

Docker是一个开源平台,允许开发者将应用及其依赖打包成容器。这些容器可以在任何安装了Docker的环境中运行。

3.2 创建Dockerfile

在项目根目录创建一个Dockerfile,内容如下:

# 使用官方的Go镜像作为基础镜像
FROM golang:1.20 AS builder# 设置工作目录
WORKDIR /app# 将go.mod和go.sum复制到工作目录
COPY go.mod go.sum ./# 下载依赖
RUN go mod download# 将代码复制到容器中
COPY . .# 编译应用
RUN go build -o myapp main.go# 使用轻量级的Alpine镜像作为运行时
FROM alpine:latest# 设置工作目录
WORKDIR /root/# 将构建的应用复制到运行时镜像
COPY --from=builder /app/myapp .# 暴露端口
EXPOSE 8080# 运行应用
CMD ["./myapp"]

3.3 构建Docker镜像

使用以下命令构建Docker镜像:

docker build -t myapp .

3.4 运行Docker容器

构建完成后,运行以下命令启动容器:

docker run -p 8080:8080 myapp

3.5 测试容器

打开浏览器,访问 http://localhost:8080,你应该同样会看到“Hello, World!”的提示。

3.6 Docker运行流程图

构建容器
运行容器
接收请求
处理请求
返回响应

4. 云平台部署基础

4.1 选择云平台

常见的云服务提供商包括:AWS、Google Cloud、Azure等。选择合适的平台,考虑如下因素:

  • 成本
  • 支持的开发工具
  • 文档和社区支持
  • 数据库和存储选项

4.2 AWS部署示例

4.2.1 创建EC2实例
  1. 登录到AWS管理控制台。
  2. 创建一个新的EC2实例,选择适合的操作系统(例如Ubuntu)。
  3. 配置安全组,确保在入站规则中允许8080端口。
4.2.2 连接到实例

使用SSH连接到新创建的EC2实例:

ssh -i "your-key.pem" ubuntu@your-ec2-instance-ip
4.2.3 安装Docker

在EC2实例中运行以下命令安装Docker:

sudo apt-get update
sudo apt-get install docker.io
sudo systemctl start docker
sudo systemctl enable docker
4.2.4 部署Go应用

将Docker镜像推送到Docker Hub(或其他私有仓库),然后在EC2实例中运行:

docker run -p 8080:8080 myapp

访问 http://your-ec2-instance-ip:8080 查看效果。


5. 常见问题与调试方法

5.1 常见问题

  • 应用无法启动:查看容器日志,使用 docker logs <CONTAINER_ID> 获取详细信息。
  • 端口未打开:确保云服务的入站规则允许访问所使用的端口。

5.2 调试方法

使用以下命令查看容器状态:

docker ps -a

进入容器进行手动调试:

docker exec -it <CONTAINER_ID> /bin/sh

总结

今天我们学习了如何构建和部署Go应用,包括本地部署、Docker容器化以及云平台部署的方法。掌握这些技能后,你将能够更方便地把自己的应用发布到生产环境。接下来几天,我们将深入探讨监控和日志,这对于维护应用的稳定至关重要。

参考资料

  • Docker 官方文档
  • AWS EC2 使用文档
  • Go 官方文档

通过这一节的学习,希望大家对Go应用的部署有了更深刻的理解,并能够熟练运用相关知识进行项目的实际部署。继续加油,我们下一节见!


怎么样今天的内容还满意吗?再次感谢观众老爷的观看,关注GZH:凡人的AI工具箱,回复666,送您价值199的AI大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!

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

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

相关文章

C++初阶——vector

一、什么是vector vector是表示可变大小的数组的序列容器&#xff0c;就像数组一样&#xff0c;vector也采用连续空间来存储元素。也就是说它的访问和数组一样高效&#xff0c;但是它的大小是动态可变的&#xff0c;并且它的大小会被容器自动处理。 二、vector的构造 常用的构…

迁徙线,动态轨迹线

使用canvas结合贝塞尔曲线实现&#xff0c;效果如下 <template><div class"box"><div class"mapBox"><div class"map"><img src"/img/dataCockpit/map.png" alt"" /><div class"dot&…

SQLI LABS | Less-39 GET-Stacked Query Injection-Intiger Based

关注这个靶场的其它相关笔记&#xff1a;SQLI LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;过关流程 输入下面的链接进入靶场&#xff08;如果你的地址和我不一样&#xff0c;按照你本地的环境来&#xff09;&#xff1a; http://localhost/sqli-labs/Less-39/ 本关是堆…

NVM 介绍及使用指南

在日常的开发工作中&#xff0c;我们往往会遇到需要在同一台机器上同时管理多个版本的 Node.js 的情况。为了解决这个问题&#xff0c;我一个同事推荐了NVM&#xff08;Node Version Manager&#xff09;。NVM 是一个用于管理 Node.js 版本的工具&#xff0c;可以方便地在不同的…

web——[SUCTF 2019]EasySQL1——堆叠注入

这个题主要是讲述了堆叠注入的用法&#xff0c;来复现一下 什么是堆叠注入 堆叠注入&#xff1a;将多条SQL语句放在一起&#xff0c;并用分号;隔开。 1.查看数据库的名称 查看数据库名称 1;show databases; 发现有名称为ctftraining的数据库 2.对表进行查询 1;show tabl…

【ARM】MDK-烧录配置文件无权限访问

【更多软件使用问题请点击亿道电子官方网站】 1、 问题场景 客户代码编译正常、调试出现报错<Error: Flash Download failed - "Cortex-M4"> 仿真器识别正常&#xff0c;keil-Debug内显示相关信息、设备启动正常。 记录排查步骤&#xff0c;找到配置文件位…

深度解析 ICP 备案、公安备案、等保备案编号与统一社会信用代码

1. 前言 在当今数字化时代&#xff0c;各类网站和系统如雨后春笋般涌现&#xff0c;为了确保网络安全、合法运营以及用户信息保护&#xff0c;不同类型的备案工作应运而生。其中&#xff0c;ICP 备案、公安备案和等保备案尤为重要&#xff0c;它们各自对应的备案编号不仅是一串…

11个简单易用的电商购物车设计案例

文章目录 前言正文1.扁平化设计购物车2.无表格布局购物车3.美食购物车4.响应式购物车5.jQuery购物车6.动态价格更新购物车7.标签式滑动购物车8.动态商店与购物车一体化设计9.简约清爽的购物车设计10.基于Vue.js的购物车11.域名购物车 总结 前言 现在的电子商务网站&#xff0c…

turtlesim修改窗口大小;添加自己的小乌龟;

目前手边有humble版本ROS。以此为教程。其他版本以此类推 github中搜索ros&#xff0c;然后选择ros官网&#xff08;九点方阵那个图标&#xff09;。然后 在branch中&#xff0c;选择humble&#xff0c;然后复制链接。 git clone https://github.com/ros/ros_tutorials.git -…

电阻按材料分类、不同的电阻

TOC 按电阻材料工艺进行分类 3.1.线绕电阻&#xff1a; 使用高电阻率的康铜、锰铜或镍铬合金丝缠绕在陶瓷骨架&#xff08;一般采用陶瓷、塑料、涂覆绝缘层的金属骨架&#xff09;上制作而成的。玻璃釉绕线电阻表面被覆一层玻璃釉&#xff1b;涂漆线绕电阻表面被覆一层保护有…

spark的学习-06

SparkSQL读写数据的方式 1&#xff09;输入Source 方式一&#xff1a;给定读取数据源的类型和地址 spark.read.format("json").load(path) spark.read.format("csv").load(path) spark.read.format("parquet").load(path) 方式二&#xff1a…

react-markdown内容宽度溢出和换行不生效问题

情景复现&#xff1a; 解决办法&#xff0c;添加样式进行限制 /* index.css */ .markdown-container {word-break: break-word; /* 强制长单词断行 */white-space: pre-wrap; /* 保留空白符序列&#xff0c;但是正常地进行换行 */overflow-wrap: break-word; /* 在长单词或…

java双向链表解析实现双向链表的创建含代码

双向链表 一.双向链表二.创建MyListCode类实现双向链表创建一.AddFirst创建&#xff08;头插法&#xff09;二.AddLast创建&#xff08;尾叉法&#xff09;三.size四.remove(指定任意节点的首位删除)五.removeAll(包含任意属性值的所有删除)六.AddIndex(给任意位置添加一个节点…

VMWare虚拟机NAT模式下与外部主机(非宿主机)通信

VMWare虚拟机NAT模式下与外部主机(非宿主机)通信 1. VMWare虚拟机网络 VMWare的三种网络工作模式&#xff1a; Bridged&#xff1a;桥接模式NAT&#xff1a;网络地址转换模式Host-Only &#xff1a;仅主机模式 VMWare 网络连接配置界面如下&#xff1a; 在本次测试环境中&a…

Mac保护电池健康,延长电池使用寿命的好方法

使用Mac的过程中&#xff0c;如何延长电池的使用寿命是大家非常关心的问题&#xff0c;而养成一个良好的充电习惯能够有效的延长电池的使用寿命 避免过度充电和过度放电能够有效的保护电池&#xff0c;因此长时间的充电与长时间放点都不可取&#xff0c;但是在日常的使用过程中…

显示器接口种类 | 附图片

显示器接口类型主要包括VGA、DVI、HDMI、DP和USB Type-C等。 VGA、DVI、HDMI、DP和USB Type-C 1. 观察 VGA接口:15针 DP接口&#xff1a;在DP接口旁&#xff0c;都有一个“D”型的标志。 电脑主机&#xff1a;DP(D) 显示器&#xff1a;VGA(15针) Ref https://cloud.tenc…

qt QUndoCommand 与 QUndoStack详解

1、概述 QUndoCommand 和 QUndoStack 是 Qt 框架中用于实现撤销/重做&#xff08;undo/redo&#xff09;功能的两个核心类。QUndoCommand 是表示单个可撤销操作的基类&#xff0c;而 QUndoStack 则负责管理这些命令的堆栈&#xff0c;提供撤销和重做操作的接口。 QUndoCommand…

双指针(二)双指针到底是怎么个事

一.有效的三角形个数 有效的三角形个数 class Solution {public int triangleNumber(int[] nums) {Arrays.sort(nums);int i0,end nums.length-1;int count 0;for( i end;i>2;i--){int left 0;int right i-1;while(left<right){if(nums[left]nums[right]>nums…

springboot的增删改查商城小实践(b to c)

首先准备一张表&#xff0c;根据业务去设计表 订单编号是参与业务的&#xff0c;他那订单编号里面是有特殊意义的&#xff0c;比如说像什么一些年月日什么的&#xff0c;一些用户的ID都在那编号里面呢&#xff1f;不能拿这种东西当主件啊 根据数据量去决定数据类型 价格需要注意…

动态规划-背包问题——416.分割等和子集

1.题目解析 题目来源 416.分割等和子集——力扣 测试用例 2.算法原理 1.状态表示 这里背包问题基本上和母题的思路大相径庭&#xff0c;母题请见 [模板]01.背包 &#xff0c;这里的状态表示与装满背包的情况类似&#xff0c;第二个下标就是当选择的物品体积直接等于j时是否可…