上一篇讲解了Docker镜像的原理和常用命令。本文继续通过Apache官方镜像演示Docker容器相关的常用操作和命令。在我之前的Linux入门系列文章《Linux入门系列18--ApacheService1forWebServices》中,我演示了CentOS7下Apache服务的安装和使用。本次我们依然使用Apache官方镜像进行演示。通过这个案例,大家自己比较一下这两种方式的区别,从而更深入的了解Docker可以做什么以及Docker带来的好处。接下来,我们来演示如何创建、停止和删除容器。一、Docker容器简介容器是Docker中的另一个核心概念。容器是镜像的运行实例。Docker镜像是静态的。只有当容器从Docker镜像创建并运行时,容器中的程序才会运行,完成特定的功能。我们需要完成业务功能的程序运行在容器中。镜像本身是静态的只读文件,而容器有运行时需要的可写文件层,容器内??的应用进程在运行。通过下面的演示,你会更深刻地理解。2.Docker容器常用命令2.1Apache镜像准备我们后续的演示是基于DockerHub上官方提供的apache镜像。映像名称是httpd。该图像不包含php。该环境只能运行静态HTML页面。因此,如果你想用php运行一个动态网站,你需要选择一个PHP镜像。本文只是为了演示容器的相关操作,所以是静态页面。[root@docker~]#dockerpullhttpd:2.42.4:Pullingfromlibrary/httpd68ced04f60ab:Pullcomplete35d35f1e0dc9:Pullcomplete8a918bf0ae55:Pullcompleted7b9f2dbc195:Pullcompleted56c468bde81:PullcompleteDigest:sha256:946c54069130dbf136903fe658fe7d113bd8db8004de31282e20b262a3e106fbStatus:Downloadednewerimageforhttpd:2.4docker.io/library/httpd:2.4[root@docker~]#dockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZEhttpd2.4c5a012f9cf452天前165MB下载完成后可以看到httpd镜像大小为165M。它包含什么?羊毛布?文末,让我们一探究竟。2.2创建容器并在后台运行镜像下载完成后,需要通过dockerrun命令创建容器。语法:dockerrun[option]imagename[command][parameter]有很多选项,可以通过help命令查看。下面列出了最常用的选项。选项的作用--name指定容器的名称-d容器在后台运行,不在控制台打印消息-i表示--interactive,交互运行-tassignpseudo-terminal-p指定映射宿主机和容器端口之间,宿主机端口:容器中的端口-P指定宿主机和容器端口的映射,宿主机端口是随机指定的。-it参数和-d参数一般不会同时使用,分别代表两种不同的容器启动方式:交互式启动容器和daemon启动容器。所谓交互式启动,就是容器启动后直接进入容器,会自动分配一个伪终端执行容器中的各种命令;而daemon启动容器,容器启动后不需要进入容器,容器在后台运行,默默的提供服务。至于如何选择使用哪种方法,就看你是否需要进入容器了。如果要进入,请选择交互模式。如果只是想让容器在后台运行提供服务,那就选择daemon模式。接下来通过-d参数,创建一个基于httpd镜像的容器作为daemon在后台运行[root@docker~]#dockerrun-d--namemywebsit-p8888:80httpd:2.4783b46f5cddcc3ea919329a99f83a783da98bce4abce05ccc9b3f27fda859b09[root@docker~]#dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES783b46f5cddchttpd:2.4"httpd-foreground"6秒前Up4秒0.0.0.0:8888->80/tcpmywebsit[root@docker~]只需要做这一步,基于Apache的web环境搭建完成。这时候就可以通过浏览器访问刚刚在CentOS7上搭建的基于apahce的网站了。如果配置了防火墙,也可以在宿主机上访问。接下来就可以修改容器中website目录下的数据,替换成自己的网页。轻松搭建apacheweb静态网站方便吗?您甚至不需要配置任何环境。迁移也很方便。比如你想换个主机运行网站,只需要下载镜像运行即可。这就是docker的强大之处,还有很多更强大的功能,后面会慢慢展示。让我解释一下我当地的环境。您必须了解物理机、虚拟机和容器之间的关系。我的本地物理机系统是win10,上面安装了一个VMware虚拟机。在虚拟机中创建一个Centos7实例,然后在其中安装Docker,运行mywebsite容器。因为我本地没有安装Centos7,所以在虚拟机里虚拟了一个来演示。当然你也可以直接在windows上安装docker或者直接在本地centos上安装docker。外部访问是访问run容器中映射到的Centos7主机的8888端口,而不是mywebsite容器的80端口。特别注意:这里之所以使用-d来让容器作为守护进程在后台运行,是因为当一个容器没有被前台进程执行时,它会在创建容器后立即停止。所以可以尝试以交互方式创建容器,dockerrun-it--namemywebsit1-p8888:80httpd:2.4创建完成后,可以使用dockerps命令查看容器,使用dockerps-aCommand查看,你会发现容器创建后,短暂启动后立即停止,就是这个原因。2.3查看容器命令查看本地有哪些容器在运行,或者已经创建的容器可以通过dockerps命令语法dockerps[options]常用参数参数function-a--all查看所有容器,通过默认只显示正在运行的容器-l--latest,查看最近创建的容器-n显示最近创建的n个容器--no-trunc不截断显示情况:(1)查看正在运行的容器[root@docker~]#dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES783b46f5cddchttpd:2.4"httpd-foreground"4小时前Up4小时0.0.0.0:8888->80/tcpmywebsit[root@docker~]#可以看到只有刚才创建的mywebsit容器在跑步。2.4查看容器外的容器信息2.4.1查看容器日志命令语法dockerlogs[option]容器名称或id常用参数参数功能-f动态跟踪打印日志信息,一旦有新的日志会继续打印-t在每行日志前面打印出时间--tail指定显示行数案例(1)查看mywebsit日志,只显示2行[root@docker~]#dockerlogs-t--tail2mywebsit2020-02-29T03:09:57.654372509Z192.168.78.1--[29/Feb/2020:03:09:57+0000]“-”408-2020-02-29T03:09:57.854284777Z192.168.78.1--[29/Feb/2020:03:09:57+0000]"-"408-[root@docker~]#2.4.2查看容器中的进程命令语法dockertop案例(一)查看mywebsit里面的进程[root@docker~]#dockertopmywebsitUIDPIDPPIDCSTIMETTYTIMECMDroot36733655010:29pts/000:00:01httpd-DFOREGROUNDbin37083673010:29pts/000:00:00httpd-DFOREGROUND...省略部分输出该命令类似于Linuxtop命令。2.4.3查看容器内部详细信息语法dockerinspect容器名称或id案例(一)查看mywebsit容器内部信息[root@docker~]#dockerinspectmywebsit...省略输出不粘贴因为输出太多了。执行命令后,你会得到一个JSON字符串对象,详细描述了容器信息。该对象包含容器的详细信息,包括容器端口映射、挂载信息、卷信息、网络ip等信息。2.5退出容器命令如果进入容器,有两种退出方式:退出命令或者按快捷键:ctrl+p+q2.6进入容器并与之交互进入正在运行的容器并与命令行交互2.6.1dockerexec命令使用dockerexec命令进入容器或者不进入容器直接执行命令语法。dockerexec[option]containernameoridcommand[parameter...]选项类似于dockerrun命令,也有-itd等参数。使用该命令进入容器后,使用exit命令或快捷键退出容器后容器不会停止。案例(一)不进入容器直接执行命令[root@docker~]#dockerexec-itmywebsitpwd/usr/local/apache2[root@docker~]#这条命令的含义查看mywebsit中的当前目录容器,可以看到命令执行结束后我们并没有进入容器。pwd是linux命令,但是为什么可以在这里执行呢?原因是httpd镜像继承自debian基础镜像。众所周知,debian也是linux的发行版,所以容器具有debian的功能。简单的说,你可以把mywebsit容器想象成一个运行在docker上的小型linux系统。(2)进入容器执行命令[root@docker~]#dockerexec-itmywebsit/bin/bashroot@783b46f5cddc:/usr/local/apache2#pwd/usr/local/apache2root@783b46f5cddc:/usr/local/apache2#exitexit[root@docker~]#这个过程的作用和前面的case一样,只是进入容器,打印当前目录,退出容器,返回centos7主机。通过比较这两种情况,它们之间的区别应该很清楚。2.6.2dockerattach命令语法dockerattach[option]容器名称或id使用该命令重新进入容器,进入容器后,如果使用exit命令退出,容器将停止。2.7容器与宿主机之间的数据拷贝dockercp命令可以实现宿主机与宿主机之间的数据拷贝,即使容器停止也可以进行拷贝操作。语法dockercpcontainerid:containerpathhostpath案例(一)修改容器内首页内容第一:httpd镜像网站的目录为:/usr/local/apache2/htdocs/index.html第二:因为httpdmirror是基于debian生产的,不包含vi/vim等内部工具。再次强调:只是使用dockercp来演示宿主机和容器之间的文件相互拷贝。所以,我们把网页文件拷贝到宿主机上,然后修改,拷贝回容器网站目录,就达到了修改首页的目的。(后续讲解中也可以将网站目录映射到宿主机,通过数据卷的方式进行共享修改)[root@docker~]#dockercpmywebsit:/usr/local/apache2/htdocs/index.html/[root@docker~]#ll/index.html-rw-r--r--1rootroot45Jun122007/index.html[root@docker~]#echo"我的网站正在更新“>/索引。html[root@docker~]#cat/index.html我的网站正在更新[root@docker~]#dockercp/index.htmlmywebsit:/usr/local/apache2/htdocs/index.html[root@docker~]#再次在浏览器中查看网页,会发现已经修改了。2.8停止容器命令停止容器,可以使用stop和kill命令强制停止容器,stop会在一段时间后停止容器,这两个命令都可以指定容器停止前的等待时间。dockerstop|killcontaineridorcontainernamecase(1)stopcontainer[root@docker~]#dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES783b46f5cddchttpd:2.4"httpd-foreground"6小时前Up21分钟0.0.0.0:8888->80/tcpmywebsit[root@docker~]#dockerstopmywebsitmywebsit[root@docker~]#dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES[root@docker~]#2.9启动容器命令可以通过start或者restart或重启容器语法dockerstart|restartcontaineridorcontainername案例(1)启动一个停止的容器[root@docker~]#dockerps-aCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES783b46f5cddchttpd:2.4"httpd-foreground"6小时前退出(0)2分钟前mywebsit[root@docker~]#dockerstartmywebsitmywebsit[root@docker~]#dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES783b46f5cddchttpd:2.4"httpd-foreground"6小时前Up1.0第二个0.0.0:8888->80/tcpmywebsit[root@docker~]#可以看到刚刚停止的mywebsit容器处于exited状态,重启后又会运行。2.10删除容器命令语法dockerrm[option]容器名称或id常用option选项功能-f--forece,强制删除,容器运行时,只能强制删除-v--vomumes,删除数据卷案例(1)删除正在运行的容器[root@docker~]#dockerrmmywebsitErrorresponsefromdaemon:Youcannotremovearunningcontainer783b46f5cddcc3ea919329a99f83a783da98bce4abce05ccc9b83f97.Stopthecontainerbeforetryingremovalorforceremove[root@docker~]#dockerrm-fmywebsitmywebsit[root@docker~]#dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES[root@docker~]#可以看到当容器运行时无法删除,需要加上-f参数强制删除。(2)强制删除所有容器。它仅用于演示。它将删除所有容器,包括正在运行的容器和已停止的容器。[root@docker~]#dockerrm-f$(dockerps-aq)3d228a470c53[root@docker~]#dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES[root@docker~]#上面的删除语句也可以写给:dockerps-a-q|xargsdockerrm3.窥探容器内部上面基于httpd镜像创建了一个容器,演示了容器的各种操作。接下来通过centos镜像研究镜像的内部结构和原理[root@docker~]#dockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZEcentoslatest470671670cac6周前237MB如果你本地没有centos,先用dockerpull命令下载到本地,然后我们用它创建一个名为mycentos的容器,然后进入容器查看结构[root@docker~]#dockerrun-it--namemycentoscentos[root@bda9ff3abfd9/]#lsbinetcliblost+foundmntprocrunsrvtmpvardevhomelib64mediaoptrootsbinsysusr[root@bda9ff3abfd9/]#pwd/[root@bda9ff3abfd9/]#cat/etc/redhat-releaseCentOSLinux发行版8.1.1911(Core)[root@bda9ff3abfd9/]#进入容器后,我们可以看到其实运行的是一个centos系统,在里面可以执行各种centos命令,还可以查看内核版本。如果你展开想象,很容易想到镜像其实就是把各种操作系统环境和我们需要运行的软件包打包,然后上传到仓库,需要的时候直接拉取,运行run命令创建一个容器。这正是我们在前两篇文章中反复提到的。如果你现在回头再看之前的文章,应该会有更深刻的理解。这篇文章演示了容器相关的操作命令后,docker的三要素仓库还是缺的。下一篇文章将讲解仓库相关的理论和操作,敬请期待。
