Golang 应用的 Docker 部署方式介绍及使用详解

本文将介绍如何使用 Docker 部署一个基于 Go 语言的后台服务应用 godco,并介绍如何配置 MongoDB 数据库容器的连接,确保应用能够成功启动并连接到容器方式部署的mongoDB数据库。

前提条件

1.已安装 Docker/Podman
2.已安装 MongoDB 数据库容器(参见博文:使用 Docker(Podman) 部署 MongoDB 数据库及使用详解)
3.已安装 Golang 环境

1. 准备工作

Docker可以简化应用的部署过程,确保在不同环境中的一致性。以下是使用Docker部署该项目的步骤:

安装Docker

如果尚未安装Docker,请先安装Docker环境。
对于Ubuntu系统,可以使用以下命令安装Docker:

 sudo apt-get updatesudo apt-get install docker.io#如果失败,则可以使用这个:sudo apt-get install docker#或者使用podman: sudo apt install podman#检验下docker是否安装成功:docker run hello-world

1.1 编译打包 Go 应用

在 godco 项目根目录下,执行以下命令编译打包应用:

go build

这将生成可执行文件 godco。

假设当前项目目录包含以下结构:

release/
├─ godco
├─ static
└─ etc

2. 使用 Docker 部署

2.1 构建 Docker 镜像

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

# 使用官方的Golang镜像作为基础镜像
FROM golang:1.22# 设置工作目录
WORKDIR /app# 将项目代码复制到镜像中
COPY . .# 设置国内镜像代理
RUN go env -w GOPROXY=https://goproxy.cn,direct# 下载依赖包
RUN go mod tidy# 构建可执行文件
RUN go build -o godco# 暴露服务端口
EXPOSE 8080# 运行应用
CMD ["./godco"]

构建镜像命令:

podman build --pull --rm -f 'Dockerfile' -t 'godco:latest' '.'

2.2 运行 Docker 容器

构建好镜像后,使用以下命令运行容器:

podman run -d \-p 8080:8080 \-v /path/to/your/etc:/app/etc \-v /path/to/your/static:/app/static \--network dco-net \--name dco-verification-app \godco:latest

2.3 配置 MongoDB

确保 MongoDB 容器在运行,并且 godco 容器能够通过 Docker 网络连接到它。

2.3.1 创建自定义 Docker 网络
podman network create dco-net
2.3.2 运行 MongoDB 容器
podman run -d \--name mongodb \-v ~/mongodb/data:/data/db \--network dco-net \docker.io/library/mongo

2.4 修改配置文件

修改 etc/godco-api.yaml 文件中的 MongoDB 连接字符串:

MonDB:Url: "mongodb://test1:111111@mongodb:27017/?tls=false&authSource=atomdco"DbName: "atomdco"

3. 启动 godco 服务

确保所有配置正确无误后,godco 容器将自动启动并连接到 MongoDB 数据库。

4. 验证部署

查看 godco 容器的日志文件,以确认它是否成功连接到 MongoDB 并启动服务。

podman logs dco-verification-app

或者实时查看日志文件:

podman logs -f dco-verification-app

你应该能看到类似以下的日志信息,确认 godco 成功连接到 MongoDB:

[info] Connected to MongoDB server at mongodb:27017
[info] MongoDB database atomdco is ready

改进的Docker部署方式

上述Dockerfile的构建方式,包含了代码文件和依赖的库,生成的镜像太大,仅适合用来调试。如果部署到生成环境,则应该使用多阶段构建减少镜像体积,MongoDB也运行在单独的容器中,并通过Docker网络使godco容器能够连接到MongoDB容器。

改进的Dockerfile文件如下:

# 第一阶段:构建阶段
FROM golang:1.22 AS builder
WORKDIR /app
COPY . .
RUN go env -w GOPROXY=https://goproxy.cn,direct
RUN go mod tidy
RUN go build -o godco# 第二阶段:运行阶段
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/godco /app/godco
COPY etc /app/etc
COPY static /app/static
EXPOSE 8080
CMD ["./godco"]

构建镜像:

podman build --pull --rm -f 'Dockerfile' -t 'godco:latest' '.'

通过这种方式,可以构建出更小的Docker镜像,同时保持应用的完整性和功能性。

5.如何分发给别人使用

