「容器管理系统」开发篇:10. Dockerfile 部署

回顾

项目已开源:基于 Golang 的 容器管理系统

前言

大家好,我是码一行。

本章节咱们来讲一下如何把 Golang 项目部署到 Docker 容器中。这里先说一下容器的优势:

  • 更高效的利用系统资源
  • 进程级别的隔离
  • 更快速的启动时间
  • 一致的运行环境
  • 持续交付和部署
  • 更轻松的迁移
  • 更轻松的维护和扩展

使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合持续集成系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署系统进行自动部署。

如何通过 Dockerfile 构建镜像?

  • Dockerfile
Dockerfile 复制代码
FROM golang:1.21-alpine AS builder

MAINTAINER CodeLine "1145938682@qq.com"
RUN mkdir -p /home/work/app/go-cloud-native
WORKDIR /home/work/app/go-cloud-native
COPY . .
RUN echo go-cloud-native \
    && go env -w GOPROXY=https://goproxy.cn,direct \
    && go mod download \
    && go build -o build/package/main ./cmd/server/main.go


# 使用最小镜像来运行编译后的 go 项目
FROM alpine as runner
MAINTAINER go-cloud-native "1145938682@qq.com"
WORKDIR /home/work/app/go-cloud-native
COPY --from=builder /home/work/app/go-cloud-native/build/package ./build/package
COPY --from=builder /home/work/app/go-cloud-native/configs ./configs

EXPOSE 8000

CMD ["/home/work/app/go-cloud-native/build/package/main", "-c", "/home/work/app/go-cloud-native/configs/local.toml"]

说明:

构建编译环境

  • 要减小镜像体积,首先多阶段构建这很重要,这样就可以把编译环境和运行环境分开。
  • 在构建程序包的时候,使用带编译环境的镜像去构建,运行的时候其实完全不需要 go 的编译环境,使用空镜像
  • 因为项目依赖 go1.21 的版本,所以选择 golang:1.21-alpine 作为编译环境,是因为这是体积最小的golang编译环境
  • MAINTAINER 设置镜像作者,这里不用太关心用途
  • 创建项目目录
  • WORKDIR 定义项目目录并进入该目录
  • 复制目录到镜像目录
  • 设置 GOPROXY 是为了提升构建速度
  • 执行 go mod download 拉取项目依赖包
  • go build 编译 go 程序到指定目录

构建运行环境

  • 这里空镜像使用的是 alpine
  • 建议选择 alpinealpine 的镜像大小是 5.61MB 这个大小其实还是镜像解压后的大小,实际上下载镜像的时候,只需要下载 2.68 MB
  • 拉取最小镜像 alpine
  • WORKDIR 进入项目空间
  • 复制编译环境中 go build 之后的二进制文件
  • 复制编译环境中依赖的配置文件
  • 镜像使用端口
  • 镜像执行命令

解读完 Dockerfile 文件,下面就是要执行构建命令了:

sh 复制代码
# -t 是指定镜像名称,格式:镜像名称:版本号
# .  是指当前目录,这里跟 Dockerfile 的目录位置有关
# 如果 Dockerfile 在当前根目录,直接用 . 就可以
# 如果 Dockerfile 不在当前目录,也可以指定 Dockerfile 路径地址
docker build . -t go-cloud-native:v1.1.0

启动指定镜像的容器

docker 的容器启动命令: docker run

sh 复制代码
docker run -d --name go-cloud-native -p 8000:8000 --privileged=true go-cloud-native:v1.1.0

解读一下:

  • -d 是让容器后台运行
  • --name 定义容器名称
  • -p 指定端口映射,格式为:主机(宿主)端口:容器端口
  • --privileged=true 给容器开特权,这样 root 用户才是真正的 root 用户,否则 root 用户就是【普通用户】
  • 最后就是指定镜像:格式为:镜像名称:版本号

到这里容器的部署就已经完成了

结束语

本节主要讲解了:

  • golang 项目如何部署到 docker
  • Dockerfile 文件解读
  • docker run 命令解读
相关推荐
sam-1231 小时前
k8s上部署redis高可用集群
redis·docker·k8s
Fanstay9852 小时前
在Linux中使用Nginx和Docker进行项目部署
linux·nginx·docker
death bell3 小时前
Docker基础概念
运维·docker·容器
天幕繁星5 小时前
docker desktop es windows解决vm.max_map_count [65530] is too low 问题
windows·elasticsearch·docker·docker desktop
想学习java初学者6 小时前
Docker Compose部署Kafka(非Zookeeper)
docker·容器·kafka
尝尝你的优乐美6 小时前
Docker部署Vue项目原来可以那么好用
前端·nginx·docker
迷茫运维路7 小时前
docker搭建Jenkins2.346.3版本及常用工具集成配置(ldap、maven、ansible、npm等)
运维·docker·jenkins·cicd
我叫乐多你养我啊7 小时前
Windows远程连接Docker服务
笔记·docker
mit6.82410 小时前
[Docker#5] 镜像仓库 | 命令 | 实验:搭建Nginx | 创建私有仓库
linux·后端·docker·云原生
牛右刀薛面10 小时前
麒麟V10,arm64,离线安装docker和docker-compose
运维·docker·容器·麒麟·鲲鹏