美文网首页
一种运行环境和代码分离的容器镜像打包方式

一种运行环境和代码分离的容器镜像打包方式

作者: akka9 | 来源:发表于2019-11-27 16:29 被阅读0次

常见的企业环境中,容器化部署一般需要支持 golang、nodejs、python、java、php 等常见的开发语言。
本文探讨了一种将运行环境(Runtime)和代码(或编译后的二进制文件)分离的容器镜像打包的方式。

代码容器镜像结构为:

  1. 第一层基础镜像: busybox 或 alpine
  2. 第二层项目的第三方依赖库: pip 库 (python项目), npm库(nodejs项目) 第三方依赖jar包(java springboot项目) php项目的vendor
  3. 第三层:项目源代码或编译后的二进制
  4. 第四层: 项目的启动脚本,默认配置文件,其他杂项

代码容器镜像有如下功能:

  1. 把代码发布为 docker image
  2. 根据代码结构进行了分层,有利的减小了增量包的大小
  3. 代码容器本身不需要能运行代码,也不提供代码的运行环境

如何运行和发布项目?
将运行环境容器镜像和代码容器镜像共同组合起来,可利用 docker-compose 的容器挂载 和 kubernets init-container 技术进行发布。

方案的优点:

  1. 代码容器镜像只有源代码(php,python)或者编译后的二进制(golang,nodejs,java)
  2. 代码容器镜像不需要把代码运行起来,整个镜像的大小比常规的方式大大减小
  3. 运行环境容器镜像打安全补丁或进行升级时,不需要对已有的任何代码容器进行任何更改

show me the code

namespace: golang
depolyment: advert-stat

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: advert-stat
  labels:
    app: advert-stat
    environment: prod
  namespace: golang
  annotations:
    app.kubernetes.io/name: advert-stat
spec:
  minReadySeconds: 0
  progressDeadlineSeconds: 300
  replicas: 3
  revisionHistoryLimit: 20
  selector:
    matchExpressions:
    - {key: release, operator: In, values: [stable,canary]}
    - {key: app, operator: In, values: [advert-stat]}
  template:
    metadata:
      name: advert-stat
      labels:
        app: advert-stat
        release: stable
      annotations:
        cmhash: 83464a5373bc73779c39fd8b6a60c14c948e8a47
      deletionGracePeriodSeconds: 6
    spec:
      imagePullSecrets:
      - name: secret-private-registry

      initContainers:
      - name: init-pkg
        image: repo.domain.com/golang/advert-stat:v1.0.07-20191025T163618
        imagePullPolicy: Always
        command: ['sh', '-c', "cp -rf /opt/* /app/ "]
        volumeMounts:
        - mountPath: /app
          name: app-dir
      - name: init-conf
        image: repo.domain.com/config/golang-config
        imagePullPolicy: Always
        command: ['sh', '-c', "cp -rf /opt/advert-stat/* /app/ "]
        volumeMounts:
        - mountPath: /app
          name: app-dir

      containers:
      - name: advert-stat
        image: repo.domain.com/image/base:19.11
        imagePullPolicy: Always
        env:
        - name: SYS_ID
          value: advert-stat
        - name: EXTRA_OPTS
          value: ""
        - name: RUN_AS
          value: "nobody:nobody"
        resources:
          requests:
            memory: '512Mi'
          limits:
            cpu: '500m'
            memory: '512Mi'
        livenessProbe:
          tcpSocket:
            port: 8080
          failureThreshold: 3
          successThreshold: 1
          initialDelaySeconds: 20
          periodSeconds: 5
          timeoutSeconds: 5
        readinessProbe:
          httpGet:
            path: /healthz
            port: 8080
            httpHeaders:
            - name: Connection
              value: keep-alive
          failureThreshold: 3
          successThreshold: 1
          initialDelaySeconds: 5
          periodSeconds: 5
          timeoutSeconds: 5
        volumeMounts:
        - mountPath: /app
          name: app-dir
      volumes:
      - name: app-dir
        emptyDir: {}

      dnsConfig:
        options:
        - name: timeout
          value: "5"
        - name: attempts
          value: "3"
        - name: rotate
      dnsPolicy: ClusterFirstWithHostNet
      restartPolicy: Always

---

apiVersion: v1
kind: Service
metadata:
  name: advert-stat
  namespace: golang
spec:
  selector:
     app: advert-stat
     release: stable
  ports:
  - name: svc-port
    protocol: TCP
    port: 80
    targetPort: 8080
  sessionAffinity: ClientIP
  sessionAffinityConfig:
    clientIP:
     timeoutSeconds: 600
  type: ClusterIP

---

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: advert-stat-ingress
  annotations:
     kubernetes.io/ingress.class: "nginx"
  namespace: golang
spec:
  rules:
  - host: advert-stat.domain.com
    http:
        paths:
        - path: /
          backend:
            serviceName: advert-stat
            servicePort: 80


相关文章

  • 一种运行环境和代码分离的容器镜像打包方式

    常见的企业环境中,容器化部署一般需要支持 golang、nodejs、python、java、php 等常见的开发...

  • 【docker专栏3】docker基础概念-容器、镜像以及引擎组

    一、docker镜像与容器 docker镜像是一个可执行的静态独立软件包,包含打包程序代码和软件运行环境等文件。如...

  • Docker创建镜像和推送到hub.docker.com

    构建本地的容器镜像,目的是: 对容器的修改和复用 自定义镜像 打包,分发服务以及运行环境根据上节内容 Docker...

  • Docker | 容器数据卷详解

    什么是容器数据卷 从docker的理念说起,docker将应用和环境打包成一个镜像,运行镜像(生成容器)就可以访问...

  • Docker 基本命令( Version:18.09.2,Win

    基本信息 容器和镜像 镜像中包括运行应用程序所需的所有内容的代码,运行时,库,环境变量,和配置文件通过运行镜像得到...

  • Docker-镜像

    应用程序或者环境依赖以Docker的形式打包以后就是Docker镜像,镜像可以作为模板运行创建、启动容器,从而运行...

  • 容器添加端口

    方式一:将现有的容器打包成镜像,然后在使用新的镜像运行容器时重新指定要映射的端口 大概过程如下: 先停止现有容器 ...

  • docker

    搜索镜像 拉取镜像 启动镜像 查看所有容器 启动已存在容器 停止容器 进入容器 查询容器运行详细信息 容器打包 查...

  • 【现学现忘Docker基础】— 18.Docker镜像的加载原理

    1、镜像是什么 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个...

  • 6. Docker镜像

    Docker镜像 是什么 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包...

网友评论

      本文标题:一种运行环境和代码分离的容器镜像打包方式

      本文链接:https://www.haomeiwen.com/subject/cvwpwctx.html