可以使用 Docker Hub 或其他镜像仓库,比如推送镜像到 Docker Hub,这样使用者可以直接拉取并使用。如果不使用镜像仓库,则还可以将两个 Docker 镜像(mongodb 和 godco)一起分享给别人,并提供一个启动脚本以按顺序启动这两个容器。以下介绍手动分发的使用举例。

5.1 准备工作

(一)创建相关目录

  1. 在使用者主机上创建用于存储MongoDB数据的/mongodb/data目录和用于存储日志的/mongodb/logs目录。
mkdir -p ~/mongodb/data
mkdir -p ~/mongodb/logs
  1. 调整这两个目录的权限,确保MongoDB容器内的mongodb用户(UID 999和GID 999)有读写权限。
sudo chown -R 999:999 ~/mongodb/data
sudo chown -R 999:999 ~/mongodb/logs

(二)准备godco应用相关文件

  1. 将godco应用的etc和static文件夹拷贝到主机上的合适位置,例如/path/to/your/etc和/path/to/your/static。

5.2 镜像导出与分发

(一)导出镜像

  1. 导出mongodb镜像为mongodb.tar文件。
docker save -o mongodb.tar mongodb:latest
  1. 导出godco镜像为godco.tar文件。
docker save -o godco.tar godco:latest

(二)分发镜像
可以通过USB驱动器、网络传输工具(如scp、rsync)或者云存储服务(如Dropbox、Google Drive)将mongodb.tar和godco.tar文件发送给其他人。

5.3 启动脚本

创建一个名为start_containers.sh的Bash脚本,内容如下:

#!/bin/bash# 加载 MongoDB 镜像
docker load -i mongodb.tar# 加载 godco 镜像
docker load -i godco.tar
# 创建自定义Docker网络
docker network create dco-net
# 启动 MongoDB 容器
docker run -d \--name mongodb \-v ~/mongodb/data:/data/db \-v ~/mongodb/logs:/var/log/mongodb \--network dco-net \mongo:latest# 等待 MongoDB 容器启动
echo "Waiting for MongoDB to start..."
sleep 10# 启动 godco 容器
docker run -d \-p 8080:8080 \-v /path/to/your/etc:/app/etc \-v /path/to/your/static:/app/static \--network dco-net \--name godco \godco:latestecho "godco container started"

(一)脚本说明

  1. 加载镜像:使用docker load -i命令加载之前导出的.tar镜像文件。

  2. 启动MongoDB容器:通过docker run命令启动MongoDB容器,挂载数据目录、日志目录到容器内相应位置,并连接到自定义网络dco - net。

  3. 等待MongoDB启动:使用sleep 10命令等待10秒,确保MongoDB容器有足够时间启动。

  4. 启动godco容器:同样使用docker run命令启动godco容器,挂载配置文件目录和静态文件目录到容器内相应位置,连接到相同的网络以便与MongoDB通信。

(二)运行脚本

接收者可以通过以下命令给予脚本执行权限并运行:

chmod +x start_containers.sh
./start_containers.sh

如果再次执行该脚本,将会报错。可以优化如下:

#!/bin/bash# 加载 MongoDB 镜像(如果尚未加载)
if ! docker images | grep -q "mongo:latest"; thendocker load -i mongodb.tar
fi# 加载 godco 镜像(如果尚未加载)
if ! docker images | grep -q "godco:latest"; thendocker load -i godco.tar
fi# 创建自定义Docker网络(如果尚未创建)
if ! docker network ls | grep -q "dco-net"; thendocker network create dco-net
fi# 启动 MongoDB 容器(如果尚未启动)
if ! docker ps -a | grep -q "mongodb"; thendocker run -d \--name mongodb \-v ~/mongodb/data:/data/db \-v ~/mongodb/logs:/var/log/mongodb \--network dco-net \mongo:latest
fi# 等待 MongoDB 容器启动
echo "Waiting for MongoDB to start..."
sleep 10# 启动 godco 容器(如果尚未启动)
if ! docker ps -a | grep -q "godco"; thendocker run -d \-p 8080:8080 \-v /path/to/your/etc:/app/etc \-v /path/to/your/static:/app/static \--network dco-net \--name godco \godco:latest
fiecho "godco container started or already running"

5.3 注意事项

  1. 确保Docker已经在接收者的机器上安装并运行。

  2. 根据实际情况调整挂载目录路径是否正确。

6. 使用 Docker Compose 部署

上述docker部署方式虽然写了个脚本,减轻了手动启动单个容器的负担,但是还是不方便管理多个容器。这时候docker compose方式部署就显得很有必要了,以下介绍下docker compose方式的部署。

