做网站用dw的多吗,禁止同ip网站查询,中国建设银行网站 个人,上海一条网络科技有限公司本文将介绍如何使用 Docker 部署一个基于 Go 语言的后台服务应用 godco#xff0c;并介绍如何配置 MongoDB 数据库容器的连接#xff0c;确保应用能够成功启动并连接到容器方式部署的mongoDB数据库。 前提条件
1.已安装 Docker/Podman 2.已安装 MongoDB 数据库容器#xff… 本文将介绍如何使用 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-world1.1 编译打包 Go 应用
在 godco 项目根目录下执行以下命令编译打包应用
go build这将生成可执行文件 godco。
假设当前项目目录包含以下结构
release/
├─ godco
├─ static
└─ etc2. 使用 Docker 部署
2.1 构建 Docker 镜像
在项目根目录下创建一个 Dockerfile内容如下
# 使用官方的Golang镜像作为基础镜像
FROM golang:1.22# 设置工作目录
WORKDIR /app# 将项目代码复制到镜像中
COPY . .# 设置国内镜像代理
RUN go env -w GOPROXYhttps://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:latest2.3 配置 MongoDB
确保 MongoDB 容器在运行并且 godco 容器能够通过 Docker 网络连接到它。
2.3.1 创建自定义 Docker 网络
podman network create dco-net2.3.2 运行 MongoDB 容器
podman run -d \--name mongodb \-v ~/mongodb/data:/data/db \--network dco-net \docker.io/library/mongo2.4 修改配置文件
修改 etc/godco-api.yaml 文件中的 MongoDB 连接字符串
MonDB:Url: mongodb://test1:111111mongodb:27017/?tlsfalseauthSourceatomdcoDbName: atomdco3. 启动 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 GOPROXYhttps://goproxy.cn,direct
RUN go mod tidy
RUN go build -o godco# 第二阶段运行阶段
FROM alpine:latest
WORKDIR /app
COPY --frombuilder /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 准备工作
一创建相关目录
在使用者主机上创建用于存储MongoDB数据的/mongodb/data目录和用于存储日志的/mongodb/logs目录。
mkdir -p ~/mongodb/data
mkdir -p ~/mongodb/logs调整这两个目录的权限确保MongoDB容器内的mongodb用户UID 999和GID 999有读写权限。
sudo chown -R 999:999 ~/mongodb/data
sudo chown -R 999:999 ~/mongodb/logs二准备godco应用相关文件
将godco应用的etc和static文件夹拷贝到主机上的合适位置例如/path/to/your/etc和/path/to/your/static。
5.2 镜像导出与分发
一导出镜像
导出mongodb镜像为mongodb.tar文件。
docker save -o mongodb.tar mongodb:latest导出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一脚本说明 加载镜像使用docker load -i命令加载之前导出的.tar镜像文件。 启动MongoDB容器通过docker run命令启动MongoDB容器挂载数据目录、日志目录到容器内相应位置并连接到自定义网络dco - net。 等待MongoDB启动使用sleep 10命令等待10秒确保MongoDB容器有足够时间启动。 启动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 running5.3 注意事项 确保Docker已经在接收者的机器上安装并运行。 根据实际情况调整挂载目录路径是否正确。
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-world2. 安装 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 --version3. 创建 Docker Compose 文件
在项目根目录下创建一个 docker-compose.yml 文件内容如下
version: 3.8services:mongodb:image: mongo:latestcontainer_name: mongodbenvironment:- MONGO_INITDB_ROOT_USERNAMEadmin- MONGO_INITDB_ROOT_PASSWORDadmin123volumes:- mongodb_data:/data/db- mongodb_logs:/var/log/mongodbnetworks:- dco-netgodco:image: godco:latestcontainer_name: godcoports:- 8080:8080volumes:- ./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_USERNAMEadmin- MONGO_INITDB_ROOT_PASSWORDadmin123volumes:- mongodb_data:/data/db- mongodb_logs:/var/log/mongodb- ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.jsnetworks:- dco-net5. 启动 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:111111mongodb:27017/?tlsfalseauthSourceatomdcoDbName: 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:111111mongodb:27017/?tlsfalseauthSourceatomdco是否能够认证通过 可进入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镜像
使用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应用。如果您有任何疑问或遇到其他问题请随时留言提问。