Docker官网
Docker hub
Docker是Docker.Inc公司开源的一个基于轻量级虚拟化技术的容器引擎项目,整个项目基于Go语言开发,并遵从Apache 2.0协议。通过分层镜像标准化和内核虚拟化技术,Docker使得应用开发者和运维工程师可以以统一的方式跨平台发布应用,并且以几乎没有额外开销的情况下提供资源隔离的应用运行环境。
Docker 是一个开源工具,它可以让创建和管理 Linux 容器变得简单。
方便快速部署,可以极大的减少部署的时间成本和人力成本
Docker支持将应用打包进一个可以移植的容器中,核心理念是 Build once, Run anywhere
1)标准化应用发布,Docker容器包含了运行环境和可执行程序,可以跨平台和主机使用;
2)节约时间,快速部署和启动,VM启动一般是分钟级,Docker容器启动是秒级;
3)方便构建基于微服务架构的系统,通过服务编排,更好的松耦合;
4)节约成本,以前一个虚拟机至少需要几个G的磁盘空间,Docker容器可以减少到MB级;
# 表面区别:
1.容器占用体积小,虚拟机占用体积大
2.隔离性:容器提供了基于进程的隔离,而虚拟机提供了资源的完全隔离。
3.启动速度:虚拟机可能需要一分钟来启动,而容器只需要一秒钟或更短。
4.容器使用宿主操作系统的内核,而虚拟机使用独立的内核。Docker 的局限性之一是,它只能用在64位的操作系统上。
# 本质区别:
容器是被隔离的进程
moby、docker-ce与docker-ee
最早时docker是一个开源项目,主要由docker公司维护。
2017年3月1日起,docker公司将原先的docker项目改名为moby,并创建了docker-ce和docker-ee。
三者关系:
moby继承了原先的docker的项目,是社区维护的的开源项目
docker-ce是docker公司维护的开源项目,是一个基于moby项目的免费的容器产品
docker-ee是docker公司维护的闭源产品,是docker公司的商业产品
moby project由社区维护;docker-ce project开源,由docker公司维护;docker-ee是闭源的,由docker公司维护。
Docker系统有两个程序:Docker服务端和Docker客户端。
Docker服务端:是一个服务进程,管理着所有的容器,也叫Docker engine。
Docker客户端:Docker服务端的远程控制器,可以用来控制Docker的服务端进程。
Docker服务端和客户端一般运行在一台机器上。
Docker 镜像 - Docker images
Docker 仓库 - Docker registeries
Docker 容器 - Docker containers
名称空间 namespace 容器隔离(pid,net,mnt,user,ipc,uts)
资源限制 cgroups 资源(内存,cpu)
文件系统 overlay2(UnionFS)
### pid 名字空间
不同用户的进程就是通过 pid 名字空间隔离开的,且不同名字空间中可以有相同 pid。所有的 LXC 进程在 Docker中的父进程为Docker进程,每个 LXC 进程具有不同的名字空间。同时由于允许嵌套,因此可以很方便的实现嵌套的 Docker 容器。
### net 名字空间
有 了 pid 名字空间, 每个名字空间中的 pid 能够相互隔离,但是网络端口还是共享 host 的端口。网络隔离是通过 net 名字空间实现的, 每个 net 名字空间有独立的 网络设备, IP 地址, 路由表, /proc/net 目录。这样每个容器的网络就能隔离开来。
### ipc 名字空间
容器中进程交互还是采用了 Linux 常见的进程间交互方法(interprocess communication - IPC),包括信号量、消息队列和共享内存、socket、管道等。
### mnt名字空间
mnt 名字空间允许不同名字空间的进程看到的文件结构不同,这样每个名字空间 中的进程所看到的文件目录就被隔离开了。
### uts 名字空间
UTS("UNIX Time-sharing System") 名字空间允许每个容器拥有独立的 hostname 和 domain name, 使其在网络上可以被视作一个独立的节点而非主机上的一个进程。
### user 名字空间
每个容器可以有不同的用户和组 id, 也就是说可以在容器内用容器内部的用户执行程序而非主机上的用户。
用来保存镜像,可以理解为代码控制中的代码仓库。Docker 仓库也有公有和私有的概念。
公有的Docker仓库名字是Docker Hub。Docker Hub提供了庞大的镜像集合供使用。这些镜像可以是自己创建,或者在别人的镜像基础上创建。
仓库(registry) -->Repository -->镜像(按版本区分)
Docker官方库:
Docker-hub: https://hub.docker.com/
Docker国内仓库:
阿里: https://cr.console.aliyun.com/
网易蜂巢: https://www.163yun.com/product/repo?h=fc
daocloud: https://hub.daocloud.io/
Docker私有仓库:
个人或者公司部署的非公开库
Docker 镜像是 Docker 容器运行时的只读模板,每一个镜像由一系列的层 (layers) 组成。
Docker 使用 UnionFS 来将这些层联合到单独的镜像中,因此 Docker 变的轻量。当改变了一个 Docker 镜像,比如升级到某个程序到新的版本,一个新的层就会被创建,不用替换整个原先的镜像或者重新建立,只是一个新的层被添加或升级。
一个只读层被称为镜像,一个镜像是永久不会变的。由于 Docker 使用一个统一文件系统,由于镜像不可写,所以镜像是无状态的。
# 镜像由三部分组成:
镜像名称:仓库名称+镜像分类+tag名称(镜像版本)
1.存储对象:images
2.格式:库名/分类:tag
3.tag:表示镜像版本
所有镜像都是通过一个64位十六进制字符串来标识的,一般我们看到的是12位的我们称之为短ID。
镜像本身是由一层一层的镜像合在一起的,最底层的镜像我们称为基础镜像,在这个基础镜像的基础上还可以在做镜像,在做的镜像称为子镜像,对于子镜像来讲在谁的基础之上做的就是父镜像。
基础镜像也可以理解为:一个没有任何父镜像的镜像,谓之基础镜像。
每一个 Docker 容器都是从 Docker 镜像创建的。
Docker 容器可以运行、开始、停止、移动和删除。
每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行部分。