docker相关

一、docker是干嘛的?

Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。

docker就是类似的理念。现在都流行云计算了,云计算就好比大货轮。docker就是集装箱。

1.不同的应用程序可能会有不同的应用环境,比如.net开发的网站和php开发的网站依赖的软件就不一样,如果把他们依赖的软件都安装在一个服务器上就要调试很久,而且很麻烦,还会造成一些冲突。比如IIS和Apache访问端口冲突。这个时候你就要隔离.net开发的网站和php开发的网站。常规来讲,我们可以在服务器上创建不同的虚拟机在不同的虚拟机上放置不同的应用,但是虚拟机开销比较高。docker可以实现虚拟机隔离应用环境的功能,并且开销比虚拟机小,小就意味着省钱了。

2.你开发软件的时候用的是Ubuntu,但是运维管理的都是centos,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些Ubuntu转centos的问题,比如:有个特殊版本的数据库,只有Ubuntu支持,centos不支持,在转移的过程当中运维就得想办法解决这样的问题。这时候要是有docker你就可以把开发环境直接封装转移给运维,运维直接部署你给他的docker就可以了。而且部署速度快。

3.在服务器负载方面,如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署的话,这些内存就会利用起来。总之docker就是集装箱原理。

二、docker组成

docker组成
Docker Client : Docker提供给用户的客户端。Docker Client提供给用户一个终端,用户输入Docker提供的命令来管理本地或者远程的服务器。

Docker Daemon : Docker服务的守护进程。每台服务器(物理机或虚机)上只要安装了Docker的环境,基本上就跑了一个后台程序Docker Daemon,
    Docker Daemon会接收Docker Client发过来的指令,并对服务器的进行具体操作。

Docker Images : 俗称Docker的镜像,这个可难懂了。你暂时可以认为这个就像我们要给电脑装系统用的系统CD盘,里面有操作系统的程序,
    并且还有一些CD盘在系统的基础上安装了必要的软件,做成的一张 “只读” 的CD

Docker Registry : 这个可认为是Docker Images的仓库,就像git的仓库一样,用来管理Docker镜像的,提供了Docker镜像的上传、下载和浏览等功能,
   并且提供安全的账号管理可以管理只有自己可见的私人image。就像git的仓库一样,docker也提供了官方的Registry,叫做Dock Hub

Docker Container : 俗称Docker的容器,这个是最关键的东西了。Docker Container是真正跑项目程序、消耗机器资源、提供服务的地方,
   Docker Container通过Docker Images启动,在Docker Images的基础上运行你需要的代码。 你可以认为Docker Container提供了系统硬件环境,
   然后使用了Docker Images这些制作好的系统盘,再加上你的项目代码,跑起来就可以提供服务了。 听到这里,可能你会觉得是不是有点像一个
   VM利用保存的备份或者快照跑起来环境一样,其实是挺像的,但是实际上是有本质的区别,后面我会细说。

三、docker怎么用

