前言:
谈到docker 我们就不得不提起虚拟机,大家都知道虚拟机可以在原来的系统上模拟出一个另外一个系统比如Centos7,虚拟机虽然可以方便我们使用多个系统,但是他的缺点也很明显,有如下几个缺点:
(1)资源占用多
虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有 1MB,虚拟机依然需要几百 MB 的内存才能运行。
(2)冗余步骤多
虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。
(3)启动慢
启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。
因为有这么些缺陷,于是就有另外一种技术:Linux容器
一、Linux容器
Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。
由于容器是进程级别的,相比虚拟机有很多优势。
(1)启动快
容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。
(2)资源占用少
容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。
(3)体积小
容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。jr
总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。
二、正式进入Docker!
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。
在docker里面运行的软件是与宿主机共享资源的,docker的启动几乎是秒级的!
1. Docker 的主要用途,目前有三大类。
(1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
(2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
(3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。
2、docker的三要素:
Repository | Image |
Container |
Repositpry:存放镜像 有Docker Hub 也可以创建私有仓库
Image:各个模板 相当于OOP的class
Container:镜像创建的实例 相当于类的实例化
3、Image
docker images -a列出所有镜像 -q只列出镜像id
docker search imagename 在docker hub上查找镜像
列出的每个镜像都有各种信息 -s 200 是查找start超过200的镜像
docker pull tomcat 从hub上拉tomcat镜像 可以加版本号 如docker pull tomcat:8.1
docker rmi -f 强制删除镜像
想全部删除可以用 docker rmi -f $(docker images -qa)
看下面这张图
为什么tomcat有500多MB能 平常也就80多,这就是因为docker镜像的分层架构
tomcat运行需要linux环境吧,所以最内层的linux系统**(当然最底层还有docker的核心启动层)**,如然后需要JDK吧,所以第二层是JDK虚拟机,最外层才是tomcat,一般来说前几次安装的软件都比较大,因为这些层都是可以共享的,所以后面pull镜像的时候会越来越小
docker内层是只读的,外层才是可定制的4、Container
容器就是运行在docker上的一个个实例 可以是centos mysql tomcat等
docker run -i交互式启动容器 -t为容器分配一个输入终端 一般-it一起组合使用
docker run -p 主机端口:容器端口 -d后台运行(启动守护式进程)这里注意一下:在启动守护式进程中,如果没有前台程序在容器中运行,docker就会自动结束这个容器
什么是守护式进程?
Docker 守护进程运行在一台主机上。用户并不直接和守护进程进行交互,而是通过 Docker 客户端间接和其通信。
每个容器都有各自的id 还可以为容器起名字 --name 【名字】 即可
容器的退出有两种方式 :
**
- exit 退出并停止容器 :还可以用 start +容器id或名字 继续启动容器
- stop 停止容器 kill强制停止 (就和关电脑 一个按电脑的关机键慢慢关闭 一个直接拔电源)
- Ctrl+P+Q 退出交互式终端 但是不停止容器运行 要想重新进入
attach [name/id]
即可重新进入容器
如果是简单操作不必要进入容器的可以exec name/id 命令 如:exec mycentos ls /root 列出mycentos容器内/root下的文件 这样就不必进入容器了
**
容器停止或退出后 容器的id和名字依然存在,你可以通过命令:docker ps -l查看上一个运行过的容器 -n 10 查看上10个
要想彻底删除 还需要键入命令:docker rm -f 强制删除容器
容器的提交:如果你改变了容器,并且想用于以后使用开发的,可以将你改变的容器提交到私有或共有hub :docker commit -a="作者" -m=“描述” name\id 命名
三、总结:
- 我们讨论了docker的一些特性以及和传统vm的不同 体会到了docker 一次构建到处运行 秒级启动的便利
- docker的一些常用命令
- docker的基本原理:分层的文件系统