「容器管理系统」开发篇: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 命令解读
相关推荐
冲上云霄的Jayden33 分钟前
修改 Docker 容器中 MySQL 8.0 默认编码为 utf8mb4_unicode_ci
utf-8·mysql·ci/cd·docker·utf8mb4
zwjapple1 小时前
react+springboot的Docker部署
docker·部署·springboot·react
遇见火星2 小时前
Docker入门:快速部署你的第一个Web应用
前端·docker·容器
浪飘4 小时前
k8s device plugin
java·docker·kubernetes
冬夜戏雪4 小时前
milvus容器restart不成功,但docker仍在running问题排查
docker·容器·milvus
m0_579146654 小时前
docker desktop的容器间通信
docker·容器·php
key_Go5 小时前
12.docker swarm
运维·docker·容器·docker swarm
码农阿豪6 小时前
一个浏览器多人用?Docker+Neko+cpolar实现跨网共享
运维·docker·容器
m0_579146659 小时前
docker desktop创建ollama容器端口绑定失败
运维·docker·容器
愚昧之山绝望之谷开悟之坡9 小时前
docker和docker compose离线安装-2-报错
运维·docker·容器