什么是docker
docker是一个应用容器引擎,是dotcloud公司开发的一种轻量级的虚拟化方案。
docker出现的背景
通常的,在公司中,不同职能的部门在交互半成品产品时,如开发与测试,测试与上线之间,由于操作系统(环境)的差异,回导致各种由于环境差异导致的问题,而docker能将运行环境和数据打包成镜像,并且能够运行任何镜像。
docker内部技术
- namespace:inux提供的内核级别的环境(运行空间)隔离方法,即进程之间,进程与子进程之间的隔离。但是物理资源还是共享的。
- Cgroup:linux提供的控制物理资源的分配(内存,cpu,磁盘空间等)的方法。
- linux container:linux提供的容器(虚拟化)技术,结合了上面两种技术,但他只是一种轻量级的容器技术,仅能对部分资源进行限制。(相比之下docker有更全面的资源限制能力)
以上是linux提供的技术
以下是docker使用的技术
- chroot:改变程序执行访问的根目录的位置,增加系统的安全性,限制使用者权限。
- veth:在虚拟机上桥接出一个新的网卡,与主机和外网通信。
- unionFS:联合文件系统,基于该技术“copy on write”(写时复制)的特点实现docker秒级启动和占用极少资源的特点。
- TC:用来做流量隔离,限制带宽。
- iptabls/netfilters:两个技术个ingtong实现容器的网络访问策略。
- quota:限制磁盘读写空间的大小。
- setrlimit:用来限制container中的进程和文件最大 打开数。
docker基本概念
- 引擎:创建和管理容器的工具,从仓库种拉取镜像,上传镜像。
- 镜像:创建容器的模版。
- 容器:一个简单的操作系统以及在其中运行的应用。
- 仓库:存放镜像。(目前最大的公共仓库是官方提供的Docker Hub)
docker与传统虚拟化的区别
不同于传统虚拟化,docker摆脱了对hypervisor(虚拟机管理程序)的依赖,直接与内核交互,几乎没有性能损耗,发挥裸机的全部性能。
docker4种基础镜像
在这4种基础镜像的基础上,开发出各种镜像,提交到仓库中。
- BusyBox:一个极简版的Linux系统,集成了100多种常用Linux命令,大小不到2MB,适用于简单测试场景。
- Alpine:一个面向安全的轻型Linux发行版系统,比BusyBox功能更完善,大小不到5MB,包含了足够的基础功能并且体积较小,在生产环境中最常用。
- Debian/centos: Debian 系列操作系统,功能完善,更新快,大小约170MB,适合研发环境。
- CentOS/Fedora:都是基于Redhat的Linux发行版,企业级服务器常用操作系统,稳定性高,大小约200MB,适合生产环境使用。
docker平滑升级
只需要更换底层镜像,策略会自动地让新的进程进入新的容器,就的进只需要更换底层镜像,策略会自动地让新的进程进入新的容器,就的进程在旧的容器中照常执行完成后结束。程在旧的容器中照常执行完成后结束。
docker使用场景
- 作为轻量级的虚拟机使用。
- 作为云主机使用:结合Kubernetes容器管理平台,动态分配服务器的资源。
- 应用服务打包:可以把java运行环境,tomcat服务器打包成镜像后再做一些修改,构成新的镜像,方便后期的升级和版本控制。
- 容器云平台。
- 支持CI/CD.
- 解决微服务实施的难题:利用Docker容器的环境隔离能力,让微服务运行在容器内,就能够解决由于为服务基于操作系统,而导致的资源浪费。
- 执行临时任务:创建环境,释放资源都很方便。
docker镜像分层
在4种基础镜像的基础上,开发出了docker hub仓库中的许多镜像,在docker中,镜像的开发基于分层的结构,也就是说,在镜像的基础上,开发出新的环境,导出成新的镜像以供后续使用。
- 镜像分层的优点:
镜像分层可以实现下层镜像的共享。 - 写时复制(copy on write):
在宿主机的镜像上启动docker后,在容器中的操作都是在容器上的一个可写层(容器层)上,所有操作会被差异备份到宿主机的相关目录下,不影响下层的镜像。容器关闭后,可写层被删除,所有的操作都失效。
文件操作
操作 | 说明 |
---|---|
修改文件 | 从上(容器层)到下(底层镜像)查找要操作的文件,找到后复制到容器层,进行修改操作。 |
查找文件 | 从上到下查找要操作的文件,找到后复制到容器层。 |
删除文件 | 容器查找到文件后,将删除的操作记录在容器层中,仅仅是保存记录。 |
创建文件 | 被创建的新文件被添加到容器层 |
- 镜像信息被保存在 /var/lib/docker/overlay2/【镜像编号】/diff中
- 在镜像上创建的容器的操作信息被保存在 /var/lib/docker/overlay2/【镜像编号】-init/diff中。(注意操作前后多处来的目录)
docker持久化存储
不想让容器关闭后,所有的操作都失效,就要想办法实现容器的持久化存储,有两个方法:
- 本地存储:将容器中创建的镜像存储到宿主机对应目录下。
- 网络存储:把多台宿主机的磁盘目录通过网络联合为共享存储,然后把共享存储中的特定目录映射给特定的容器。
- 导出成新的镜像。
安装docker
[root@yiki ~] yum -y install yum-utils device-mapper-persistent-data lvm2 #安装必要工具
[root@yiki ~] yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 添加软件源,此微恶最新版本,若有版本需求则访问官网
[root@yiki ~] yum makecache fast
[root@yiki ~] yum -y install docker-ce #安装社区版
[root@yiki ~] systemctl start docker #启动
[root@yiki ~] docker version #查看版本
*可以根据需要,修改仓库中的enable值来决定下载那个版本的docker。
- 启动第一个容器,来判断docker是否正确安装完毕。
[root@yiki ~] docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
*出现这样的结果说明成功启动了一个容器。