1.首先你得安装一下docker的环境,这个我在这里就不说了,针对你的系统看一下docker的官网( http://www.docker.com/products/docker ) 吧
docker info:如果没有找到此命令,则表示Docker没有正确安装。

2.安装好后,我们在terminal中就有了docker的命令了,这个命令就是Docker Client啦。所有的操作都是通过docker命令完成的。比如: docker version

3.docker images:查看一下我们拥有了哪些images吧
  可以看到我们拥有3个images,其中ubuntu大家都知道,busybox是一个linux下的大工具箱,它集成压缩了 Linux 的许多工具和命令,
  而job1则是我自己基于busybox创建的一个image,可以通过busybox的工具进行一些命令的执行,比如 echo 'hello world'。

4.docker ps:查看一下我们有哪些Docker Container吧
  这里看到的都是正在运行的Container,如果要查看所有的Container就使用 docker ps -a

5.docker pull image-name:从Docker hub的Registry下载一个Image
  再看一下现在images,命令: docker images

6.docker run image-name:把hello-world的image,放到一个docker container里面让他跑起来吧
  这个image运行后很简单,就是打印了这段话。告诉了我们,我们已经成功的让docker daemon从docker hub上拉了一个"hello-world"的image,
  并且通过这个image创建了一个container,并且通过daemon将输出的内容传回了docker client,也就是我们现在看到的这段话。
例子:docker run -d busybox /bin/sh -c "while true; do echo Docker; sleep 1; done" 
docker logs dbe28f094aab:运行Docker logs命令来查看当前实例的console输出
docker stop dbe28f094aab:名为dbe28f094aab的容器,可以使用以下命令来停止
docker restart dbe28f094aab :使用以下命令重新启动该容器
docker stop dbe28f094aab && docker rm dbe28f094aab:完全移除容器,需要将该容器停止,然后才能移除
docker commit dbe28f094aab busybox2:将容器的状态保存为镜像
docker exec dbe28f094aab  ls /:使用以下命令执行该容器命令(exec后面跟容器名称或者id,后面跟执行的命令)
docker search busybox:在docker.io registry中的镜像可以使用以下命令查找到
docker history busybox:查看镜像的历史版本可以执行以下命令
docker push busybox: 使用以下命令将镜像推送到registry

7.最后再看一下是否真的创建了docker container,命令 docker ps -a
  首先看到,确实已经创建了docker container了,可见 docker run  的命令实际上是create 和 start的结合命令,基于hello-world的image创建
   并启动了container。
  container启动后执行了打印的程序,打印完上面我们看到的那句话,程序执行完成,container也跟着关闭了。从STATUS可以
   看出,在9分钟前hello-world的这个container已经exited了。

hello-world里面到底有什么?
  其实一个image就是一个系统盘加上你的代码,所以对于这个hello-world的image,我想里面就是一个busybox这样的命令工具箱和一个打印文本(echo ....)的个sh文件,当image加载后执行了这个sh文件这么简单。
  如果要我去创建这个image,我也可以拿一个ubuntu的image,并且安装了jre,再写一个class,main方法里面打印这段文本,最后build成这一个image,上传到docker hub。是不是也是一个hello-world-for-java的image呢。其它人下载后也可以一样的打印出预期的结果。

docker commit container-id:通过一个ubuntu的container生成一个新的image,这个image内包含了在这次container中的改动

四、docker基本命令
1.docker info
如果没有找到此命令,则表示Docker没有正确安装。如果正确安装会输出类似下面的内容

2.docker pull busybox
BusyBox是一个最小的Linux系统,它提供了主要的功能,不包含一些与GNU相关的功能和选项。

3.docker run busybox /bin/echo SFDocker
显示信息的命令

4.docker run -d busybox /bin/sh -c "while true; do echo Docker; sleep 1; done") 

五、docker的特点

1.docker image的体积非常的小,注意看下之前我们用到的几个image的size,一个完整功能的ubuntu才100多mb。
  docker image如此小的体积,让我们可以方便的在网络上传输和分享,对于公司来说就提供了对大量image的管理和分发的可能。

2.docker的系统启动的耗时为0。昨天如果自己也尝试启动hello-world的同学可能会知道,docker run hello-world的命令是瞬间完成的,
  你并没有感觉到加载image,启动系统的耗时,命令完成就直接输出了结果。程序执行完后container也跟着关闭,也并没有保存镜像的时间,
  但下次再运行还是会保留你处理过的状态。

3.docker系统占用资源极少,我们知道如果我们开启了一个vm的系统,不论是linux的或者windows,就算什么都不运行都会占用一部分内存,
  但是docker container启动后如果不运行程序,你是看不到系统资源被占用的

这些特点是不是完全和vm不同呢?并且有了这些特点,是不是很多之前没有的应用场景就会产生?
比如我们可以把一个项目build成一个image,然后方便分发出去,别人拿到后也不用关心你的项目需要什么环境或者依赖,
只要docker run一下就能运行。。而且速度很快,甚至在一台开发机都可以管理成百上千的container,
没有业务处理的时候也不会占用你的系统资源。


        Dcoker通过很多的所谓 隔离 的方式,让多个docker container之间共享了同一台机器上的资源,但又是相互隔离的(比如container1 和 container2 用的是完全不同的硬盘空间、网络地址等),这样就让docker container成为了我们项目理想的开发、测试、发布的环境。非常的轻量,简单,易于分发和管理。这也就是docker的目标:Build, Ship and Run Any App, Anywhere!


