Docker是什么
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,实现虚拟化。
Docker的logo
“The logo is a Whale carrying a stack of containers. It is on its way to deliver those to you.”
“一只载着一堆集装箱的鲸鱼,正在运向你”
Docker和虚拟机的区别
docker:一种虚拟化的解决方案,但是和虚拟机是完全不同的虚拟方案
虚拟机:服务器---宿主机OS(内核)--虚拟机管理系统--应用(虚拟化OS内核+各种依赖+app),一般每个应用都会很大,并消耗很多cpu和内存
docker:服务器---宿主机OS(内核)-- docker engine--虚拟化软件(没有虚拟化内核,直接使用宿主机内核)
每个bins/libs相当于从服务器中划分出的独立的资源,可以理解成为轻量的虚拟化技术(各种依赖)
docker engine相当于docker的“服务器”,可以接收并解析、执行docker 命令,可直接与Host OS 进行通信,为每个docker容器分配资源
虚拟机在宿主机器、宿主机器操作系统的基础上创建虚拟层、虚拟化的操作系统、虚拟化的仓库,然后再安装应用
docker是在宿主机器、宿主机器操作系统上创建Docker引擎,在引擎的基础上再安装应用
Docker的优势
虚拟机引导、加载操作系统内核是一个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,这个新建过程是分钟级别的
docker由于直接利用宿主机的操作系统,省略了这个过程,因此新建一个docker容器只需要几秒钟
另外,现代操作系统是复杂的系统,在一台物理机上新增加一个操作系统的资源开销是比较大的,因此,docker对比虚拟机在资源消耗上也占有比较大的优势
事实上,在一台物理机上我们可以很容易建立成百上千的容器,而只能建立几个虚拟机
Docker能做什么
解决虚拟机不方便的场景,在虚拟机的基础上扩展更多的服务
【搭建测试环境,解决环境不一致的问题】docker是通过镜像启动每个容器,只要镜像是一致的,环境基本就是一样的
举例:以前,A机器上运行的程序想部署一套到B机器上去,如果采取传统到方式进行文件拷贝等,有可能出现问题,如果采用容器的方式进行运输、部署,就可以避免因环境不一致导致的问题
【搭建各类基础服务】jenkins、jira等都可以使用docker搭建;有镜像的话 直接去官方下载或者使用别人打好的镜像,直接使用,节省学习成本
Docker思想
99%的场景是不挑内核的,所以可以共享宿主机内核
Docker优缺点
优点
1、轻量级:
虚拟机是虚拟化一个完整的内核,资源开销大,磁盘空间、cpu等要占用很大一部分空间
docker不需要虚拟化内核,直接共享 宿主机的内存,节省了开销,同样的资源条件,docker可以比虚拟机启动更多的软件
缺点:
1、一旦 一个容器把服务器内核搞崩了,那么 所有的容器都崩了(共享 宿主机的缺点)(在一个容器把磁盘/cpu打满,可能就会把服务器搞崩)
2、一旦某个应用是 挑内核(只能在linux版本 xxx的环境下运行)不能拿docker做后端的兼容测试(OS的兼容测试,有的系统只支持Ubuntu x.x.x系统,docker是共享内核 单独在镜像中的os服务兼容规范的话,没有用的,会使用宿主机内核的)(有些C++ 是挑内核的)
Docker镜像
镜像可以简单理解成一个压缩包,这个包中,有你的程序或代码,还有一个文件系统,所谓文件系统,就是打包了一个标准操作系统的所有必须文件,可执行程序、运行库等
Docker 之所以解决了程序执行环境一致性问题,就是将应用程序和文件系统打包到了一起,程序运行时,从你打包的镜像文件系统中加载依赖
docker运行容器前,需要本地存在对应的镜像,如果不存在,docker会从镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载
Docker容器
可以简单理解镜像是“死的”,是磁盘上储存的“静态的”文件,而容器是运行起来的、内存中的、“动态的”实例
(容器也不一定是运行着的,容器也能停止)
通过 docker run
命令可以从一个镜像启动一个容器,一个镜像可以启动无限个容器副本,每个容器还互相隔离,可以将一个个容器理解成一个个虚拟机,每个容器都有自己的 IP、文件系统等等
启动方式:
(1)基于镜像新建一个容器并启动
(2)在终止状态的容器,重新启动
Dockerfile
Dockerfile 是生成镜像的配置文件,该文件中首先声明了镜像的基础镜像,一般情况下,构建镜像需要依赖一个基础镜像
Dockerfile 中还包含着一些其他信息的声明,比如环境变量、标注需要开放的端口等
可以使用docker save
命令,将你电脑上生成的镜像导出成 tar 打包文件,然后用来数据备份,或将文件拷贝到其他电脑上,用 docker load
命令导入镜像,实现镜像的分发
但是,这样操作非常麻烦,尤其是远程传输。请使用镜像仓库来进行统一管理和分发。
镜像仓库就是一个在线提供镜像存储的服务,使用 docker pull
从镜像仓库中拉取(下载)镜像
Docker Hub:https://hub.docker.com/search?q=&type=image
docker隔离的关键技术(利用的linux的技术)
1、Namespace(隔离 名称空间)
2、联合文件系统(构建docker镜像)
3、Cgroups(隔离资源:cpu、内存等)
docker共享内核,是不隔离内核的
Docker命令
docker run -d --name lwjjenkins -p 8081:8080 jenkins/jenkins
-p 8081:8080 通过端口映射的方式做了转发规则,往宿主机8081端口发送请求,docker帮忙把请求转发到8080端口
docker容器在启动的时候,如果不指定端口映射参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的
没有做端口映射
做了端口映射
搭建jenkins遇坑:
1、选择安装的插件,报错No such plugin: cloudbees-folder:
原因是因为下载的Jenkins.war里没有cloudbees-folder插件,需手动下载到/var/jenkins_home/war/WEB-INF/detached-plugins 路径下
http://www.mamicode.com/info-detail-2905692.html
如果下载好,还是报错的话,需要看下启动容器是否报错
有IO报错,要更新jenkins插件的 更新站点:https://blog.csdn.net/ezreal_tao/article/details/94362654