《Docker技术入门与实战》第一部分的读书笔记,思维导图+文字笔记补充。啃书整理。
Docker是2013年由dotCloud公司基于go语言实现的云开源项目,目前已有多个相关项目,并已形成了自己的生态体系,dotCloud公司也改名为Docker Inc,专注于Docker相关技术和产品的开发。
对于Docker的任务目标,杨保华先生在《Docker技术入门与实战》中是这样写的:
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,即通过对应用组件的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)等生命周期的管理,达到应用组件级别的“一次封装、到处运行”。
这上面所属的应用组件,既包括web应用,也包括数据库服务,甚至包括一个操作系统或编译器。Docker提供了高效、敏捷和轻量级的容器方案,支持在多种主流云平(PaaS)和本地系统上部署,为应用的开发和部署提供了一站式的解决方案
Docker引擎的基础是Linux容器,简称为LXC,IBM对容器技术的描述如下:
容器有效地将由单个操作系统管理的资源划分到孤立的组中,以便更好地在鼓励的组织间平衡有冲突的资源使用需求。与虚拟化相比,这样既不需要指令级模拟,也不需要即时编译。容器可以在核心CPU本地运行指令,而不需要任何专门的解释机制。此外,也避免了准虚拟化和系统调用替换中的复杂性
Linux容器技术不是新鲜事物,最早可以追溯到1982年,在Docker出现前,已经有许多公开发布的容器技术日臻成熟完善,但始终没有被集成到主流的Linux内核中,使用不方便。在此背景下,LXC项目借鉴前人成熟的容器设计理念,立足于一系列新的内核特性,实现了更具扩展性的虚拟化容器方案,并最终被集成到Linux内核中,成为Linux系统轻量级容器技术的事实标准。
简单理解,Docker容器相当于一个沙盒,每个容器内运行一个应用,不同的容器相互隔离,容器之间也可以简历通信机制。容器的创建和停止十分迅速,容器自身对资源的需求也十分有限,远低于虚拟机。通常可以直接把容器当做应用本身
原有的程序部署需要开发人员在服务器上下载安装各种应用配置,比如基于LAMP(Linux+Apache+MySQL+PHP)组合来运维一个网站,自然是先要安装后三者以及它们各自运行所依赖的环境,之后进行配置,配置完成后还需要进行功能测试,一旦服务器需要迁移则又要重头来过,非常麻烦。
如果使用Docker,则等于应用通过容器来打包,迁移时只需要在新的服务器上启动需要的容器即可。
具体优势概括如下:
Docker除了运行容器中的应用外,基本不消耗额外的系统资源,保证应用性能的同时减小系统开销。传统虚拟机方式运行N个不同应用需要启动N个虚拟机,每个虚拟机又要单独分配独占的内存、磁盘等济源,从性能上Docker就比虚拟机高效许多。
隔离性上,传统虚拟机多了一层额外的隔离,而Docker利用Linux系统上的多种防护机制实现了严格可靠的隔离,1.3版本开始Docker便引入了安全选项和镜像签名机制,极大地提高了Docker的安全性。
下表是杨保华先生《DOcker技术入门与实战》中Docker容器技术与传统虚拟机技术的特性比较表:
特性 | 容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
硬盘使用 | 一般为MB | 一般为GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
隔离性 | 安全隔离 | 完全隔离 |
此段基本搬运杨保华先生《Docker技术入门与实战》中的文字,缩减了一些表述。
虚拟化技术是一个通用的概念,在不同的领域有不同的理解,在计算领域,一般指的是计算虚拟化,即服务器虚拟化。维基百科定义如下:
在计算机技术中,虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破是体结构件的不可切割现象,使用户可以用比原本的组态更好的方式来应用这些资源
虚拟化的核心是对资源进行抽象。个人理解是好比一个没有隔层的束口袋,用户可以自己用其他收纳袋收纳不同种类的东西后再放进束口袋中,将原本不可切割的资源分配成块来使用。虚拟化的好处是提高系统资源的利用率、降低成本和容错容灾。
虚拟化也划分为基于硬件的虚拟化和基于软件的虚拟化,前者不多见,后者则可以从其对象所在的层次,更进一步细分为应用虚拟化和平台虚拟化,平台虚拟化即是通常说的虚拟机技术。导图整理如下
我自己是先看了腾讯课堂中一个Linux运维课程里《部署docker容器虚拟化平台》后,
参考这篇Linux系统下载安装Docker的文章进行下载安装的:docker简介和linux下安装
安装docker后可以通过官方提供的registry镜像搭建一套本地私有仓库:
docker run -d -p 5000:5000 registry
这会自动下载并启动一个registry容器,创建本地的私有仓库服务。可以通过-v参数来将镜像文件存放在本地的指定路径上。下面是一个将上传的镜像放到/opt/data/registry目录下:
docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
此时,在本地会启动一个私有仓库服务,监听端口为5000。
管理私有仓库镜像时,可以先把一个镜像标记其名为“内网ip:端口号/test”,如下:
docker tag registry:1.1 172.16.57.97:5000/test
然后push上传这个镜像。
如果出现以下错误,说明要修改daemon.json文件,在/etc/docker/目录下,
[root@izwz9asdnts5qezib2olscz ~]# docker push 172.16.57.97:5000/test
The push refers to repository [172.16.57.97:5000/test]
Get https://172.16.57.97:5000/v2/: http: server gave HTTP response to HTTPS client\
我这边没有,查了下说是要自己创建,复制博文里的参数,使用vi创建一个文件Docker配置文件 - daemon.json
关于私库创建管理的参考文章:Docker私库搭建和使用
此时,容器db1和db2都挂载同一个数据卷到相同的/dbdata目录。三个容器任何一方在该目录下的写入,其他容器都可以看到,例如,在dbdata容器中创建一个test文件
cd /dbdata
touch test
ls
在db1容器中查看它
docker run it --volumes-from dbdata --name db1 ubuntu
ls
ls dbdata/
可以多次使用–volumes-from参数来从多个容器挂载多个数据卷。还可以从其他已经挂载了容器卷的容器来挂载数据卷
docker run -d -name db3 --volumes-from db1 training/postgres
注意: 使用–volumes-from db1 training/postgres参数所挂载的数据卷的容器自身并不需要保持在运行状态
如果删除了挂载的容器,数据卷并不会被自动删除,如果要删除一个数据卷,必须在删除最后一个还挂载这它的容器时显式使用docker rm -v命令来指定同时删除关联的容器。
Docker在两个互联的容器之间创建了一个安全隧道,不用映射端口到宿主主机上。启动db容器时没有使用-p和-P标记,从而避免了暴露数据库端口到外部网络上。
Docker使用两种方法为容器公开连接信息:环境变量;更新/etc/hosts文件
env命令可以查看web容器的环境变量
docker run --rm --name web2 --link db:db training/webapp env