当前位置: 首页 > news >正文

Docker部署Golang服务

不管是开发还是生产环境,通过 docker 方式部署服务都是一种不错的选择,能够解决不同开发环境一致性的问题。

本文以项目:https://github.com/johncxf/go-api 为例。

Dockerfile 构建 Go 运用环境

在项目根目录下添加 Dockerfile 文件:

FROM golang:alpine# 在容器内部设置环境变量
ENV GO111MODULE=on \GOPROXY=https://goproxy.cn,direct \CGO_ENABLED=0 \GOOS=linux \GOARCH=amd64# 设置后续指令的工作目录
WORKDIR /build# 复制项目中的 go.mod 和 go.sum文件并下载依赖信息
COPY go.mod .
COPY go.sum .
RUN go mod download# 将代码复制到容器中
COPY . .# 将代码编译成二进制可执行文件
RUN go build -o go-api .WORKDIR /distRUN cp /build/go-api .COPY ./config ./config# 需要运行的命令
ENTRYPOINT ["/dist/go-api", "/dist/config/env.yml"]

如果需要缩小镜像大小,则可以用以下方式进行构建

FROM golang:alpine AS builder# 在容器内部设置环境变量
ENV GO111MODULE=on \GOPROXY=https://goproxy.cn,direct \CGO_ENABLED=0 \GOOS=linux \GOARCH=amd64# 设置后续指令的工作目录
WORKDIR /build# 复制项目中的 go.mod 和 go.sum文件并下载依赖信息
COPY go.mod .
COPY go.sum .
RUN go mod download# 将代码复制到容器中
COPY . .# 将代码编译成二进制可执行文件
RUN go build -o go-api .# 创建一个小镜像
#FROM scratch
FROM debian:stretch-slimCOPY ./config /config# 从builder镜像中把 /build/go-api 拷贝到当前目录
COPY --from=builder /build/go-api /# 需要运行的命令
ENTRYPOINT ["/go-api", "config/env.yml"]

注:镜像scratch没有bash,会导致无法通过docker exec进入容器,建议直接改成debian:stretch-slim镜像

构建 docker 镜像 go-web-app

$ docker build -t go-web-app .# 查看镜像
$ docker images

启动容器来运行镜像:

$ docker run -p 8888:8088 go-web-app# 后台启动
$ $ docker run -p 8888:8088 -d go-web-app# 查看容器
$ docker ps -a
CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS          PORTS                    NAMES
959ee47f203b   go-web-app   "/go-api config/env.…"   23 seconds ago   Up 22 seconds   0.0.0.0:8888->8088/tcp   nostalgic_mclean

标志位-p用来定义端口绑定,容器中go服务端口为 8088,绑定到本机端口 8888,接下来就可以通过http://127.0.0.1:8888进行访问了。

Mysql 容器
拉取 Mysql 镜像:
# 拉取最新版本 mysql,也可以指定版本
$ docker pull mysql:latest# 查看镜像
$ docker images
运行 Mysql 容器:
$ docker run --name mysql -p 8306:3306 -e MYSQL_ROOT_PASSWORD=root123456 -v ~/docker-data/mysql:/var/lib/mysql -d mysql:latest# 查看容器
$ docker ps -a
  • --name mysql-latest:容器命名为 mysql-latest
  • -p 8306:3306:映射容器服务的 3306 端口到宿主机的 8306 端口,外部主机可以直接通过 宿主机ip:8306 访问到MySQL服务
  • -e MYSQL_ROOT_PASSWORD=root123456:设置 MySQL 服务 root 用户密码
  • -v /Users/john/docker-data/mysql:/var/lib/mysql:表示将宿主机的/Users/john/docker-data/mysql卷映射到容器里的 /var/lib/mysql卷中,为了把数据保存在宿主机中,防止容器删掉就没了
  • -d:后台运行
  • mysql:latest:使用这个mysql镜像
连通性测试:

进入 docker 容器连接 mysql:

# 进入容器
$ docker exec -it mysql-latest /bin/sh
# 连接 mysql
$ mysql -uroot -proot123456 -h 127.0.0.1 -P3306