将少量server可以转化成几百虚拟机,也可以转化成几千容器
Docker是如何做到的
  一台服务器给我们开发的项目到底提供了哪些能力让他运行起来呢?cpu、内存、硬盘、网络、操作系统、工具软件
还有项目的运行环境(jre等)。当具备了这些能力的机器,我们会说这台机器给项目提供了可以运行的环境。
  VM技术可以将一台物理机器部署为多台虚拟机器,解决了很多物力资源的浪费以及方便的管理能力。那么VM是怎么做到的呢?
关键词:Hypervisor,VM在物理机器的操作系统上建立了一个中间软件层Hypervisor,Hypervisor利用物理机器的资源,虚拟出多个新虚拟的
硬件环境,这些硬件环境可以共享宿主机的资源。这些新的虚拟的硬件环境,安装操作系统和相应的软件后便形成了一台台的虚拟机器。
  那么Docker有什么不同呢?Docker很聪明的利用linux的一些技术走了一条捷径:Docker选择了和虚拟化完全不同的思路,并不去虚拟化任何硬件,
而是对硬件资源在不同的docker container之间做了 “隔离” 。隔离使每个docker container之间拥有了不同的环境(硬盘空间、网络、系统的工具包),
并且又可以共享需要的硬件资源(cpu、内存、系统内核),达到了和虚拟机能提供的同样的功能。

Docker使用的Linux核心的组建如下:(截取自Docker的元件– Linux核心部分)

AUFS(chroot) – 用来建立不同的操作系统和隔离运行时的硬盘空间

Namespace – 用来隔离Container的执行空间

Cgroup – 分配不同的硬件资源

SELinux – 用来保护linux的网络安全

Netlink – 用来让不同的Container之间的进程保持通信

Netfilter – 建立Container为基础的网络防火墙封包过滤

AppArmor – 保护Container的网络及執行安全

Linux Bridge – 让不同Container或不同主机上的Container能沟通

最具代表性的AUFS来展开一下:
AUFS -> Another Union File System,AUFS的技术可以让多个文件目录union成一个新的目录,并且可以对这个新的目录进行读写操作。

  那这有什么用呢?如果你有一张只读的cd数据盘,但是你却想编辑里面的内容,你通常的做法是不是把内容拷贝到本地硬盘,然后再编辑。但如果你可以利用AUFS技术,你就可以将硬盘中的一个空目录和你的cd数据盘进行union形成一个新的目录,接着你对这个目录读取,会得到的cd盘内的数据,当你对这个目录的内容进行编辑,编辑的内容AUFS会自动讲修改内容保存在你union的那个空目录内,当你再次读区的时候,AUFS也会将你硬盘中记录的改动内容优先于CD数据盘中的内容读取出来,这样对你来说这就完全是一个可编辑的目录内容了。

  AUFS虽然看起来思路很简单,但是docker却利用这个技术做出了大文章。我们可以想象一下docker的Image,其实也就是一个事先制作好的只读的文件目录,当我们要使用这个系统功能的时候,docker为我们开辟了一个新的文件夹和这个image做了union,提供给docker container做为系统运行的存储,这个image里面已经包含了系统程序、工具软件、以及程序,当系统启动后产生的运行时文件(如logs、临时目录等)或新安装的软件都在这个新的文件夹内。这样我们在启动一个container的时候,其实并没有加载镜像的过程,也不会像vm一样需要安装一个系统这么负责,只是做了一次unoin,一切就和安装过系统的虚拟机同样使用了。另外docker还提供了一个 docker commit 命令,这个命令可以随时将你现在的运行中的cantainer构建成一个新的image。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值