摘要:容器技术起源于Linux,是一种内核虚拟化技术,提供轻量级的虚拟化,以便隔离进程和资源。尽管容器技术已经出现很久,却是随着Docker的出现而变得广为人知。

容器技术起源于Linux,是一种内核虚拟化技术,提供轻量级的虚拟化,以便隔离进程和资源。尽管容器技术已经出现很久,却是随着Docker的出现而变得广为人知。Docker是第一个使容器能在不同机器之间移植的系统。它不仅简化了打包应用的流程,也简化了打包应用的库和依赖,甚至整个操作系统的文件系统能被打包成一个简单的可移植的包,这个包可以被用来在任何其他运行Docker的机器上使用。

容器和虚拟机具有相似的资源隔离和分配方式,容器虚拟化了操作系统而不是硬件,更加便携和高效。

图1 容器 vs 虚拟机

相比于使用虚拟机,容器有如下优点:

  • 更高效的利用系统资源

由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,容器对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。

  • 更快速的启动时间

传统的虚拟机技术启动应用服务往往需要数分钟,而Docker容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间,大大节约了开发、测试、部署的时间。

  • 一致的运行环境

开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些问题并未在开发过程中被发现。而Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性。

  • 更轻松的迁移

由于Docker确保了执行环境的一致性,使得应用的迁移更加容易。Docker可以在很多平台上运行,无论是物理机、虚拟机,其运行结果是一致的。因此可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。

  • 更轻松的维护和扩展

Docker使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker团队同各个开源项目团队一起维护了大批高质量的官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。

Docker容器典型使用流程

Docker容器有如下三个主要概念:

  • 镜像:Docker镜像里包含了已打包的应用程序及其所依赖的环境。它包含应用程序可用的文件系统和其他元数据,如镜像运行时的可执行文件路径。
  • 镜像仓库:Docker镜像仓库用于存放Docker镜像,以及促进不同人和不同电脑之间共享这些镜像。当编译镜像时,要么可以在编译它的电脑上运行,要么可以先上传镜像到一个镜像仓库,然后下载到另外一台电脑上并运行它。某些仓库是公开的,允许所有人从中拉取镜像,同时也有一些是私有的,仅部分人和机器可接入。
  • 容器:Docker容器通常是一个Linux容器,它基于Docker镜像被创建。一个运行中的容器是一个运行在Docker主机上的进程,但它和主机,以及所有运行在主机上的其他进程都是隔离的。这个进程也是资源受限的,意味着它只能访问和使用分配给它的资源(CPU、内存等)。

典型的使用流程如图2所示:

图2 Docker容器典型使用流程

(1)首先开发者在开发环境机器上开发应用并制作镜像。

Docker执行命令,构建镜像并存储在机器上。

(2)开发者发送上传镜像命令。

Docker收到命令后,将本地镜像上传到镜像仓库。

(3)开发者向生产环境机器发送运行镜像命令。

生产环境机器收到命令后,Docker会从镜像仓库拉取镜像到机器上,然后基于镜像运行容器。

使用示例

下面使用Docker将基于Nginx镜像打包一个容器镜像,并基于容器镜像运行应用,然后推送到容器镜像仓库。

安装Docker

Docker几乎支持在所有操作系统上安装,用户可以根据需要选择要安装的Docker版本。

在Linux操作系统下,可以使用如下命令快速安装Docker。

curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh

说明:

CentOS 8.0操作系统使用上述脚本安装Docker会出现问题,建议使用如下命令安装较低版本Docker。

wget -O /etc/yum.repos.d/docker-ce.repo https://repo.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo sudo

sed -i 's+download.docker.com+repo.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

yum install docker-ce-18.06.3.ce -y

systemctl restart docker

Docker打包镜像

Docker提供了一种便捷的描述应用打包的方式,叫做Dockerfile,如下所示:

# 使用官方提供的Nginx镜像作为基础镜像
FROM nginx:alpine# 执行一条命令修改Nginx镜像index.html的内容
RUN echo "hello world" > /usr/share/nginx/html/index.html# 允许外界访问容器的80端口
EXPOSE 80

执行docker build命令打包镜像。

docker build -t hello .

其中-t表示给镜像加一个标签,也就是给镜像取名,这里镜像名为hello。. 表示在当前目录下执行该打包命令。

执行docker images命令查看镜像,可以看到hello镜像已经创建成功。您还可以看到一个Nginx镜像,这个镜像是从镜像仓库下载下来的,作为hello镜像的基础镜像使用。

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello               latest              d120ec16dcea        17 minutes ago      158MB
nginx               alpine              eeb27ee6b893        2 months ago        148MB

本地运行容器镜像

有了镜像后,您可以在本地执行docker run命令运行容器镜像。

# docker run -p 8080:80 hello

docker run命令会启动一个容器,命令中-p是将本地机器的8080端口映射到容器的80端口,即本地机器的8080端口的流量会映射到容器的80端口,当您在本地机器访问 http://127.0.0.1:8080时,就会访问到容器中,此时浏览器中返回的内容应该就是“hello world”。

把镜像推送到镜像仓库

华为云提供了容器镜像服务SWR,您也可以将镜像上传到SWR,下面演示如何将镜像推送到SWR。详细的方法请参见客户端上传镜像,本文档后续的示例中将主要使用SWR作为示例。

首先登录SWR控制台,在左侧选择“我的镜像”,然后单击右侧“客户端上传镜像”,在弹出的窗口中单击“生成临时登录指令”,然后复制该指令在本地机器上执行,登录到SWR镜像仓库。

上传镜像前需要给镜像取一个完整的名称,如下所示:

# docker tag hello swr.cn-east-3.myhuaweicloud.com/container/hello:v1

这里swr.cn-east-3.myhuaweicloud.com是仓库地址,每个华为云区域的地址不同,v1则是hello镜像分配的版本号。

  • swr.cn-east-3.myhuaweicloud.com是仓库地址,每个华为云区域的地址不同。
  • container是组织名,组织一般在SWR中创建,如果没有创建则首次上传的时候会自动创建,组织名在单个区域内全局唯一,需要选择合适的组织名称。
  • v1则是hello镜像分配的版本号。

然后执行docker push命令就可以将镜像上传到SWR。

# docker push swr.cn-east-3.myhuaweicloud.com/container/hello:v1

当需要使用该镜像时,使用docker pull命令拉取(下载)该命令即可。

# docker pull swr.cn-east-3.myhuaweicloud.com/container/hello:v1

点击关注,第一时间了解华为云新鲜技术~

