天天看点

容器基础与持续交付

容器基础与持续交付

本文主要关注容器作为服务的基础知识。容器服务涉及知识面广,要点是从实践的角度,理解容器(进程)的基本概念与原理,学会创建容器、运行与使用容器、管理容器。初步掌握 golang 程序镜像制作,初步掌握集成测试、自动构建、自动部署的开发流程。

    • 容器基础与持续交付
      • 一云服务基础设施
        • 1 基础设施作为服务Infrastructure as a Service IaaS
        • 2 容器作为服务CaaS
        • 3 容器技术标准与发展
      • 二docker 入门
        • 1 核心概念
        • 2 简单教程
      • 三 golang 镜像构建
      • 四持续交付

一、云服务基础设施

1.1 基础设施作为服务(Infrastructure as a Service / IaaS)

云设施服务提供商将计算、存储、网络等物理资源的资源的虚拟化,让客户 按需 租用虚拟的硬件设备,获得一体化的IT设施服务决解方案。例如:Amazon EC2(Elastic Compute Cloud),S3(Simple Storage Service) 等。

容器基础与持续交付

案例:我们每月花 8 元 在某供应商租了一台云主机(虚拟机),1 CPU 2G 内存 20G 存储。供应商免费提供 4 个镜像存储 … 各种一键安装服务。

核心技术:虚拟化,虚拟计算机、虚拟网络、虚拟存储 …

  • 资源的管理与调度:
    • 企业产品: Open Stack、Xen、 Hyperv、 Vmware …
    • 桌面产品: virtualbox …

更多了解 IaaS, 建议您从安装 virtualbox 开始

1.2 容器作为服务(CaaS)

CaaS(Cantainer as a Service) 属于 PaaS(Platform as a Service) 范畴,如 Docker, K8S(Kubernetes) ,ECS(Amazon EC2 Container Service),beanstalk 等等。它提供了一个容器运行客户的应用,用户可动态配置应用的计算与内存资源,自动扩展容器的数量,实现应用 roll 更新等等。

容器基础与持续交付

核心技术:进程隔离 (LXC 、 Control Groups 和 namespace 是多用户操作系统基本特征)

  • 容器技术 与 LXC
    • Unix 系统为了实现多用户的隔离,建立了丰富的 OS 级别虚拟化机制
    • LXC 是 Linux® Containers 简称,是 OS 虚拟化的集成与发展
  • Docker 引擎隔离技术
    • namespace
      • pid namespace: 进程隔离 (PID: Process ID).
      • net namespace: 管理网络接口(NET: Networking).
      • ipc namespace: 管理IPC资源访问(IPC: InterProcess Communication).
      • mnt namespace: 管理文件系统挂载点 (MNT: Mount).
      • uts namespace: 隔离内核与版本识别 (UTS: Unix Timesharing System).
    • Control Groups: 限定容器内存等资源
    • Union FS 联合文件系统
    • Container format 容器文件格式

如果你有大机的经验,分时操作系统为每个用户做的一切,现在给了一个进程罢了。显然,容器只是一个运行在 Linux 内核 上的 进程,与虚拟机(VM)相比,启动虚拟机的时间与资源开销与打开一个 word 是无法比拟的。

与容器云相关的系统,一般都是用 go 开发!

跟多了解 CaaS, 建议您从安装 docker 开始

如果你对 docker 的技术特别感兴趣,阿里云这组关于 容器内核 的文章,可以帮助你理解上述技术。相信可以极大提升你 c 语言和操作系统的功力。 特别推荐 《自己动手写Docker》

1.3 容器技术标准与发展

  • LXC (https://linuxcontainers.org/)
    • LXC
    • LXD (Unbutu 17.04 支持)
  • runC (https://runc.io/)
    • 容器格式标准
    • 中文介绍:http://www.infoq.com/cn/articles/docker-standard-container-execution-engine-runc
  • 开源容器(容器与引擎分离)
    • ContainerD
      • 中文介绍:https://yq.aliyun.com/articles/66626
    • Rocket

二、docker 入门

2.1 核心概念

Docker引擎 (Docker Engine)

Docker Engine is a client-server application with these major components(一个客户-服务应用,含三个部件)

1)驻守(daemon)进程 docker

2)REST API 接口提供外部系统与 docker 进程交互

3)Cli 命令行接口的应用 docker 命令

容器基础与持续交付

图:Docker引擎基础架构

镜像(image)

