本文主要关注容器作为服务的基础知识。容器服务涉及知识面广,要点是从实践的角度,理解容器(进程)的基本概念与原理,学会创建容器、运行与使用容器、管理容器。初步掌握 golang 程序镜像制作,初步掌握集成测试、自动构建、自动部署的开发流程。
云设施服务提供商将计算、存储、网络等物理资源的资源的虚拟化,让客户 按需 租用虚拟的硬件设备,获得一体化的IT设施服务决解方案。例如:Amazon EC2(Elastic Compute Cloud),S3(Simple Storage Service) 等。
案例:我们每月花 8 元 在某供应商租了一台云主机(虚拟机),1 CPU 2G 内存 20G 存储。供应商免费提供 4 个镜像存储 … 各种一键安装服务。
核心技术:虚拟化,虚拟计算机、虚拟网络、虚拟存储 …
更多了解 IaaS, 建议您从安装 virtualbox 开始
CaaS(Cantainer as a Service) 属于 PaaS(Platform as a Service) 范畴,如 Docker, K8S(Kubernetes) ,ECS(Amazon EC2 Container Service),beanstalk 等等。它提供了一个容器运行客户的应用,用户可动态配置应用的计算与内存资源,自动扩展容器的数量,实现应用 roll 更新等等。
核心技术:进程隔离 (LXC 、 Control Groups 和 namespace 是多用户操作系统基本特征)
如果你有大机的经验,分时操作系统为每个用户做的一切,现在给了一个进程罢了。显然,容器只是一个运行在 Linux 内核 上的 进程,与虚拟机(VM)相比,启动虚拟机的时间与资源开销与打开一个 word 是无法比拟的。
与容器云相关的系统,一般都是用 go 开发!
跟多了解 CaaS, 建议您从安装 docker 开始
如果你对 docker 的技术特别感兴趣,阿里云这组关于 容器内核 的文章,可以帮助你理解上述技术。相信可以极大提升你 c 语言和操作系统的功力。 特别推荐 《自己动手写Docker》
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.
镜像中的程序(主进程)运行在只读文件镜像上,对现有文件变更将写在一个临时的卷上(新的一层),该主进程、相关进程、文件系统成为一个运行的实例。
当主进程结束时,该实例同时结束运行。使用 –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 管理
请参照 构建微服务实验环境(一):容器与应用 ,它基本是官方指南的中文说明。
要点:
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 与服务组合
配置并启动一个服务
…
构建最小的Go程序镜像
这个文档是非常不错的,网上有这样的文档应该满意了!
注意:
请使用 golang 1.8 或 1.85 版本做实验。 具体镜像 tag 与 dockerfile 见官网: /golang/”>https://hub.docker.com//golang/
要点:
CI/CD 自动化是容器技术富有魅力的方面之一。在容器技术支持下,软件开发流水线包含三个基本步骤:
部署自动化。 使用 docker-compose.yml,容器云平台会自动检测版本更新,部署或升级应用