您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > docker经典入门教程
转载:几个月以前,红帽(RedHat)宣布了在Docker技术上和dotCloud建立合作关系。在那时候,我并没有时间去学习关于Docker的知识,所以在今天,趁着这个30天的挑战,我决定去学习一下Docker究竟是怎样的。这篇博文并不是说以后怎么在OpenShift上用Docker的。请阅读由MikeMcGrath撰写的关于OpenShift和Docker的技术思考。也可以看看这个Stackoverflow的问题,了解一下Docker和OpenShift的差别。什么是Docker?Docker提供了一个可以运行你的应用程序的封套(envelope),或者说容器。它原本是dotCloud启动的一个业余项目,并在前些时候开源了。它吸引了大量的关注和讨论,导致dotCloud把它重命名到DockerInc。它最初是用Go语言编写的,它就相当于是加在LXC(LinuXContainers,linux容器)上的管道,允许开发者在更高层次的概念上工作。Docker扩展了Linux容器(LinuxContainers),或着说LXC,通过一个高层次的API为进程单独提供了一个轻量级的虚拟环境。Docker利用了LXC,cgroups和Linux自己的内核。和传统的虚拟机不同的是,一个Docker容器并不包含一个单独的操作系统,而是基于已有的基础设施中操作系统提供的功能来运行的。这里有一个Stackoverflow的答案,里面非常详细清晰地描述了所有Docker不同于纯粹的LXC的功能特性Docker会像一个可移植的容器引擎那样工作。它把应用程序及所有程序的依赖环境打包到一个虚拟容器中,这个虚拟容器可以运行在任何一种Linux服务器上。这大大地提高了程序运行的灵活性和可移植性,无论需不需要许可、是在公共云还是私密云、是不是裸机环境等等。Docker由下面这些组成:1.Docker服务器守护程序(serverdaemon),用于管理所有的容器。2.Docker命令行客户端,用于控制服务器守护程序。3.Docker镜像:查找和浏览docker容器镜像。它也访问这里得到:我为什么要关心这些?Docker之所以有用,是因为把代码从一个机器迁移到另一个机器经常是困难的。它尝试去使得软件迁移的过程变得更加可信和自动化。Docker容器可以移植到所有支持运行Docker的操作系统上。可以看这篇文章了解更多:howtheFedoraProjectisembracingDocker但是我已经在使用虚拟机(VMs)了到现在为止,要把程序可靠地移植的唯一选择是虚拟机(VirtualMachines,VMs)。虚拟机现在已经很常见了,但虚拟机是非常低级,它提供的是完整的操作系统环境。虚拟机的问题是,迁移的时候太大了。它们包含了大量类似硬件驱动、虚拟处理器、网络接口等等并不需要的信息。虚拟机也需要比较长时间的启动,同时也会消耗大量的内存、CPU资源。Docker相比起来就非常轻量级了。运行起来就和一个常规程序差不多。这个容器不仅仅运行快,创建一个镜像和制作文件系统快照也很快。它可以在EC2,RackSpaceVMs那样的虚拟环境中运行。事实上,在Mac和Windows系统上使用Docker的更好方式是使用Vagrant。Docker的初衷其实是发挥类似VM的作用,但它启动得更快和需要更少的资源。它就像Vagrant一样吗?我遇到的一个疑问是,我应该用Vagrant还是Docker去为我的下一个项目创建沙箱环境?答案再一次是一样的。Docker比起Vagrant来说,运行起来会更加省资源。Vagrant提供的环境其实是基于VirtualBox提供的虚拟机。可以阅读Stackoverflow的这个回答了解更多。噢,不是!另一个应用程序打包系统当第一次读到Docker打包应用程序时,我困惑了。我们为什么需要再多一个应用打包系统(packagingsystem)?我早已经把我的Java程序打包成JAR或WAR了。在花了些时间阅读了关于Docker的资料后,我明白了Docker应用包(applicationpackage)的含义。Docker就是虚拟机和你的像WAR或JAR那样的应用包之间的桥梁。一方面来说,虚拟机是非常重量级的(耗资源),因为移植时要附带些不需要的东西。另一方面来说,应用代码包(theapplicationcodepackages)是非常的轻量的,并没有附带足够可靠地运行起来的信息。Docker很好地平衡了这两方面。在Docker中,应用程序包(applicationpackage)意味着一个包含了应用程序代码和所需部署环境的包。例如,在Java中我们一般把我们的Web应用程序打包在一个WAR文件中。这个WAR文件是一个非常简约的软件包,它仅仅包含了应用程序的代码。但应用程序需要特定部署的环境去高效地运行起来。有时候部署的环境和开发时的环境是不同的。例如开发者使用Java7开发程序,但部署时的环境是在OpenJDKJava6中;又或者是在Mac上开发的,但在RHEL上部署。情况也有可能是:有一些系统库(systemlibraries)在开发环境和模拟环境(stagingenvironment)中,在不同的应用程序上有不同的效果。Docker通过不仅仅打包应用程序,也打包应用程序的依赖环境来解决这个问题。开始使用Docker在Fedora机器上使用这篇博文中的指令安装Docker$vagrantup$vagrantssh然后安装DockerFedora镜像:$sudodockerpullmattdm/fedora上面的命令会从上下载DockerFedora镜像。安装了DockerFedora镜像后,我们可以使用下面命令列出所有的镜像:$sudodockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZEshekhargulati/node_image_007lateste12b3054d98150minutesago470.3MB(virtual601.8MB)mattdm/fedora12.048dbd9e392a967monthsago131.5MB(virtual131.5MB)上面列表中第一个镜像就是我以前创建的。它打包了NodeJS及ExpressFremework。第二个镜像就是存储的DockerFedora镜像了。现在,我们在Docker容器内运行一个脚本:$sudodockerrun-t-i-p3000mattdm/fedora/bin/bash在运行完上面的命令后,我们就在Docker的容器里面了。我们可以通过ls命令列出所有的命令。现在我们创建下面的目录结构/home/shekhar/dev:$mkdir-phome/shekhar/dev$cdhome/shekhar/dev现在,我会安装NodeJS。运行下面的命令去在FedoraDocker镜像上安装Node:$sudoyuminstallnpm接着,我们安装Express框架:$npminstallexpress-gExpress框架安装后,我们创建一个新的Express程序,然后运行它:$expressmyapp$cdmyapp$npminstall$nodeapp.js上面会在3000端口启动NodeJSExpress程序。现在打开另一个命令行标签,列出所有的Docker进程:$sudodockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES4a5715a915e5mattdm/fedora/bin/bash5minutesagoUp5minutes0.0.0.0:49157-3000/tcpred_duck你会注意到,3000端口和本机上的49157绑定了。你可以通过下面所示的curl命令测试Express应用:$curl0.0.0.0:49157!DOCTYPEhtmlhtmlheadtitleExpress/titlelinkrel=stylesheethref=/stylesheets/style.css/headbodyh1Express/h1pWelcometoExpress/p/body/html现在commit镜像,然后push到Docker镜像注册表(registry)。在你做这步之前,你必须通过去注册一个Docker注册表。$sudodockercommit4a5715a915e5shekhargulati/node_image_007$sudodockerpushshekhargulati/node_image_007请使用你自己的用户名和镜像名。所以,我的第一个镜像已经上传到Docker注册表上面了:你可以使用pull命令下载这个镜像:$dockerpullshekhargulati/node_image_007
本文标题:docker经典入门教程
链接地址:https://www.777doc.com/doc-6270779 .html