Docker虚拟化
# 什么是Docker?
Docker是一个开源的应用容器引擎,它让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到安装了任何 Linux 发行版本的机器上。Docker基于LXC来实现类似VM的功能,可以在更有限的硬件资源上提供给用户更多的计算资源。与同VM等虚拟化的方式不同,LXC不属于全虚拟化、部分虚拟化或半虚拟化中的任何一个分类,而是一个操作系统级虚拟化。
Docker是直接运行在宿主操作系统之上的一个容器,使用沙箱机制完全虚拟出一个完整的操作,容器之间不会有任何接口,从而让容器与宿主机之间、容器与容器之间隔离的更加彻底。每个容器会有自己的权限管理,独立的网络与存储栈,及自己的资源管理能,使同一台宿主机上可以友好的共存多个容器。
Docker借助Linux的内核特性,如:控制组(Control Group)、命名空间(Namespace)等,并直接调用操作系统的系统调用接口。从而降低每个容器的系统开销,并实现降低容器复杂度、启动快、资源占用小等特征。
# Docker能干什么?
- 简化配置
这是Docker公司宣传的Docker的主要使用场景。虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台(软件、系统),Docker在降低额外开销的情况下提供了同样的功能。它能让你将运行环境和配置放在代码中然后部署,同一个Docker的配置可以在不同的环境中使用,这样就降低了硬件要求和应用环境之间耦合度。
- 代码流水线(Code Pipeline)管理
前一个场景对于管理代码的流水线起到了很大的帮助。代码从开发者的机器到最终在生产环境上的部署,需要经过很多的中间环境。而每一个中间环境都有自己微小的差别,Docker给应用提供了一个从开发到上线均一致的环境,让代码的流水线变得简单不少。
- 提高开发效率
这就带来了一些额外的好处:Docker能提升开发者的开发效率。详细一点的例子,可以参考Aater在DevOpsDays Austin 2014大会或者是DockerCon上的演讲。
不同的开发环境中,我们都想把两件事做好。一是我们想让开发环境尽量贴近生产环境,二是我们想快速搭建开发环境。
理想状态中,要达到第一个目标,我们需要将每一个服务都跑在独立的虚拟机中以便监控生产环境中服务的运行状态。然而,我们却不想每次都需要网络连接,每次重新编译的时候远程连接上去特别麻烦。这就是Docker做的特别好的地方,开发环境的机器通常内存比较小,之前使用虚拟的时候,我们经常需要为开发环境的机器加内存,而现在Docker可以轻易的让几十个服务在Docker中跑起来。
- 隔离应用
有很多种原因会让你选择在一个机器上运行不同的应用,比如之前提到的提高开发效率的场景等。
我们经常需要考虑两点,一是因为要降低成本而进行服务器整合,二是将一个整体式的应用拆分成松耦合的单个服务(译者注:微服务架构)。如果你想了解为什么松耦合的应用这么重要,请参考Steve Yege的这篇论文,文中将Google和亚马逊做了比较。
-
整合服务器 正如通过虚拟机来整合多个应用,Docker隔离应用的能力使得Docker可以整合多个服务器以降低成本。由于没有多个操作系统的内存占用,以及能在多个实例之间共享没有使用的内存,Docker可以比虚拟机提供更好的服务器整合解决方案。
-
调适能力
Docker提供了很多的工具,这些工具不一定只是针对容器,但是却适用于容器。它们提供了很多的功能,包括可以为容器设置检查点、设置版本和查看两个容器之间的差别,这些特性可以帮助调试Bug。你可以在《Docker拯救世界》的文章中找到这一点的例证。
- 多租户
另外一个Docker有意思的使用场景是在多租户的应用中,它可以避免关键应用的重写。我们一个特别的关于这个场景的例子是为IoT(物联网)的应用开发一个快速、易用的多租户环境。这种多租户的基本代码非常复杂,很难处理,重新规划这样一个应用不但消耗时间,也浪费金钱。
使用Docker,可以为每一个租户的应用层的多个实例创建隔离的环境,这不仅简单而且成本低廉,当然这一切得益于Docker环境的启动速度和其高效的diff命令。
- 快速部署
在虚拟机之前,引入新的硬件资源需要消耗几天的时间。Docker的虚拟化技术将这个时间降到了几分钟,Docker只是创建一个容器进程而无需启动操作系统,这个过程只需要秒级的时间。这正是Google和Facebook都看重的特性。
你可以在数据中心创建销毁资源而无需担心重新启动带来的开销。通常数据中心的资源利用率只有30%,通过使用Docker并进行有效的资源分配可以提高资源的利用率。
# Docker和虚拟机的区别?
标签:容器,虚拟化,宿主机,常用命令,镜像,docker,Docker From: https://www.cnblogs.com/chillymint/p/17138720.html虚拟机Virtual Machine与容器化技术(代表Docker)都是虚拟化技术,两者的区别在于虚拟化的程度不同。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
docker常用命令 //
docker images:列出本地主机上的镜像/拉取镜像
docker rmi hello-world:删除镜像
docker bulid:通过创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。与编译镜像所需的包一般在同级
再通过docker build -t <name>:<version> . 构建镜像
参数说明:
-t
:指定要创建的目标镜像名.
:Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
//**
将docker容器保存为tar包1、docker commit <容器id> <镜像名>:<tag> ---- 将容器保存成镜像
保存后 docker images 便可以看到镜像
2、docker save -o <tar包名>.tar <镜像名>:<tag> ---- 将镜像保存为.tar文件,默认保存在当前目录
从tar包导入镜像
1、docker load -i <tar包名>.tar ---- 从 tar 包导入镜像
导入镜像后,通过 docker images 便可看到导入的镜像。
2、docker run -itd -p <本地端口>:<容器端口> <镜像名>:<tag> ---- 通过镜像起容器
**//docker stop 容器id:停止容器
docker restart 容器id:重启容器
docker rm -f 容器id:删除容器
docker exec -it 容器id /bin/bash 进入容器内部
docker logs -f 容器id:查看容器日志
docker ps -a :查看容器
docker pull xxx:拉取镜像
docker run -d --restart=unless-stopped -p 8090:8888 -p 8848:8848 -p 9210:9210 -v /opt/key:/data/persist-data/kms --name=foxit foxit-service:v2.0
//启动容器; -d -p
- -P :是容器内部端口随机映射到主机的端口。
- -p : 是容器内部端口绑定到指定的主机端口。
-v 宿主机目录挂载到容器目录
-d:参数指定 Docker 网络类型,有 bridge、overlay。
*复制并移动文件到该目录下
cp -r a.tar.gz /data
* 查看改动时间
cd /tmp/key
stat time
uptime
*查看容器状态
docker inspect foxit
*容器内文件拷贝到宿主机目录(宿主机执行)
docker cp 72d6dabed0bb:/data/aa/logs/aa.log /opt
*宿主机拷贝到容器目录(宿主机执行)
docker cp /opt/test.js testtomcat:/usr/local/tomcat/webapps/test/js
*查看日志最后一千行 并且打印到同级文件夹中
tail -f -n 1000 gamma-convert-std.log > a.txt
*ll命令时间显示不明显休整,永久生效
sudo echo "export TIME_STYLE='+%Y-%m-%d %H:%M:%S'" >> /etc/profile && source /etc/profile