或者本机可以通过 navicat 等工具进行连接。

Redis 容器
拉取 Redis 镜像:
$ docker pull redis# 查看镜像
$ docker images
运行 Redis 容器:
$ docker run --name redis -v ~/docker-data/redis:/usr/local/redis -p 6379:6379 -d redis:latest --requirepass "root123456"# 查看容器
$ docker ps -a

其他参数同mysql配置,--requirepass 用来设置 Redis 密码

连通性测试:

直接在本地使用 redis-cli 测试 redis 连通性:

> redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> auth root123456
OK
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>

进入容器:

> docker exec -it redis /bin/sh
# redis-cli -p 6379
127.0.0.1:6379> auth root123456
OK
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> exit
# exit
修改配置

由于要连接不同容器内的数据库,需要修改项目数据库配置HOST地址为容器名,这里以我的项目配置 env.yml为例子:

# MySQL 配置
mysql:
#  host: 127.0.0.1 # 服务器地址host: mysqlport: 3306 # 端口db_name: test # 数据库名称username: root # 数据库用户名password: root123456 # 数据库密码...# Redis 配置
redis:
#  host: 127.0.0.1 # 地址host: redisport: 6379 # 端口db: 0password: root123456 # 密码

然后重新 build Go服务镜像:

$ docker build -t go-web-app .

重新启动容器,并使用--link关联Mysql、Redis容器:

$ docker run --name go-api --link=mysql:mysql --link=redis:redis -p 8888:8088 -d go-web-app

注:使用这种方式构建环境,每次都需要单独启动Mysql、Redis、go服务容器,并通过 --link关联容器

文章推荐:

  • Docker 入门指南
  • Docker compose 常用指令

相关文章:

Docker部署Golang服务

不管是开发还是生产环境,通过 docker 方式部署服务都是一种不错的选择,能够解决不同开发环境一致性的问题。 本文以项目:https://github.com/johncxf/go-api 为例。 Dockerfile 构建 Go 运用环境 在项目根目录下添加 Dockerfile 文件&…...

C#,字符串匹配(模式搜索)Sunday算法的源代码

Sunday算法是Daniel M.Sunday于1990年提出的一种字符串模式匹配算法。 核心思想:在匹配过程中,模式串并不被要求一定要按从左向右进行比较还是从右向左进行比较,它在发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配&…...

makefile 编译动态链接库使用(.so库文件)

makefile 编译动态链接库使用(.so库文件) 动态链接库:不会把代码编译到二进制文件中,而是在运行时才去加载, 好处是程序可以和库文件分离,可以分别发版,然后库文件可以被多处共享 动态链接库 动态&#…...

Hive 数仓及数仓设计方案

数仓(Data Warehouse) 数据仓库存在的意义在于对企业的所有数据进行汇总,为企业各个部门提供一个统一、规范的出口。做数仓就是做方案,是用数据治理企业的方案。 数据仓库的特点 面向主题集成 公司中不同的部门都会去数据仓库中拿数据,把独…...

Ubuntu使用docker-compose安装redis

ubuntu环境搭建专栏🔗点击跳转 Ubuntu系统环境搭建(十三)——使用docker-compose安装redis 文章目录 Ubuntu系统环境搭建(十三)——使用docker-compose安装redis1.搭建文件夹2.docker-compose.yaml配置文件3.redis.co…...

大数据安全 | 期末复习(上)| 补档

文章目录 📚概述⭐️🐇大数据的定义、来源、特点🐇大数据安全的含义🐇大数据安全威胁🐇保障大数据安全🐇采集、存储、挖掘环节的安全技术🐇大数据用于安全🐇隐私的定义、属性、分类、…...

Kylin 安装novnc 远程访问

noVNC可以使用浏览器直接访问服务器,而不需要使用VNC客户端。 1.初始环境 关闭防火墙或允许IP访问本机 2.安装依赖 dnf install -y tigervnc-server git 3.git下载novnc git clone https://github.com/novnc/noVNC.git git clone https://gitee.com/yangyizhao…...