An image is a read-only template with instructions for creating a Docker container.

镜像是创建 docker 容器指令的只读模板。它包含只读的文件系统、网络、内存、CPU 、卷等资源的定义,应用程序在这个环境(Context)上运行。通常,一个镜像申明了自己默认的主进程的应用。

镜像文件系统是层叠结构。一个镜像通常建立在其他镜像基础上,如在 ubuntu 上添加自己的 apache 文件,然后在 apache 上建立 web 应用文件。

例如:

docker pull mysql

时,会观察到下载许多文件。但

docker pull MySQL:5.7

时基础镜像都已下载,所以很快就下载完成了。

docker 仓库/registry

Docker Hub 就是存放镜像的地方。 你需要在上面注册账号,以保存自己的镜像。 阿里云等服务商也提供镜像存储和下载加速服务!

每个镜像存储空间是 repository。 每个 repo 都支持版本管理, 版本成为 tag, 最新版本成为 latest!

例如:

mysql

表示

mysql:latest

容器(Container)

A container is a runnable instance of an image.

镜像中的程序(主进程)运行在只读文件镜像上,对现有文件变更将写在一个临时的卷上(新的一层),该主进程、相关进程、文件系统成为一个运行的实例。

  • 每个容器创建后,有运行、暂停、中止状态,直到移除。
  • 程序运行的产生的数据,都在容器中的文件中,Restart 不会丢失数据。

当主进程结束时,该实例同时结束运行。使用 –rm 表示运行后自动删除容器中可读写层内容。

容器运行时文件系统:

容器基础与持续交付

docker 工作流水结构:

容器基础与持续交付

服务(Services)

Services allow you to scale containers across multiple Docker daemons, which all work together as a swarm with multiple nodes.

一般地,集群内部服务容器地选择由 动态DNS 实现。

栈(stack)

A stack is a group of interrelated services that share dependencies, and can be orchestrated and scaled together.

能被编排和伸缩的一组相互依赖的服务

栈(stack)用 docker-compose.yml 文件描述服务之间的依赖、数据共享、网络等。使用 docker stack 管理

2.2 简单教程

请参照 构建微服务实验环境(一):容器与应用 ,它基本是官方指南的中文说明。

要点:

Dockerfile 与 容器

你必须掌握的 Dockerfile 指令:

FROM 基础镜像
WORKDIR 工作目录
ADD 本地源 容器内目的
RUN 容器系统中命令
EXPOSE 暴露本地端口
ENV 环境变量名 值
VOLUME 卷路径 (可读写的位置)
CMD [ ...args ]
           

Dockerfile 最佳实践 Best practices for writing Dockerfiles

Dockerfile 编写学习: https://github.com/dockerfile

dockerfile 官方案例。 例如 mysql

Dockerfile 命令 速查

docker 图形 UI 与 Docker Remote API

docker 图形化管理工具: portainer

docker 前端开发工具: 一般使用 nodejs 与 go,或者 go。 portainer 就是 docker 平台编程的优秀案例。

了解 docker SDK, SDK and API quickstart

unix socket 知识:Linux下的IPC-UNIX Domain Socket

docker-compose.yml 与服务组合

配置并启动一个服务

三、 golang 镜像构建

构建最小的Go程序镜像

这个文档是非常不错的,网上有这样的文档应该满意了!

注意:

请使用 golang 1.8 或 1.85 版本做实验。 具体镜像 tag 与 dockerfile 见官网: /golang/”>https://hub.docker.com//golang/

要点:

  • 1.8-onbuild 镜像及其 dockerfile
  • 1.8 镜像及其用途
  • 静态编译,与空镜像上建立最小镜像

四、持续交付

CI/CD 自动化是容器技术富有魅力的方面之一。在容器技术支持下,软件开发流水线包含三个基本步骤:

  1. 测试自动化。 当开发团队成员将代码提交到 git 仓库,将触发 travis 或 Jenkins 等工具自动按配置脚本执行测试,并返回报告
  2. 构建自动化。 当测试通过后,使用 dockerfile 构建容器,并保存到 github 容器中。 你仅需要一个 docker hub 账号就可以在线构建镜像
  3. 部署自动化。 使用 docker-compose.yml,容器云平台会自动检测版本更新,部署或升级应用
    • 测试自动化: golang CI 入门
    • 构建自动化: Docker实践(七):Docker Hub(镜像分发、自动化构建)
    • 部署自动化: 待续…