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 update
 sudo 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:latest

echo "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"; then
  docker load -i mongodb.tar
fi

# 加载 godco 镜像(如果尚未加载)
if ! docker images | grep -q "godco:latest"; then
  docker load -i godco.tar
fi

# 创建自定义Docker网络(如果尚未创建)
if ! docker network ls | grep -q "dco-net"; then
  docker network create dco-net
fi

# 启动 MongoDB 容器(如果尚未启动)
if ! docker ps -a | grep -q "mongodb"; then
  docker 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"; then
  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:latest
fi

echo "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 update
  sudo 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:latest
    container_name: mongodb
    environment:
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=admin123
    volumes:
      - mongodb_data:/data/db
      - mongodb_logs:/var/log/mongodb
    networks:
      - dco-net

  godco:
    image: godco:latest
    container_name: godco
    ports:
      - "8080:8080"
    volumes:
      - ./etc:/app/etc
      - ./static:/app/static
    networks:
      - dco-net
    depends_on:
      - mongodb

volumes:
  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:latest
    container_name: mongodb
    environment:
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=admin123
    volumes:
      - mongodb_data:/data/db
      - mongodb_logs:/var/log/mongodb
      - ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js
    networks:
      - 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应用。如果您有任何疑问或遇到其他问题,请随时留言提问。

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

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

相关文章

git多人协作

目录 一、项目克隆 二、 1、进入克隆仓库设置 2、协作处理 3、冲突处理 4、多人协作分支的推送拉取删除 1、分支推送(2种) 2、远程分支拉取(2种) 3、远程分支删除 一、项目克隆 git clone 画船听雨眠/test1 (自定义的名…

线性数据结构:单向链表

放弃眼高手低,你真正投入学习,会因为找到一个新方法产生成就感,学习不仅是片面的记单词、学高数......只要是提升自己的过程,探索到了未知,就是学习。 目录 一.链表的理解 二.链表的分类(重点理解&#xf…

linux下ollama更换模型路径

Linux下更换Ollama模型下载路径指南   在使用Ollama进行AI模型管理时,有时需要根据实际需求更改模型文件的存储路径。本文将详细介绍如何在Linux系统中更改Ollama模型的下载路径。 一、关闭Ollama服务   在更改模型路径之前,需要先停止Ollama服务。…

影视文件大数据高速分发方案

在当今的数字时代,影视行业的内容创作和传播方式经历了翻天覆地的变化。随着4K、8K高清视频的普及,以及虚拟现实(VR)和增强现实(AR)技术的发展,影视文件的数据量正以前所未有的速度增长。这就要求行业内的参与者必须拥有高效的大数据传输解决…

【AI】探索自然语言处理(NLP):从基础到前沿技术及代码实践

Hi ! 云边有个稻草人-CSDN博客 必须有为成功付出代价的决心,然后想办法付出这个代价。 目录 引言 1. 什么是自然语言处理(NLP)? 2. NLP的基础技术 2.1 词袋模型(Bag-of-Words,BoW&#xff…

HTMLCSS :下雪了

这段代码创建了一个动态的雪花飘落加载动画,通过 CSS 技术实现了雪花的下落和消失效果,为页面添加了视觉吸引力和动态感。 大家复制代码时,可能会因格式转换出现错乱,导致样式失效。建议先少量复制代码进行测试,若未能…

Android 音视频编解码 -- MediaCodec

引言 如果我们只是简单玩一下音频、视频播放,那么使用 MediaPlayer SurfaceView 播放就可以了,但如果想加个水印,加点其他特效什么的,那就不行了; 学习 Android 自带的硬件码类 – MediaCodec。 MediaCodec 介绍 在A…

一文了解阿里的 Qwen2.5 模型

最近被DeepSeek刷屏了,但是在之外阿里在2025年1月28日推出了Qwen 2.5 Max模型。 Qwen2.5-Max 的特点:大规模的 MoE 模型,预训练于超 20 万亿 tokens,并经过 SFT 和 RLHF 后训练。 性能表现:在多个基准测试中与领先模型…

DeepSeek R1 linux云部署

云平台:AutoDL 模型加载工具:Ollama 参考:https://github.com/ollama/ollama/blob/main/docs/linux.md 下载Ollama 服务器上下载ollama比较慢,因此我使用浏览器先下载到本地电脑上。 https://ollama.com/download/ollama-linux…

FlashAttention v1 论文解读

论文标题:FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness 论文地址:https://arxiv.org/pdf/2205.14135 FlashAttention 是一种重新排序注意力计算的算法,它无需任何近似即可加速注意力计算并减少内存占用。…

Vue - shallowRef 和 shallowReactive

一、shallowRef 和 shallowReactive (一)shallowRef 在 Vue 3 中,shallowRef 是一个用于创建响应式引用的 API,它与 ref 相似,但它只会使引用的基本类型(如对象、数组等)表现为响应式&#xf…

【深度学习】softmax回归的简洁实现

softmax回归的简洁实现 我们发现(通过深度学习框架的高级API能够使实现)(softmax)线性(回归变得更加容易)。 同样,通过深度学习框架的高级API也能更方便地实现softmax回归模型。 本节继续使用Fashion-MNIST数据集,并保持批量大小为256。 import torch …

ESP32-c3实现获取土壤湿度(ADC模拟量)

1硬件实物图 2引脚定义 3使用说明 4实例代码 // 定义土壤湿度传感器连接的模拟输入引脚 const int soilMoisturePin 2; // 假设连接到GPIO2void setup() {// 初始化串口通信Serial.begin(115200); }void loop() {// 读取土壤湿度传感器的模拟值int sensorValue analogRead…

【python】python油田数据分析与可视化(源码+数据集)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。 【python】python油田数据分析与可视化&#xff08…

代码讲解系列-CV(一)——CV基础框架

文章目录 一、环境配置IDE选择一套完整复现安装自定义cuda算子 二、Linux基础文件和目录操作查看显卡状态压缩和解压 三、常用工具和pipeline远程文件工具版本管理代码辅助工具 随手记录下一个晚课 一、环境配置 pytorch是AI框架用的很多,或者 其他是国内的框架 an…

HTB:Alert[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用ffuf对alert.htb域名进行子域名FUZZ 使用go…

小红的合数寻找

A-小红的合数寻找_牛客周赛 Round 79 题目描述 小红拿到了一个正整数 x,她希望你在 [x,2x] 区间内找到一个合数,你能帮帮她吗? 一个数为合数,当且仅当这个数是大于1的整数,并且不是质数。 输入描述 在一行上输入一…

Linux环境下的Java项目部署技巧:安装 Mysql

查看 myslq 是否安装: rpm -qa|grep mysql 如果已经安装,可执行命令来删除软件包: rpm -e --nodeps 包名 下载 repo 源: http://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm 执行命令安装 rpm 源(根据下载的…

基于springboot+vue的哈利波特书影音互动科普网站

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

在React中使用redux

一、首先安装两个插件 1.Redux Toolkit 2.react-redux 第一步:创建模块counterStore 第二步:在store的入口文件进行子模块的导入组合 第三步:在index.js中进行store的全局注入 第四步:在组件中进行使用 第五步:在组件中…