神经网络算法与逻辑回归:优势与差异

神经网络算法和逻辑回归都是预测模型中的重要工具,但它们在处理复杂和非线性问题时表现出不同的性能。本文将深入探讨神经网络算法相对于逻辑回归的优势,以及它们在不同场景下的适用性。 一、引言 神经网络算法和逻辑回归都是预测模型中的重要工具&…...

【蓝桥杯冲冲冲】动态规划初步[USACO2006 OPEN] 县集市

蓝桥杯备赛 | 洛谷做题打卡day13 文章目录 蓝桥杯备赛 | 洛谷做题打卡day13题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示样例说明数据规模与约定 思路:方程: 题解代码我的一些话 [USACO2006 OPEN] 县集市 The County Fair 题目描述 每年…...

C#,入门教程(30)——扎好程序的笼子,错误处理 try catch

上一篇: C#,入门教程(29)——修饰词静态(static)的用法详解https://blog.csdn.net/beijinghorn/article/details/124683349 程序员语录:凡程序必有错,凡有错未必改! 程序出错的原因千千万&…...

操作教程|JumpServer堡垒机结合Ansible进行批量系统初始化

运维人员常常需要对资产进行系统初始化的操作,而初始化服务器又是一项繁琐的工作,需要花费运维人员大量的时间和精力。为了提高效率,许多组织会使用自动化工具和脚本来简化这些任务。自动化工具的运用可以大幅降低运维人员的工作量&#xff0…...

序列化VS反序列化

序列化、反序列化定义 如果我们需要持久化 Java 对象比如将 Java 对象保存在文件中,或者在网络传输 Java 对象,这些场景都需要用到序列化。 序列化(Serialization)是指将对象转换为字节序列的过程,也可以称之为对象的持…...

新数智空间:阿里云边缘云持续保持中国公有云市场第一

全球领先的 IT 市场研究和咨询公司 IDC 发布 《中国边缘云市场解读(2023H1)》报告 中国边缘公有云服务市场 阿里云持续第一 稳居市场第一,“边缘”逆势生长 近日,全球领先的 IT 市场研究和咨询公司 IDC 最新发布《中国边缘云市…...

【开源】基于JAVA语言的陕西非物质文化遗产网站

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 设计目标2.2 研究内容2.3 研究方法与过程2.3.1 系统设计2.3.2 查阅文献2.3.3 网站分析2.3.4 网站设计2.3.5 网站实现2.3.6 系统测试与效果分析 三、系统展示四、核心代码4.1 查询民间文学4.2 查询传统音乐4.3 增改传统舞…...

C++(Qt)软件调试---静态分析工具clang-tidy(18)

C(Qt)软件调试—静态分析工具clang-tidy(18) 文章目录 C(Qt)软件调试---静态分析工具clang-tidy(18)1、概述2、clang-tidy基本用法3、目前已有检查项4、Qt Creator中安装clang-tidy5、Qt Creator中使用clang-tidy6、Clang-Tidy配置…...

2401llvm,clang的重构引擎

Clang的重构引擎 展示如何使用重构API中的各种原语来实现不同的重构. LibTooling库提供了几个在开发重构操作时,使用的其他API. 可用重构引擎来实现,用编辑器或IDE中的选择启动的本地重构.可结合AST匹配器和重构引擎,以实现不适合源选择和/或必须查询某些指定节点的AST的重构…...

【C语言深度剖析——第四节(关键字4)】《C语言深度解剖》+蛋哥分析+个人理解

追求本质,不断进步 本文由睡觉待开机原创,转载请注明出处。 本内容在csdn网站首发 欢迎各位点赞—评论—收藏 如果存在不足之处请评论留言,共同进步! 这里写目录标题 一、空间的申请1.变量定义1.1变量定义的概念:1.2变…...

鸿蒙开发系列教程(五)--ArkTS语言:组件开发

1、基础组件 组件API文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V2/84_u58f0_u660e_u5f0f_u5f00_u53d1_u8303_u5f0f_uff09-0000001427744776-V2 查看组件API 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 容…...

