Kubernetes 实践 第一篇: 程序容器化

865 阅读2分钟

此系列文章为团队内部的实践总结和培训资料, 去除敏感信息保留公共部分与大家共享. 首先需要大家对Docker和Kubernetes有一定的基础了解, 文章不再对容器集群是什么的问题进行论述. 着重于怎么做为什么. 目标是让有容器相关基础概念的读者参考此系列文章, 能够将手上的程序在Kubernetes中以符合云原生的方式运行起来.

目录:

  1. Kubernetes 实践 第一篇: 程序容器化
  2. Kubernetes 实践 第二篇: 部署应用到集群上
  3. Kubernetes 实践 第三篇: 基于Gitlab的CI/CD
  4. Kubernetes 实践 第四篇: 存储
  5. Kubernetes 实践 第五篇: 配置管理
  6. Kubernetes 实践 第六篇: 日志管理
  7. Kubernetes 实践 第七篇: 微服务链路追踪
  8. Kubernetes 实践 第八篇: Golang 程序完整实现和 Demo
  9. Kubernetes 实践 第九篇: PHP 程序的完整实现和 Demo

Golang 程序容器化

得益于 Golang 编译成单进程的二进制程序的特性, Golang 程序封装为 Docker 镜像非常简单. 只需如下加单的 Dockerfile 即可完成. 有两点需要说明的:

  • 这里使用了 docker 的 multi-stage 特性, 分开了编译和运行环境, 运行环境中只包含最终的二进制文件, 不需要包含Golang的环境.
  • 使用 ARG 传入了 golang 程序基于GOAPTH的路径和程序的二进制文件名.
FROM golang:1.12
ARG APP_ROOT
ARG APP_NAME
WORKDIR ${APP_ROOT}
COPY ./ ${APP_ROOT}
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o ${APP_NAME} .

FROMalpine:v3.8
ARG APP_ROOT
ARG APP_NAME
WORKDIR /app/
RUN mkdir -p ./conf/dev && touch ./conf/dev/app.conf
COPY --from=0 ${APP_ROOT}/conf/app.conf ./conf/app.conf
COPY --from=0 ${APP_ROOT}/${APP_NAME} .
ENV APP_NAME ${APP_NAME}
ENTRYPOINT /app/${APP_NAME}

执行编译命令, 生成镜像.

docker build --build-arg APP_ROOT=$APP_ROOT --build-arg APP_NAME=$APP_NAME -t $IMAGE_NAME -f docker/Dockerfile .

PHP 程序容器化

PHP 的容器化比较特殊, 生产环境中PHP并不是一个单进程的程序, 他需要 fpm 和 nginx 共同运行, 把他们打包在一个镜像中做成一个胖容器不是一个好主意. 后面的部署阶段我们使用 Kubernetes 提供的 Pod 编排特性把他们放在一起运行, 而 PHP 镜像本身只需包含 PHP代码和 fpm 即可.

具体如何将多个容器编排在一起运行请参考 :matthewpalmer.net/kubernetes-…

后续部署的章节也会有专门内容讲解.

PHP程序的Dockerfile:

FROM php:7.2-fpm
RUN mkdir /app
COPY hello.php /app