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应用。如果您有任何疑问或遇到其他问题,请随时留言提问。

相关推荐
Luna_Lovegood_0012 分钟前
Qt QGraphicsScene 的用法
开发语言·qt
月忆3643 分钟前
Go语言接口实现面对对象的三大特征
开发语言·后端·golang
o0向阳而生0o12 分钟前
35、C# 中的反射(Reflection)
开发语言·c#·.net
程序员曼布17 分钟前
RabbitMQ 深度解析:从核心组件到复杂应用场景
java·开发语言·后端·rabbitmq
大G哥1 小时前
用 Java 和 DL4J 实现验证码识别系统
java·linux·开发语言·前端·python
AllenLeungX1 小时前
firewall docker 冲突问题解决(亲测有效)
运维·docker·容器
science怪兽1 小时前
【进阶】C# 委托(Delegate)知识点总结归纳
开发语言·笔记·c#
Ya-Jun1 小时前
性能优化实践:性能监控体系
android·开发语言·flutter·ios·性能优化
来一杯龙舌兰2 小时前
【Dockerfile】Dockerfile打包Tomcat及TongWeb应用镜像(工作实践踩坑教学)
docker·中间件·tomcat·国产化·dockerfile·tongweb·容器化部署
forth touch2 小时前
C与指针——输入输出
c语言·开发语言