容器、Docker、虚拟机,别再傻傻分不清相关推荐

  1. 国防大学计算机学院,国防大学和国防科技大学是同一所学校吗?很多人傻傻都分不清!...

    国防大学和国防科技大学,这两所大学名字相近,极易混淆,在很多网站搜索"国防大学录取分数线",出来的全是国防科技大学的的高考录取分数线,所以给广大考生带来了很大困惑,难道国防大学和国 ...

  2. Python numpy.abs和abs函数别再傻傻分不清了

    Python numpy.abs和abs别再傻傻分不清了 说在最前 先看示例程序-abs()函数 再看示例程序-numpy.abs()函数 观察两个程序的结果 分析解释 拓展 总结 说在最前 不知道小 ...

  3. 别再傻傻分不清:工业物联网关与PLC采集网关的区别了

    工业物联网关与PLC采集网关的区别 工业物联网网关是指支持多种协议转换且可以接入工业物联云平台的网关,比如下行支持DLT645.Modbus协议,上行支持Thingsboard.Azure.AWS.华 ...

  4. wifi是计算机网络技术吗,WIFI就是WLAN吗,二者有啥关系与区别?别再傻傻分不清楚了...

    原标题:WIFI就是WLAN吗,二者有啥关系与区别?别再傻傻分不清楚了 现在大家上网或许都会使用手机流量或者是WiFi,而伴随着我们大多数人上网频率越来越频繁,手机所使用的流量可能就会越来越多,而这就 ...

  5. 计算机及网络系统联调和试运行,别再傻傻分不清试运行、试运营和正式运营的区别了!...

    原标题:别再傻傻分不清试运行.试运营和正式运营的区别了! 随着轨道交通线路的不断建设与发展,不同线路试运行.试运营诸如此类字眼不断进入大众眼球.除一些在相关行业工作的小伙伴们比较清楚试运行.试运营以及 ...

  6. 串行、并行、并发,别再傻傻分不清了!

    开足码力,码动人生,微信搜索[ 程序员大帝 ],关注这个一言不合就开车的的代码界老司机 本文 GitHub上已经收录 https://github.com/BeKingCoding/JavaKing ...

  7. 云计算、大数据、人工智能傻傻分不清楚?本文详解这三者的关系

    云计算.大数据.人工智能傻傻分不清楚?本文详解这三者的关系 提示: 今天跟大家讲讲云计算.大数据和人工智能.这三个词现在非常火,并且它们之间好像互相有关系. 一般谈云计算的时候会提到大数据.谈人工智能 ...

  8. 2运行内存多大_智能设备中的内存与容量为何傻傻分不清?它们的区别是什么?...

    在日常生活中,很多时候会把某些电子产品的容量说成内存,或者把内存说成了容量.比如有人问:"这个手机的内存多大?"或许会有这样回答的:"内存是256G."这种问答 ...

  9. CIR,CBS,EBS,PIR,PBS傻傻分不清楚?

    CIR,CBS,EBS,PIR,PBS傻傻分不清楚?看这里!--揭秘令牌桶 概述 春暖花开的时候,大家都开着汽车外出旅游欣赏美丽的风景,却被堵在高速公路上,你是否为此感到痛苦?但如果有一种机制可以评估 ...

最新文章

  1. Eclipse中在线安装spring-tool-suite插件
  2. C#进阶系列——WebApi 异常处理解决方案
  3. Java中的工厂方法模式
  4. 互联网日报 | 爱奇艺会员宣布11月13日起涨价;淘宝特价版月活用户破7000万;我国成功发射一箭十三星...
  5. python教程推荐-关于推荐系统的详细介绍
  6. 在页面中直接设计TreeView的节点而不使用Web.Sitemap文件在运行时出错信息
  7. 使用Mac命令别名,提升工作效率
  8. 关于visual studio 2005的中文版下载(最新详细下载点)
  9. 什么叫大数据 大数据的概念
  10. 使用MapReduce实现k-means算法
  11. DLL中无法定位程序输入点inflateReset2于动态链接库
  12. 高通sdx12 audio架构
  13. vs2017 html插件推荐,收藏!推荐12个超实用的Visual Studio插件
  14. JVM_12 垃圾回收3-垃圾回收器
  15. Oracle 中的 TO_DATE 和 TO_CHAR 函数 日期处理
  16. 关于两个RS485模块的线路连接问题
  17. android 获取当前渠道,Android多渠道打包时获取当前渠道的方法
  18. android中的评分条(ratingBar)
  19. 迅雷近几年笔试题及其分析
  20. 拓展实践:系统函数的调用

热门文章

  1. 客户端脚本selectivizr,PIE,Respond.js
  2. es6 模块的整体加载
  3. ROS笔记(17) Gazebo
  4. ROS笔记(4) RoboWare Studio 的安装
  5. dsd语言证书c1是什么,DSD一级德语语言证书考试在嘉兴高级中学举行
  6. 中telnet_web开发中的编码问题
  7. 计算机操作系统》第06章在线测试,《计算机操作系统》第01章在线测试
  8. 第十七节、图像描述符匹配算法、以及目标匹配
  9. Java通过JDBC操作Hive
  10. Map 遍历的几种方法