Java:正则表达式讲解加举例,简洁易懂

正则表达式定义: 由一些特定的字符组成,代表的是一个规则。 作用:1.校验数据是否合法。2.可以在一段文本中查找满足要求的内容。 先自己写一个方法去校验qq号,比较与正则表达式的区别: 正则表达式的代码暂时可以不…...

2.机器学习-K最近邻(k-Nearest Neighbor,KNN)分类算法原理讲解

2️⃣机器学习-K最近邻(k-Nearest Neighbor,KNN)分类算法原理讲解 个人简介一算法概述二算法思想2.1 KNN的优缺点 三实例演示3.1电影分类3.2使用KNN算法预测 鸢(yuan)尾花 的种类3.3 预测年收入是否大于50K美元 个人简介 🏘️&…...

​WordPress顶部管理工具栏怎么添加一二级自定义菜单?

默认情况下,WordPress前端和后台页面顶部都有一个“管理工具栏”,左侧一般就是站点名称、评论、新建,右侧就是您好,用户名称和头像。那么我们是否可以在这个管理工具栏中添加一些一二级自定义菜单呢? 其实&#xff0c…...

Linux安装ossutil工具且在Jenkins中执行shell脚本下载文件

测试中遇到想通过Jenkins下载OSS桶上的文件,要先在linux上安装ossutil工具,记录安装过程如下: 一、下载安装ossutil,使用命令 1.下载:wget https://gosspublic.alicdn.com/ossutil/1.7.13/ossutil64 2.一定要赋权限…...

Docker命令---搜索镜像

介绍 使用docker命令搜索镜像。 命令 docker search 镜像命令:版本号示例 以搜索ElasticSearch镜像为例 docker search ElasticSearch...

docker使用http_proxy配置代理

钢铁知识库,一个学习python爬虫、数据分析的知识库。人生苦短,快用python。 在内网服务器中,docker经常需要下载拉取镜像,但由于没有网络要么只能手动导入镜像包,又或者通过http_proxy代理到其它服务器下载。 解决方法…...

综述:自动驾驶中的 4D 毫米波雷达

论文链接:《4D Millimeter-Wave Radar in Autonomous Driving: A Survey》 摘要 4D 毫米波 (mmWave) 雷达能够测量目标的距离、方位角、仰角和速度,引起了自动驾驶领域的极大兴趣。这归因于其在极端环境下的稳健性以及出色的速度和高度测量能力。 然而…...

蓝桥杯:1.特殊日期(Java)

题目描述 对于一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月和日的各位数字之和。 请问从1900年1月1日至9999年12月31日,总共有多少天,年份的数位数字之和等于月的数位数字之和加日的数位数字之和。 例如&…...

服务异步通讯之 SpringAMQP【微服务】

文章目录 一、初识 MQ1. 同步通讯2. 异步通讯3. MQ 常见框架 二、RabbitMQ 入门1. 概述和安装2. 常见消息模型3. 基础模型练习 三、SpringAMQP1. 简单队列模型2. 工作队列模型3. 发布订阅模型3.1 Fanout Exchange3.2 Direct Exchange3.3 Topic Exchange 一、初识 MQ 1. 同步通…...

LED闪烁

这段代码是用于STM32F10x系列微控制器的程序,主要目的是初始化GPIOA的Pin 0并使其按照特定的模式进行闪烁。下面是对这段代码的逐行解释: #include "stm32f10x.h":这一行包含了STM32F10x系列微控制器的设备头文件。这个头文件包含…...

php array_diff 比较两个数组bug避坑 深入了解

今天实用array_diff出现的异常问题,预想的结果应该是返回 "integral_initiate">"0",实际没有 先看测试代码: $a ["user_name">"测","see_num">0,"integral_initiate&quo…...

c++中STL的vector简单实现

文章目录 vector构造函数 vector()拷贝构造 vector()析构函数 ~vector()iterator 的定义begin()与const版本end()与const版本增删改查尾插push_back()尾删pop_back()指定位置插入insert()指定位置删除 erase() operator[]与const版本容量增容reserve()设置容量 resize() 成员函…...