Docker Compose 可以简化多容器应用的部署过程,确保在不同环境中的一致性。

Docker Compose 介绍

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,你可以使用 YAML 文件来配置应用程序的服务、网络和卷,然后使用一个命令就能从你的配置中创建并启动所有服务。

以下是使用 Docker Compose 部署该项目的详细步骤:

1. 安装 Docker

如果尚未安装Docker,请先安装Docker环境。

  • 对于Ubuntu系统,可以使用以下命令安装Docker:
  sudo apt-get updatesudo apt-get install docker.io# 检验Docker是否安装成功docker run hello-world
2. 安装 Docker Compose

如果尚未安装Docker Compose,请先安装Docker Compose环境。

  • 对于Ubuntu系统,可以使用以下命令安装Docker Compose:
  sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose# 给予可执行权限sudo chmod +x /usr/local/bin/docker-compose# 检验Docker Compose是否安装成功docker-compose --version
3. 创建 Docker Compose 文件

在项目根目录下创建一个 docker-compose.yml 文件,内容如下:

version: '3.8'services:mongodb:image: mongo:latestcontainer_name: mongodbenvironment:- MONGO_INITDB_ROOT_USERNAME=admin- MONGO_INITDB_ROOT_PASSWORD=admin123volumes:- mongodb_data:/data/db- mongodb_logs:/var/log/mongodbnetworks:- dco-netgodco:image: godco:latestcontainer_name: godcoports:- "8080:8080"volumes:- ./etc:/app/etc- ./static:/app/staticnetworks:- dco-netdepends_on:- mongodbvolumes:mongodb_data:mongodb_logs:networks:dco-net:
4. 创建 MongoDB 初始化脚本(可选)

为了方便初始化数据库和用户,可以创建一个 init-mongo.js 文件,内容如下:

db = db.getSiblingDB("atomdco")
db.createUser({user: "test1",pwd: "111111",roles: [{ role: "readWrite", db: "atomdco" }]
})

然后在 docker-compose.yml 中添加初始化脚本的挂载:

services:mongodb:image: mongo:latestcontainer_name: mongodbenvironment:- MONGO_INITDB_ROOT_USERNAME=admin- MONGO_INITDB_ROOT_PASSWORD=admin123volumes:- mongodb_data:/data/db- mongodb_logs:/var/log/mongodb- ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.jsnetworks:- dco-net
5. 启动 Docker Compose 服务

在项目根目录下运行以下命令启动服务:

docker-compose up -d
  • -d:后台运行容器。
6. 配置 etc/godco-api.yaml 中的 MongoDB 连接字符串

由于 godco 容器和 mongodb 容器在同一个自定义网络中,可以使用 mongodb 作为主机名。修改 etc/godco-api.yaml 文件中的 MongoDB 连接字符串如下:

MonDB:Url: "mongodb://test1:111111@mongodb:27017/?tls=false&authSource=atomdco"DbName: "atomdco"
注注注特别注意事项

1.这里有个坑,默认容器开启的是127.0.0.1:27017,即便使用同一docker网络,其他容器也无法连接到mongodb容器。
因此docker-compose.yml增加-v配置:

 volumes:- mongodb_data:/data/db- mongodb_logs:/var/log/mongodb- ./mongod.conf:/etc/mongod.conf

把这个配置文件留在主机外修改配置,bindIp改为:bindIp: 0.0.0.0。再重启mongdodb容器。

2.注意数据库权限问题,访问的"mongodb://test1:111111@mongodb:27017/?tls=false&authSource=atomdco"是否能够认证通过?
可进入mongodb容器内进行创建:

# 进入容器podman-compose exec mongodb bash
# 使用管理员用户名密码登录,这里的用户名密码为docker-compose.yml文件中指定的。mongo -u admin -p admin123
# 创建用户及权限use atomdco; // 切换到目标数据库db.createUser({user: "test1",pwd: "111111",roles: [{ role: "readWrite", db: "atomdco" }]
});

7. 报错解决

