Docker(1)-初识Docker
前言
本人文章均引用或者复制:
公众号:
QQ群:806951874
Docker的前世今生
传统项目开发部署的流程是怎样的?
传统项目开发部署的基本流程
这里只简单描述一下,项目发布的基本流程
- 本地开发+测试,没有问题的话,编译打包发布到测试环境
- 在测试环境中进行测试,测试完成后,发布到生产环境
- 在生产环境中进行最后的测试,如果没有问题,那么一切就OK了
存在什么问题?
- 存在问题:不同机器上的软件环境不一致。(比较核心的问题)
- 软件环境的配置繁多、命令记不清楚。
- 重复性搭建软件环境、效率低下。
对照传统虚拟机总结
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为MB | 一般为GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
Docker是干什么用的?
Docker解决的问题
由于不同的机器有不同的操作系统,以及不同的库和组件,在将一个应用部署到多台机器上需要进行大量的环境配置操作。
Docker 主要解决环境配置问题,它是一种虚拟化技术,对进程进行隔离,被隔离的进程独立于宿主操作系统和其它隔离的进程。使用 Docker 可以不修改应用程序代码,不需要开发人员学习特定环境下的技术,就能够将现有的应用程序部署在其它机器上。
与虚拟机的比较
虚拟机也是一种虚拟化技术,它与 Docker 最大的区别在于它是通过模拟硬件,并在硬件上安装操作系统来实现。
so
==Docker不是虚拟机==
对Docker的感受:
比如公司买了一台新服务器,系统是centos,你要想把项目部署到服务器上,而且项目中使用到了mysql、redis、activemq、zookeeper等技术,要想项目能在服务器上正常运行,必须在新的服务器上搭建好mysql、redis、activemq、zookeeper服务环境。这样的话,在环境搭建和配置上就要花费太多的时间了(因为需要配置很多的配置文件、需要手动启动服务等)。
又或者每次重装一次系统或者换一个机器,你就要把环境重装一次,东西越多花费的时间越多、很麻烦、浪费时间和精力。
而使用Docker的话,你只需要一条命令,你就可以在你的centos系统上运行你需要的软件,比如mysql、tomcat、jdk、redis等。
举个栗子
【示例1】:Docker上安装mysql
- 你需要MySQL服务,那么在docker中通过简单的命令就可以安装一个MySQL数据库服务:
1 |
|
- 启动mysql命令
1 |
|
很简单吧,一个mysql服务就启动完成了,就可以正常使用了。可以通过mysql客户端(Navicat、DataGrip等)连接这个mysql数据库。
【示例2】:Docker上安装jdk
- 你需要JDK环境,那么在Docker中通过简单的命令安装一个JDK的镜像, 然后通过一条命令启动这个容器就行了,容器会自动给你安装配置好JDK环境。
1 |
|
就这么简单的一条命令,JDK就安装好了。你可以在Docker容器的命令行中通过java -version来检测jdk是否安装成功。
镜像、容器:
对于新手而言,或许有点不明白镜像和容器分别是个什么东东,还是有点不明白。
你可以这样感官的理解:
镜像 —— 相当于ISO操作系统的安装包,ISO镜像的内容是固定的,不会发生改变,可以重复使用。
容器 —— 类似于使用 ISO镜像安装的新的操作系统,可以使用一个相同的ISO镜像,安装很多操作系统。
Docker占用的资源很小。启动一个容器一般都是秒级的。
Docker镜像、容器、仓库的介绍
Docker镜像
通俗的理解镜像
Docker的镜像是一个只读的模板,一个独立的文件系统,包括运行容器所需的数据,可以用来创建新的容器。
Docker的镜像相当于ISO操作系统的安装包,ISO镜像的内容是固定的,不会发生改变,可以重复使用。
如果上面的形容还无法让你理解Docker镜像,那我再举一个例子:
从事Java开发的人都知道类和实例的关系。直观的感觉,类就像是一个模板,根据这个类模板,可以生成很多个具体的对象实例。
则,Docker镜像就相当于Java的类,而通过Docker镜像生成出来的东西,我们就叫他它“容器”。
通过上面的形容,应该可以感觉的到镜像和容器之间的关系了吧。
Docker容器
通俗的理解容器
在上一节已经介绍了镜像与容器的关系。
这里就直接copy文档中的一句话,来简单形容一下容器:
Docker镜像就相当于Java的类,而通过Docker镜像生成出来的东西,我们就叫他它“容器”。
Docker仓库
通俗的理解Docker仓库
仓库支持的操作类似git,当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。
类似于,将某项目模块打成jar包,然后上传到私有或者公有的maven仓库,然后在其他的所有支持maven环境的机器上,都可以拉取这个jar进行使用。