本节内容
一 Docker概述 |
Docker是什么
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,
然后发布到任何流行的Linux机器上,也可以实现虚拟化
通俗理解:
- Docker容器将软件以及它运行安装所需的一切文件打包到一起,这就保证了不管是在什么样的运行环境,总是能以相同的方式运行,
就好像Java虚拟机一样,“一次编写,到处运行”,而Docker是“一次构建,到处运行”
- 2. 可以理解为虚拟机的升级版,但比虚拟机更灵活、性能更高、更轻便、启动速度更快
Dcoker组件
Docker Client:向docker服务器进程发起请求,如:创建、停止、销毁容器等操作,就是docker服务端的远程控制器,docker 命令
Docker Server 服务器进程:处理所有docker的请求,管理所有容器
Docker Registry 镜像仓库:镜像存储的中央仓库
大部分情况下,Docker 服务端和客户端运行在一台机器上
镜像、容器、仓库的概念
- 镜像可以用来创建Docker容器。一个镜像可以包含一个完整的操作系统环境和用户需要的其他应用程序。
在docker hub里面有大量现成的镜像提供下载。docker的镜像是只读的,一个镜像可以创建多个容器
容器是来开发、运行应用。每个容器都是相互隔离的、保证安全的平台
仓库是集中存放镜像文件的场所,每个镜像文件有不同的标签(tag)。最大的公开仓库是DockerHub,存放了数量庞大的镜像供用户下载,
国内的公开仓库包括DockerPool
Docker导图
二 Docker的安装 |
"""
CentOS7 64位
安装一个干净的CentOS 7 64位虚拟机 yum upgrade -y
yum install net-tools -y
yum install gcc zlib-devel openssl-devel gcc+ gcc-c++ openssl perl lrzsz wget -y
关闭SELINUX=disabled vim /etc/selinux/config yum install docker -y
chkconfig docker on
service docker start
docker run hello-world
docker version
"""
版本信息
三 Docker基本使用 |
下载镜像
docker seach tomcat # 搜素官方镜像库
docker pull docker.io/tomcat # 下载镜像, 完整镜像名字,或者通过image_id
docker images # 查看本地镜像
docker rmi docker.io/tomcat # 删除镜像, 完整镜像名字,或者通过image_id,选项-f 强制删除
运行镜像 - 容器
docker run -p 8081:8080 docker.io/tomcat # 把tomcat的8080映射到8081
http://192.167.254.250:8081
docker ps # 查看运行的容器
docker stop container_id # 停止容器
部署应用程序到docker
cd /opt/www
docker run -v /opt/www:/usr/local/tomcat/webapps/www -p 8080:8081 docker.io/tomcat
利用dockerfile创建自己的镜像
vi Dockerfile 这个也是在上面的目录中创建,内容如下:
#命令必须大写,执行顺序从上到下顺序进行
#指定一个镜像的名字,如果本地存在则可以直接使用该镜像,如果本地不存在会从Docker仓库自动下载,后续的所有指令都是基于该镜像进行
FROM docker.io/darksheer/centos #告诉Docker创建该镜像人的名字、邮箱
MAINTAINER Jonathan <[email protected]> #ADD是将外部文件copy到镜像里
ADD ./apache-tomcat-7.0.70.tar.gz /root
ADD ./jdk-7u80-linux-x64.tar.gz /root #ENV是在镜像中设置环境变量
ENV JAVA_HOME /root/jdk1.7.0_80
ENV PATH $JAVA_HOME/bin:$PATH #RUN是在镜像中运行此命令
#RUN yum -y upgrade #容器指定的端口号
EXPOSE 8080 #启动容器的时候执行设定的命令
ENTRYPOINT /root/apache-tomcat-7.0.70/bin/startup.sh && tail -F /root/apache-tomcat-7.0.70/logs/catalina.out
docker build -t jonathantomcat . # . 表示当前目录找 Dockerfile
docker images # 查看是否创建完成
提交镜像到docker hub
1. 官网注册账号 https://www.docker.com
2. docker push 已经构建好的镜像全称
四 Docker相关命令汇总 |
五 Docker概念理解 |
Docker 通俗理解
1、集装箱标准化,互不影响,大货轮统一运走。云计算好比大货轮,Docker就是就是集装箱。
2、虚拟机开销比较高,Docker开销比较小。
3、Docker是容器,容器放应用。
4、Docker的logo来解释,鲸鱼和集装箱。
大鲸鱼(或者货轮)就是操作系统,把要交付的应用程序看成是各种货物。
原本要将各种尺寸、不同形状的货物放到大鲸鱼上,你得为每件货物考虑怎么安放(就是应用程序的配置环境),
还得考虑货物和货物是否能叠起来(应用程序的依赖环境是否会冲突)。
现在使用了集装箱(容器)把每件货物都放在集装箱里,这样大鲸鱼可以用同样的方式安放、堆叠集装箱
Docker就是这整套机制。
5、苹果上的app,linux上的docker
6、自如单间租房,就是docker,不仅能做资源隔离,还规范化系统化了(repo/image),所有房间(container)统一装修和家具,
你交钱签约就能享受一个相对独立的生活环境(environment)了,你自己的东西在你屋子里随便摆,都可以的;
对中介来说,你当下不过就是个正在running的instance,的当你gameover了以后,这个房间他还可以以很小的代价租给别人run,效率颇高。
7、同一个容器贯穿开发、测试、生产和交付四个环节
基于虚拟机的虚拟化和基于容器的虚拟化
非正式的说,虚拟化是通过软件手段对计算机硬件资源镜像、整合、管理和再分配的一种技术。 最常用的是基于虚拟机(Hypervisor-based)的虚拟化,经过40年发展,基于虚拟机的虚拟化技术已经比较成熟,它通过一个软件层的封装, 提供和物理硬件相同的输入输出表现,实现了操作系统和计算机硬件的解耦,将OS和计算机从1对1变成了多对多(实际上是1对多)的关系。 该软件层称为虚拟机管理器(VMM/Hypervisor),它可以直接运行在裸机上,也可以运行在操作系统上。 这样方案有一个缺陷,在虚拟机上运行了一个完整的操作系统(GueseOS),在其下执行的还有虚拟化层和宿主操作系统,一定比直接在物理机上 运行相同的服务性能差。而且有GuestOS的存在,虚拟机镜像往往有几个G到几十个G,占用的存储空间大,便携性差,迁移时通信代价大, 不便于集群管理。另外另外每次想用使用更多硬件资源,需要启动一台新的虚拟机,要等待GuestOS启动,可能需要几十秒到几分钟不等。 这些问题都是GuestOS带来的,虚拟化层的技术再怎么进步也无法解决这几个问题。 实际使用场景中,我们使用虚拟化技术其实是为了按需分配资源来完成服务的部署和使用,同时对服务所依赖的环境进行隔离,不被其他服务 感知或干扰。为此启动一个GuestOS并不是必须的,为什么不考虑让多个虚拟机公用一个操作系统内核,只隔离开服务运行环境,同时控制 服务使用的系统资源呢? 容器是没有GuestOS的轻量级"虚拟机",多个容器共享一个OS内核,容器中包含需要部署的应用和它依赖的系统环境,容器大小通常只有几十 到几百MB,由于共享操作系统内核,所以容器依赖于底层的操作系统,各个操作系统大都有自己的容器技术和容器工具。 Docker是一个Linux容器管理工具,随着Docker的兴起,Linux容器技术也是当下最时兴的容器虚拟化技术。Linux容器工具有很多,OpenVZ、 LXC、Docker、Rocker、Lmctfy等等,大都是基于Linux内核提供的两个机制:Cgroups(实现资源按需分配)和Namespace(实现任务隔离) 由于使用的技术完全不同,容器和虚拟机也有很多不同的地方: 最直观的区别就是容器比虚拟机明显更轻量级,对宿主机操作系统而言,容器就跟一个进程差不多。 因此容器有着更快的启动速度(秒级甚至更快),更高密度的存储和使用(镜像小)、更方便的集群管理等优点。 同时由于没有GuestOS存在,在容器中运行应用和直接在宿主机上几乎没有性能损失,比虚拟机明显性能上有优势。 还有一点是虚拟机技术已经发展了很多年,虚拟机和虚拟化层间的接口、虚拟机镜像格式等都已经标准化了, 相应的管理工具、分布式集群管理工具都有比较完善的解决方案,而容器最近几年才兴起,配套技术和标准还在完善中。 此外虚拟机由于有GuestOS存在,可以和宿主机运行不同OS,而容器只能支持和宿主机内核相同的操作系统。 而且虚拟机由于有VMM的存在,虚拟机之间、虚拟机和宿主机之间隔离性很好,而容器之间公用宿主机的内核,共享系统调用和一些底层的库,隔离性相对较差。 容器现有两个比较大的缺点(隔离性不够强,依赖操作系统)
更多信息请参考
http://edu.51cto.com/course/10535.html