Docker入门
容器
容器是一种操作系统虚拟化形式。可以使用一个容器来运行从小型微服务或软件进程到大型应用程序的所有内容。容器包含所有必要的可执行文件、二进制代码、库和配置文件。但是,与服务器或计算机虚拟化方法不同,容器不包含操作系统映像。因此,它们更轻便且可移植,其开销很小。在大型应用程序部署中,可以将多个容器部署为一个或多个容器集群。此类集群可由 Kubernetes 等容器编排程序管理。 --NetApp
容器技术使用Linux内核和内核功能(例如 Cgroups 和 namespaces)来分隔进程,以便各进程相互独立运行。这种独立性正是采用容器的目的所在;它可以独立运行多种进程、多个应用,更加充分地发挥基础设施的作用,同时保持各个独立系统的安全性。
详细介绍:https://en.wikipedia.org/wiki/OS-level_virtualization
容器与虚拟机
人们考虑虚拟化时,通常会想到虚拟机(VM)。事实上,虚拟化可以采用多种形式,容器就是其中之一。那么,VM和容器之间的区别是什么?
大体说来,VM虚拟化基础硬件,让多个操作系统(OS)实例可以在相同的硬件上运行。每个VM运行一个OS,并有权访问表示基础硬件的虚拟化资源。VM有许多好处。其中包括,能够在同一服务器上运行不同操作系统,还可以更高效、更经济地利用物理资源,更快完成服务器配置。另一方面,每个VM都包含OS映像、库、应用程序等,因此可能会变得相当大。
容器虚拟化基础OS,并使容器化应用能够感知其本身具备OS,包括CPU、内存、文件存储和网络连接。由于对基础OS和基础结构的差异进行了抽象,因此只要基本映像一致,就可以在任何地方部署并运行容器。对于开发人员来说,这有很大的吸引力。
由于容器共享主机OS,因此它们不需要启动OS或加载库。这使得容器更加高效和轻量。容器化应用程序可以在几秒钟内启动,与VM方案相比,应用程序的更多实例可以适应计算机。共享OS方法具有额外的好处,即减少维护(如修补和更新)开销。
尽管容器是可移植的,但它们被限制于为其定义的操作系统。例如,适用于Linux的容器无法在Windows上运行,反之亦然。 --Microsoft 
Docker
Docker在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得Docker技术比虚拟机技术更为轻便、快捷。
Docker使用Google公司推出的Go语言进行开发实现,基于Linux内核的cgroup,namespace,以及OverlayFS类的UnionFS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于LXC,从0.7版本以后开始去除LXC,转而使用自行开发的libcontainer,从1.11版本开始,则进一步演进为使用runC和containerd。
runc 是一个 Linux 命令行工具,用于根据 OCI容器运行时规范 创建和运行容器。 containerd 是一个守护程序,它管理容器生命周期,提供了在一个节点上执行容器和管理镜像的最小功能集。

制作一个容器
请参照文档自行安装docker, https://docs.docker.com/engine/install/ubuntu/
创建工作目录
用golang编写一个
server.go
编写
Dockerfile
构建镜像
[ID]是个人Docker hub的id,如果id不对会提示:
denied: requested access to the resource is denied
测试容器
curl返回Hello Docker!,构建容器成功。
思考:
docker的功能非常强大,通过docker help可以看到docker支持的全部命令。
步骤
4.中,-t参数的作用是什么?步骤
5.中,-t参数的作用是什么?其他参数的作用是什么?
进阶-压缩镜像
在上个小结中,我们制作了镜像[ID]/hello-world-golang
一个10行左右golang代码,编译后竟然有970MB,是否可以减少镜像的大小?
在
golang-server目录下预先编译server.go
思考:
这里为什么需要增加
GOOS=linux?尝试删除编译参数
CGO_ENABLED=0,测试容器是否可以正常运行?
修改
Dockerfile
构建镜像并测试
思考:在上一节中已经制作了名为[ID]/hello-world-golang的镜像,这里再次构建会出现什么问题?如何避免?
查询镜像大小
这里我们构建的镜像已经只有11.6MB,大小约为之前的1%.
思考:镜像大小减小为1%的原因是什么?(注意对比两次的Dockerfile)
登录docker hub,上传镜像
提示:上传到Dockerhub是为了方便将服务部署到Kubernetes中。
Last updated