» Go:使用Kafka构建事件驱动微服务 » 5. 部署 » 5.1 Dockerfile

Dockerfile

Docker 允许开发人员将他们的应用程序以及所有依赖项打包成一个称为容器的单个单元。这确保了在不同环境(如开发、测试和生产)之间的一致性,减少了“但是它在我的机器上运行正常”的问题。

安装 Docker: https://docs.docker.com/engine/install/

添加 Makefile

Makefile 是在软件开发项目中使用的一种特殊文件(特别是在类 Unix 操作系统中),用于自动化从源代码编译和构建可执行程序或库。

创建 Makefile:

TARGET_BIN=./bin/
# Binary names
BINARY_WEB=lrbooks_web
BINARY_TREND=lrbooks_trend
BINARY_REC=lrbooks_rec

build-web:
	@echo "Building $(BINARY_WEB) for Linux..."
	GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o ${TARGET_BIN}$(BINARY_WEB) service/web/main.go

build-trend:
	@echo "Building $(BINARY_TREND) for Linux..."
	GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o ${TARGET_BIN}$(BINARY_TREND) service/trend/main.go

build-rec:
	@echo "Building $(BINARY_REC) for Linux..."
	GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o ${TARGET_BIN}$(BINARY_REC) service/recommendation/main.go

build: build-web build-trend build-rec

因为服务会部署到 Docker 中的 Linux 环境,故此处都是针对 Linux 操作系统进行构建。

执行 make build,构建所有的二进制文件:

make build

web 服务的 Dockerfile

添加 service/web/Dockerfile:

# alpine linux
FROM alpine:3.19

ENV APP_BIN=lrbooks_web
ARG SERVER_DIR=/home/.server
WORKDIR $SERVER_DIR
COPY ./bin/${APP_BIN} .
COPY ./service/web/adapter/templates/ ./templates

ENV GIN_MODE=release

CMD ./${APP_BIN}

Alpine Linux 是一个轻量级的安全的 Linux 发行版,特别适用于容器化环境、嵌入式系统和资源受限环境。这些环境下效率和安全性至关重要。

为 web 服务构建 docker 镜像:

docker build -t lrbooks_web:latest -f service/web/Dockerfile .

相似地,添加另外 2 个 Dockerfiles:

热搜服务的 Dockerfile

添加 service/trend/Dockerfile:

# alpine linux
FROM alpine:3.19

ENV APP_BIN=lrbooks_trend
ARG SERVER_DIR=/home/.server
WORKDIR $SERVER_DIR
COPY ./bin/${APP_BIN} .

ENV GIN_MODE=release

CMD ./${APP_BIN}

推荐服务的 Dockerfile

添加 service/recommendation/Dockerfile:

# alpine linux
FROM alpine:3.19

ENV APP_BIN=lrbooks_rec
ARG SERVER_DIR=/home/.server
WORKDIR $SERVER_DIR
COPY ./bin/${APP_BIN} .

ENV GIN_MODE=release

CMD ./${APP_BIN}

准备好所有 Dockerfile 之后,就可以在 Docker Compose 里启动所有服务了。