一、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、数据库和后台服务)
3,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的整个生命周期有三部分组成:镜像(image)+容器(container)+仓库(repository)。容器是由镜像实例化而来,这和我们学习的面向对象的概念十分相似,我们可以把镜像看作类,把容器看作类实例化后的对象。镜像是文件, 容器是进程。 容器是基于镜像创建的, 即容器中的进程依赖于镜像中的文件, 这里的文件包括进程运行所需要的可执行文件, 依赖软件, 库文件, 配置文件等等。
1,docker镜像
镜像(Image)就是一堆只读层(read-only layer)的统一视角,存在于/var/lib/docker/aufs目录下。
2,docker容器
容器(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