「容器管理系统」开发篇: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 命令解读
相关推荐
cui_hao_nan7 小时前
Docker后端部署
运维·docker·容器
大苏打seven8 小时前
Docker学习笔记:Docker网络
笔记·学习·docker
小张是铁粉9 小时前
docker在Linux的安装遇到的问题
linux·docker·容器
没有名字的小羊11 小时前
8.Docker镜像讲解
运维·docker·容器·tomcat
企鹅侠客13 小时前
实践篇:14-构建 Node.js 应用程序镜像
docker·node.js·dockerfile
zhuyasen13 小时前
定义即代码!这个框架解决了90%的Go开发者还在低效开发项目的问题
架构·go·gin
做一个AC梦14 小时前
Docker安装失败:Docker Desktop installation failed
运维·docker·容器
Shan120514 小时前
浅谈Docker Kicks in的应用
运维·docker·容器
Li&&Tao14 小时前
docker 常用命令
docker·容器·eureka
程序员爱钓鱼15 小时前
Go语言项目工程化 — 常见开发工具与 CI/CD 支持
开发语言·后端·golang·gin