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:

bash 复制代码
 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 项目根目录下,执行以下命令编译打包应用:

bash 复制代码
go build

这将生成可执行文件 godco。

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

bash 复制代码
release/
├─ godco
├─ static
└─ etc

2. 使用 Docker 部署

2.1 构建 Docker 镜像

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

bash 复制代码
# 使用官方的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"]

构建镜像命令:

bash 复制代码
podman build --pull --rm -f 'Dockerfile' -t 'godco:latest' '.'

2.2 运行 Docker 容器

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

bash 复制代码
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 网络
bash 复制代码
podman network create dco-net
2.3.2 运行 MongoDB 容器
bash 复制代码
podman run -d \
  --name mongodb \
  -v ~/mongodb/data:/data/db \
  --network dco-net \
  docker.io/library/mongo

2.4 修改配置文件

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

bash 复制代码
MonDB:
  Url: "mongodb://test1:111111@mongodb:27017/?tls=false&authSource=atomdco"
  DbName: "atomdco"

3. 启动 godco 服务

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

4. 验证部署

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

bash 复制代码
podman logs dco-verification-app

或者实时查看日志文件:

bash 复制代码
podman logs -f dco-verification-app

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

bash 复制代码
[info] Connected to MongoDB server at mongodb:27017
[info] MongoDB database atomdco is ready

改进的Docker部署方式

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

改进的Dockerfile文件如下:

bash 复制代码
# 第一阶段:构建阶段
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"]

构建镜像:

bash 复制代码
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目录。
bash 复制代码
mkdir -p ~/mongodb/data
mkdir -p ~/mongodb/logs
  1. 调整这两个目录的权限,确保MongoDB容器内的mongodb用户(UID 999和GID 999)有读写权限。
bash 复制代码
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文件。
bash 复制代码
docker save -o mongodb.tar mongodb:latest
  1. 导出godco镜像为godco.tar文件。
bash 复制代码
docker save -o godco.tar godco:latest

(二)分发镜像

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

5.3 启动脚本

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

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通信。

(二)运行脚本

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

bash 复制代码
chmod +x start_containers.sh
./start_containers.sh

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

bash 复制代码
#!/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 部署 godco 应用,并确保它能够成功连接到 MongoDB 数据库。使用 Docker 可以简化部署过程,确保在不同环境中的一致性。

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

相关推荐
假客套14 分钟前
Java小白入门教程:类和对象
java·开发语言
zhuyasen26 分钟前
多维度详细比较 kratos、go-zero、goframe、sponge 框架
后端·http·微服务·rpc·golang
猫九森29 分钟前
golang面试题
面试·golang
依恋、阳光1 小时前
java的Stream流
java·开发语言·数据结构·stream
墨绿色的摆渡人1 小时前
python | OpenCV小记(一):cv2.imread(f) 读取图像操作(待更新)
开发语言·python·opencv
小林熬夜学编程2 小时前
【Python】第七弹---Python基础进阶:深入字典操作与文件处理技巧
开发语言·前端·python·算法
明月看潮生2 小时前
青少年编程与数学 02-008 Pyhon语言编程基础 05课题、数据类型
开发语言·python·青少年编程·数据类型·编程与数学
lly2024063 小时前
Ruby 模块(Module)
开发语言
子非鱼9213 小时前
手写防抖函数、手写节流函数
开发语言·前端·javascript