./godco: /lib64/libc.so.6: version `GLIBC_2.34’ not found (required by ./godco) ,golang的应用,使用FROM alpine:latest 报这个错,如何解决?
这个错误表明你的golang应用godco需要glibc版本至少为2.34,但是Alpine Linux默认使用的是musl libc而不是glibc。为了解决这个问题,你可以采取以下步骤之一:

方法一:使用基于glibc的Alpine镜像

  1. 使用alpine-glibc镜像作为基础镜像,这个镜像在Alpine的基础上预装了glibc。
FROM alpine-glibc:latest# 安装golang环境(如果需要)
RUN apk add --no-cache go# 复制你的应用到镜像中
COPY . /app
WORKDIR /app# 编译你的应用(如果需要)
RUN go build -o godco .# 运行你的应用
CMD ["./godco"]

方法二:静态编译你的golang应用
如果你的golang应用可以静态编译,那么你可以避免依赖glibc。在编译时添加-ldflags '-extldflags “-static”'参数来生成静态链接的二进制文件。

go build -o godco -ldflags '-extldflags "-static"' .

方法三:使用其他基础镜像
如果上述方法不适用,你可以考虑使用基于glibc的其他轻量级Linux发行版作为基础镜像,例如debian:sid-slim或ubuntu:20.04。推荐FROM debian:sid-slim

FROM debian:sid-slim# 安装golang环境和glibc(如果需要)
RUN apt-get update && apt-get install -y \golang \&& rm -rf /var/lib/apt/lists/*# 复制你的应用到镜像中
COPY . /app
WORKDIR /app# 编译你的应用(如果需要)
RUN go build -o godco .# 运行你的应用
CMD ["./godco"]

8. 总结

通过上述步骤,您可以使用 Docker 部署 godco 应用,并确保它能够成功连接到 MongoDB 数据库。使用 Docker 可以简化部署过程,确保在不同环境中的一致性。

希望这篇博文能帮助您顺利部署 golang应用。如果您有任何疑问或遇到其他问题,请随时留言提问。

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

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

相关文章

[ESP32:Vscode+PlatformIO]新建工程 常用配置与设置

2025-1-29 一、新建工程 选择一个要创建工程文件夹的地方,在空白处鼠标右键选择通过Code打开 打开Vscode,点击platformIO图标,选择PIO Home下的open,最后点击new project 按照下图进行设置 第一个是工程文件夹的名称 第二个是…

3、从langchain到rag

文章目录 本文介绍向量和向量数据库向量向量数据库 索引开始动手实现rag加载文档数据并建立索引将向量存放到向量数据库中检索生成构成一条链 本文介绍 从本节开始,有了上一节的langchain基础学习,接下来使用langchain实现一个rag应用,并稍微…

【自然语言处理(NLP)】基于Transformer架构的预训练语言模型:BERT 训练之数据集处理、训练代码实现

文章目录 介绍BERT 训练之数据集处理BERT 原理及模型代码实现数据集处理导包加载数据生成下一句预测任务的数据从段落中获取nsp数据生成遮蔽语言模型任务的数据从token中获取mlm数据将文本转换为预训练数据集创建Dataset加载WikiText-2数据集 BERT 训练代码实现导包加载数据构建…

41【文件名的编码规则】

我们在学习的过程中,写出数据或读取数据时需要考虑编码类型 火山采用:UTF-16 易语言采用:GBK php采用:UTF-8 那么我们写出的文件名应该是何种编码的?比如火山程序向本地写出一个“测试.txt”,理论上这个“测…

NLP深度学习 DAY4:Word2Vec详解:两种模式(CBOW与Skip-gram)

用稀疏向量表示文本,即所谓的词袋模型在 NLP 有着悠久的历史。正如上文中介绍的,早在 2001年就开始使用密集向量表示词或词嵌入。Mikolov等人在2013年提出的创新技术是通过去除隐藏层,逼近目标,进而使这些单词嵌入的训练更加高效。…

HarmonyOS简介:应用开发的机遇、挑战和趋势

问题 更多的智能设备并没有带来更好的全场景体验 连接步骤复杂数据难以互通生态无法共享能力难以协同 主要挑战 针对不同设备上的不同操作系统,重复开发,维护多套版本 多种语言栈,对人员技能要求高 多种开发框架,不同的编程…

Windows11 不依赖docker搭建 deepseek-R1 1.5B版本(附 Open WebUi搭建方式)

零、前言 过年这几天发现 DeepSeek 非常火,试用了一下发现确实不错。与豆包、kimi、perplexity 这些相比完全不是一个次元的存在,特别是用ta写文章的时候体验非常好。所以试着自己搭一个环境。 一、安装 Ollama和DeepSeek-R1 我的安装方式很简单&#xf…

解决whisper 本地运行时GPU 利用率不高的问题

我在windows 环境下本地运行whisper 模型,使用的是nivdia RTX4070 显卡,结果发现GPU 的利用率只有2% 。使用 import torch print(torch.cuda.is_available()) 返回TRUE。表示我的cuda 是可用的。 最后在github 的下列网页上找到了问题 极低的 GPU 利…

springCload快速入门

原作者:3. SpringCloud - 快速通关 前置知识: Java17及以上、MavenSpringBoot、SpringMVC、MyBatisLinux、Docker 1. 分布式基础 1.1. 微服务 微服务架构风格,就像是把一个单独的应用程序开发为一套小服务,每个小服务运行在自…

Gradle配置指南:深入解析settings.gradle.kts(Kotlin DSL版)

文章目录 Gradle配置指南:深入解析settings.gradle.kts(Kotlin DSL版)settings.gradle.kts 基础配置选项单项目配置多项目配置 高级配置选项插件管理(Plugin Management)基础配置模板案例:Android项目标准配…

C++ Primer 标准库类型string

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…

[EAI-028] Diffusion-VLA,能够进行多模态推理和机器人动作预测的VLA模型

Paper Card 论文标题:Diffusion-VLA: Scaling Robot Foundation Models via Unified Diffusion and Autoregression 论文作者:Junjie Wen, Minjie Zhu, Yichen Zhu, Zhibin Tang, Jinming Li, Zhongyi Zhou, Chengmeng Li, Xiaoyu Liu, Yaxin Peng, Chao…

使用MATLAB进行雷达数据采集可视化

本文使用轮趣科技N10雷达,需要源码可在后台私信或者资源自取 1. 项目概述 本项目旨在通过 MATLAB 读取 N10 激光雷达 的数据,并进行 实时 3D 点云可视化。数据通过 串口 传输,并经过解析后转换为 三维坐标点,最终使用 pcplayer 进…

UE求职Demo开发日志#19 给物品找图标,实现装备增加属性,背包栏UI显示装备

1 将用到的图标找好,放一起 DataTable里对应好图标 测试一下能正确获取: 2 装备增强属性思路 给FMyItemInfo添加一个枚举变量记录类型(物品,道具,装备,饰品,武器)--> 扩展DataT…

Docker 部署 Starrocks 教程

Docker 部署 Starrocks 教程 StarRocks 是一款高性能的分布式分析型数据库,主要用于 OLAP(在线分析处理)场景。它最初是由百度的开源团队开发的,旨在为大数据分析提供一个高效、低延迟的解决方案。StarRocks 支持实时数据分析&am…

(9) 上:学习与验证 linux 里的 epoll 对象里的 EPOLLIN、 EPOLLHUP 与 EPOLLRDHUP 的不同

(1)经过之前的学习。俺认为结论是这样的,因为三次握手到四次挥手,到 RST 报文,都是 tcp 连接上收到了报文,这都属于读事件。所以: EPOLLIN : 包含了读事件, FIN 报文的正常四次挥手、…

python学opencv|读取图像(五十二)使用cv.matchTemplate()函数实现最佳图像匹配

【1】引言 前序学习了图像的常规读取和基本按位操作技巧,相关文章包括且不限于: python学opencv|读取图像-CSDN博客 python学opencv|读取图像(四十九)原理探究:使用cv2.bitwise()系列函数实现图像按位运算-CSDN博客…

数据分析系列--⑦RapidMiner模型评价(基于泰坦尼克号案例含数据集)

一、前提 二、模型评估 1.改造⑥ 2.Cross Validation算子说明 2.1Cross Validation 的作用 2.1.1 模型评估 2.1.2 减少过拟合 2.1.3 数据利用 2.2 Cross Validation 的工作原理 2.2.1 数据分割 2.2.2 迭代训练与测试 ​​​​​​​ 2.2.3 结果汇总 ​​​​​​​ …

DeepSeek r1本地安装全指南

环境基本要求 硬件配置 需要本地跑模型,兼顾质量、性能、速度以及满足日常开发需要,我们需要准备以下硬件: CPU:I9内存:128GB硬盘:3-4TB 最新SSD,C盘确保有400GB,其它都可划成D盘…

AI开发学习之——PyTorch框架

PyTorch 简介 PyTorch (Python torch)是由 Facebook AI 研究团队开发的开源机器学习库,广泛应用于深度学习研究和生产。它以动态计算图和易用性著称,支持 GPU 加速计算,并提供丰富的工具和模块。 PyTorch的主要特点 …