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)在终止状态的容器,重新启动

PS:当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:
1.检查本地是否存在指定的镜像,不存在就从公有仓库下载
2.利用镜像创建并启动一个容器
3.分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
4.从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
5.从地址池配置一个 ip 地址给容器
6.执行用户指定的应用程序
7.执行完毕后容器被终止

 

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 pull
不加版本号的话,默认会拉 latest版本;
docker镜像基本都是由多层组成,所以拉取镜像也是 分层拉取的

 

 

docker images  
当前所有镜像
 
docker rmi <image id>
删除镜像

 

 

docker run jenkins/jenkins  启动容器
 
docker run -d   后台运行,以免终端关闭 停止启动容器
 
docker logs -f ,可以看运行日志

  

docker run -d --name liuweijianjenkins jenkins/jenkins   以“liuwiejianjenkins"命名 启动jenkins
 
docker ps
当前正在运行的 容器列表

 

docker stop liuweijianjenkins  停止容器
 
docker rm liuweijianjenkins   删除容器
一般都是先停止 ,在删除;也可以强制删除  docker rm -f liuweijianjenkins  
 

 

 docker run -d --name lwjjenkins  -p 8081:8080 jenkins/jenkins

-p 8081:8080 通过端口映射的方式做了转发规则,往宿主机8081端口发送请求,docker帮忙把请求转发到8080端口

docker容器在启动的时候,如果不指定端口映射参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的

没有做端口映射

做了端口映射

 

 

首次进入jenkins需要密码:

 

搭建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

 

 

 

 
 
 
 
 
 

 

 posted on 2020-05-18 22:00  Lverson_tester  阅读(200)  评论(0编辑  收藏  举报