一、Docker

1,概念

  Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

2,docker的应用场景

  • Automating the packaging and deployment of applications(使应用的打包与部署自动化)
  • Creation of lightweight, private PAAS environments(创建轻量、私密的PAAS环境)
  • Automated testing and continuous integration/deployment(实现自动化测试和持续的集成/部署)
  • Deploying and scaling web apps, databases and backend services(部署与扩展webapp、数据库和后台服务)
  云计算、大数据,移动技术的快速发展,加之企业业务需求的不断变化,导致企业架构要随时更改以适合业务需求,跟上技术更新的步伐。毫无疑问,这些重担都将压在企业开发人员身上;团队之间如何高效协调,快速交付产品,快速部署应用,以及满足企业业务需求,是开发人员亟需解决的问题。Docker技术恰好可以帮助开发人员解决这些问题。
  为了解决开发人员和运维人员之间的协作关系,加快应用交付速度,越来越多的企业引入了DevOps这一概念。但是,传统的开发过程中,开发、测试、运维是三个独立运作的团队,团队之间沟通不畅,开发运维之间冲突时有发生,导致协作效率低下,产品交付延迟, 影响了企业的业务运行。Docker技术将应用以集装箱的方式打包交付,使应用在不同的团队中共享,通过镜像的方式应用可以部署于任何环境中。这样避免了各团队之间的协作问题的出现,成为企业实现DevOps目标的重要工具。以容器方式交付的Docker技术支持不断地开发迭代,大大提升了产品开发和交付速度。
  此外,与通过Hypervisor把底层设备虚拟化的虚拟机不同,Docker直接移植于Linux内核之上,通过运行Linux进程将底层设备虚拟隔离,这样系统性能的损耗也要比虚拟机低的多,几乎可以忽略。同时,Docker应用容器的启停非常高效,可以支持大规模的分布系统的水平扩展,真正给企业开发带来福音。

3,docker与虚拟机的区别

虚拟化容器之Docker_业务需求

虚拟机:

  • 基础设施(Infrastructure)。它可以是你的个人电脑,数据中心的服务器,或者是云主机
  • 虚拟机管理系统(Hypervisor)。利用Hypervisor,可以在主操作系统之上运行多个不同的从操作系统。类型1的Hypervisor有支持MacOS的HyperKit,支持Windows的Hyper-V、Xen以及KVM。类型2的Hypervisor有VirtualBox和VMWare workstation。
  • 客户机操作系统(Guest Operating System)。假设你需要运行3个相互隔离的应用,则需要使用Hypervisor启动3个客户机操作系统,也就是3个虚拟机。这些虚拟机都非常大,也许有700MB,这就意味着它们将占用2.1GB的磁盘空间。更糟糕的是,它们还会消耗很多CPU和内存。
  • 各种依赖。每一个客户机操作系统都需要安装许多依赖。如果你的应用需要连接PostgreSQL的话,则需要安装libpq-dev;如果你使用Ruby的话,应该需要安装gems;如果使用其他编程语言,比如Python或者Node.js,都会需要安装对应的依赖库。
  • 应用。安装依赖之后,就可以在各个客户机操作系统分别运行应用了,这样各个应用就是相互隔离的。

docker:

  • 基础设施(Infrastructure)
  • 主操作系统(Host Operating System)。所有主流的Linux发行版都可以运行Docker。对于MacOS和Windows,也有一些办法”运行”Docker。
  • Docker守护进程(Docker Daemon)。Docker守护进程取代了Hypervisor,它是运行在操作系统之上的后台进程,负责管理Docker容器。
  • 各种依赖。对于Docker,应用的所有依赖都打包在Docker镜像中,Docker容器是基于Docker镜像创建的。
  • 应用。应用的源代码与它的依赖都打包在Docker镜像中,不同的应用需要不同的Docker镜像。不同的应用运行在不同的Docker容器中,它们是相互隔离的。

 区别:

  虚拟机多了一层guest OS,同时Hypervisor会对硬件资源进行虚拟化。docker直接使用硬件资源,适用的平台更广、启动速度快、资源利用率高。

虚拟化容器之Docker_docker_02

二、Docker结构

虚拟化容器之Docker_业务需求_03

  docker的整个生命周期有三部分组成:镜像(image)+容器(container)+仓库(repository)。容器是由镜像实例化而来,这和我们学习的面向对象的概念十分相似,我们可以把镜像看作类,把容器看作类实例化后的对象。镜像是文件, 容器是进程。 容器是基于镜像创建的, 即容器中的进程依赖于镜像中的文件, 这里的文件包括进程运行所需要的可执行文件, 依赖软件, 库文件, 配置文件等等。

虚拟化容器之Docker_docker_04

1,docker镜像

虚拟化容器之Docker_docker_05

   镜像(Image)就是一堆只读层(read-only layer)的统一视角,存在于/var/lib/docker/aufs目录下。

2,docker容器

虚拟化容器之Docker_docker_06

   容器(container)的定义和镜像(image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。容器 = 镜像 + 读写层。并且容器的定义并没有提及是否要运行容器。 

三、基本命令

1,操作docker镜像

以下[image]含义皆为:镜像+版本号,即可写作[image:tag],不写tag则会使用默认tag:latest

docker pull [image]    从仓库拉取/更新镜像

docker push [image]    推送镜像到仓库

docker images    查看本地所有镜像

docker search [image]    从仓库搜索相关镜像

docker rmi [image]    删除镜像

docker save [image] > xxxx.tar    保存镜像到文件

docker load < [image]    加载文件镜像到环境

docker history [image]    镜像操作历史

2,操作docker容器

docker run -itd --name cent -p 80:80 [image] /bin/bash    通过镜像创建并启动一个容器

  -i:交互式操作

  -t:终端

  -d:以deamon守护进程的方式运行

  --name:容器名称,可以不使用id号,用名称对容器进行操作

  -p:端口映射,本机端口:容器端口

  /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash

docker start [container]    启动容器

docker stop [container]    关闭容器

docker restart [container]    重启容器

docker exec -it [container] /bin/bash    连接到正在运行的容器

docker rm [container]    删除容器

docker ps -a    查看所有容器,不加-a为查看正在运行的容器

docker rm `ps -a -q `    删除所有容器

docker inspect [container]    查看容器配置信息

docker commit -m [comment] [container] imageName:tag     将容器保存为本地镜像

docker export [container] > xxxx.tar    保存容器到文件

docker import < xxxx.tar - xxxx:version   导入容器到环境,保存为当前系统下的镜像(xxxx:version)

docker load < xxxx.tar 导入镜像到环境

镜像导入和容器导入的区别:

1,docker save保存的是镜像(image),docker export保存的是容器(container)

2,容器导入 是将当前容器 变成一个新的镜像

3,镜像导入 是复制的过程

save 和 export区别:

1,save 保存镜像所有的信息-包含历史

2,export 只导出当前的信息

3,docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像

4,docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称

应用案例

脚本:init.sh

1 docker run -itd --name app -p 3306:3306 -p 8080:8080 app:v1.0 /bin/bash

脚本:exec.sh

1 docker exec -it app /bin/bash

脚本:start.sh

1 docker start app

脚本:stop.sh

1 docker stop app