【One by one系列】一步步学习docker(一)——初窥docker原理
Build,Ship and Anywhere
容器提供一种轻量级方法,用于将应用程序与主机系统的其他组件分隔,以便仅共享内核,并使用提供给应用程序的资源。那么在众多容器技术听到最多的,脱颖而出的,无疑是docker!
1.基本概念
Docker Client
:Docker提供给用户的客户端,功能就是提供给用户一个终端,用户输入docker提供的命令来管理本地或者远程的服务器。Docker Server
:Docker Daemon是主要组成部分,Docker服务的守护进程,功能-接受Docker Client发过来的指令请求,并按照相应的路由规则实现路由分发。Docker Images
:Docker镜像,类比电脑装系统的CD盘,只读的CDDocker Registry
:Docker Images的仓库,类比git,有私人的,有公共的,如github,docker提供了官方的Registry,Dock HubDocker Container
:Docker 容器,在容器里,跑项目程序、消耗机器资源、提供服务的地方;容器(Docker Container)通过镜像(Docker Images)启动,在镜像的基础上运行程序。可以理解为容器提供了硬件环境,然后使用了镜像这些制作好的系统盘,再加上项目程序,跑起来就可以提供服务。
总结起来:搭载Docker的主机,通过Docker Client
使用docker build
docker pull
docker run
让Docker Daemon
从Docker Registry
拉取Ubuntu,redis,nginx等镜像,然后通过这些镜像创建不同的容器。
2.安装Docker
以CentOs为例:可以参考https://docs.docker.com/install/linux/docker-ce/centos/
https://yq.aliyun.com/articles/110806?spm=5176.8351553.0.0.2206199170TjX9
2.1 安装辅助工具:
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-utils
:管理repository及扩展包的工具 (主要是针对repository)
device-mapper-persistent-data
:Device Mapper支持Linux上的许多高级卷管理技术;
vm2
:逻辑卷管理工具;
2.2 添加软件源信息
这里使用Docker CE版本
从2017年3月开始docker在原来的基础上分为两个分支版本: Docker CE 和 Docker EE。Docker CE 即社区免费版,Docker EE 即企业版,强调安全,但需付费使用。
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新yum缓存:yum makecache fast
2.3 移除旧的版本
yum remove docker
2.4 安装
yum -y install docker-ce
2.5 启动
systemctl start docker
或者
#服务方式启动
service docker start
#设置开机启动
chkconfig docker on
2.6 测试运行hello-world
docker run hello-world
2.7 卸载
yum remove docker-ce rm -rf /var/lib/docker
- 可能出现的问题:
解决方案
yum clean all
yum install docker-ce
3.docker基本操作
3.1 查看版本
docker version
3.2 查看镜像
docker images
docker image ls
3.3 查看容器
docker ps
3.4 拉取镜像
docker pull image-name
3.5 镜像放到容器中跑
docker run image-name
3.6 查看容器运行情况
docker ps -a
docker container ps
docker container ps -a
4.docker原理
经过上面的操作,大概应该对docker有所体会,docker具有以下优势:
-
docker image的体积小
:ubuntu-100M+,小就意味着传输与分享方便 -
docker run
启动的耗时为0. -
docker 占用资源少
想象一下如下场景把一个项目build成一个image,然后方便分发出去,别人拿到后也不用关心你的项目需要什么环境或者依赖,只要docker run一下就能运行。。而且速度很快,甚至在一台开发机都可以管理成百上千的container,没有业务处理的时候也不会占用你的系统资源。。。
那么docker为什么会有这些优势!?
4.1 虚拟机 vs Docker容器
我们先来看一组虚拟机与Docker容器的对比
对于 虚拟机,在主机服务器中有三个基本层,从底部向上依次为:基础结构、主机操作系统和虚拟机监控程序,在所有这些层的顶部,每个 虚拟机都有其自己的 操作系统 和所有必需的库。 对于 Docker,主机服务器仅有基础结构和 操作系统,在其顶部是容器引擎,它将容器隔离,但共享基础操作系统的服务。
由于容器所需的资源要少得多(例如,它们不需要一个完整的 操作系统),所以它们也更易于部署且可快速启动。 这使容器能够具有更高的密度,也就是说,这允许你在同一硬件单元上运行更多服务,从而降低了服务器成本。
4.2 Docker核心组件
我们来看看Docker的核心组件:
AUFS(chroot)
– 用来建立不同的操作系统和隔离运行时的硬盘空间Namespace
– 用来隔离Container的执行空间Cgroup
– 分配不同的硬件资源SELinux
– 用来保护linux的网络安全Netlink
– 用来让不同的Container之间的进程保持通信,话说docker是golang开发的,还记得golang中goroutine如何通信?(博主问自己的)Netfilter
– 建立Container埠為基礎的網路防火牆封包過濾AppArmor
– 保護Container的網路及執行安全Linux Bridge
– 讓不同Container或不同主機上的Container能溝通- 等等·~等等~等等~
4.3 AUFS
docker运用linux的技术走了捷径,不虚拟化任何硬件,而是对硬件资源在不同的容器中做了隔离,隔离使每个容器之间拥有了不同的环境(硬盘空间-网路-系统工具包),然后又可以共享需要的硬件资源(cpu-内存-系统内核),dokcer用的技术很多(如上),一项一项研究基本不可能,这也不是我们学习docker的目的,我们是让docker用于实际生产过程中,所以我们应该了解docker是怎么就能办到这一切?
AUFS -> Another Union File System
:AUFS的技术可以让多个文件目录union成一个新的目录,并且可以对这个新的目录进行读写操作。
如果你有一张只读的cd数据盘,但是你却想编辑里面的内容,你通常的做法是不是把内容拷贝到本地硬盘,然后再编辑。
但如果你可以利用AUFS技术,你就可以将硬盘中的一个空目录和你的cd数据盘进行union形成一个新的目录,接着你对这个目录读取,会得到的cd盘内的数据,当你对这个目录的内容进行编辑,编辑的内容AUFS会自动将修改内容保存在你union的那个空目录内,当你再次读取的时候,AUFS也会将你硬盘中记录的改动内容优先于CD数据盘中的内容读取出来,这样对用户而言,这就完全是一个可编辑的目录内容了。——docker要的就是这个效果
想象一下docker的Image,其实也就是一个事先制作好的只读的文件目录,当我们要使用这个系统功能的时候,docker为我们开辟了一个新的文件夹和这个image做了union,提供给docker container做为系统运行的存储;
- 这个image里面已经包含了系统程序、工具软件、以及程序,当系统启动后产生的运行时文件(如logs、临时目录等)或新安装的软件都在这个新的文件夹内。
- 这样我们在启动一个container的时候,其实并没有加载镜像的过程,也不会像虚拟机一样需要安装一个系统这么负责,只是做了一次unoin,一切就和安装过系统的虚拟机同样使用了。
- 另外docker还提供了一个
docker commit
命令,这个命令可以随时将你现在的运行中的cantainer构建成一个新的image。
是不是有一种恍然大明白的感觉!?好了,别骗自己了,其实你还是不懂更深层次的内容,比如AUFS是怎么实现的,不过没关系,但是我们至少知道docker是通过什么办到这一切的。
参考资料
- https://www.cnblogs.com/edisonchou/p/dockerfile_inside_introduction.html 你必须知道的Dockerfile
- https://yq.aliyun.com/articles/110806 Docker CE 镜像源站
- https://blog.csdn.net/TMDUODUO/article/details/101094677 将docker下载镜像改为阿里云下载镜像
- https://www.cnblogs.com/cac2020/p/11359412.html 【Docker学习之二】Docker部署安装
- https://yq.aliyun.com/articles/63035 大白话Docker入门(一)
- https://yq.aliyun.com/articles/63517 大白话Docker入门(二)
- 原文作者:Garfield
- 原文链接:http://www.randyfield.cn/post/2020-03-26-docker1/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。