动力节点Docker入门到进阶(四)Docker容器

分享一下最近正在b站上看动力节点的docker课程,整理了相关学习笔记,会按照学习进度慢慢更新的,加油

4 Docker容器

4.1 容器基础

4.1.1 容器启动流程


通过docker run命令可以启动运行一个容器。该命令在执行时首先会在本地查找指定的镜像,如果找到了,则直接启动,否则会到镜像中心查找。如果镜像中心存在该镜像,则会下载到本地并启动,如果镜像中心也没有,则直接报错。
如果再与多架构镜像原理相整合,则就形成了完整的容器启动流程。

4.1.2 容器运行本质

Docker容器存在的意义就是为了运行容器中的应用,对外提供服务,所以启动容器的目的就是启动运行该容器中的应用。容器中的应用运行完毕后,容器就会自动终止。所以,如果不想让容器启动后立即终止运行,则就需要使容器应用不能立即结束。通常采用的方式有两种,使应用处于与用户交互的状态或等待状态。

4.2 容器创建并启动命令

对于容器的运行,有两种运行模式:交互模式与分离模式。下面通过运行ubuntu与tomcat来演示这两种运行模式的不同。

4.2.1 以交互模式运行ubuntu

  • –name指定当前容器名称为myubuntu

  • -it指定以交互模式运行容器,且为容器分配一个伪终端。

  • 后面的/bin/bash用于指定容器启动后需要运行的命令为/bin下的bash命令,而该命令会启动一个bash终端。

    我们在这里运行了一个ubuntu系统的容器,并为其取名为myubuntu。另外我们可以注意到,命令行前面提示部分内容发生了变化:原来显示的是[root@docker ~],而现在变为了root@de0940ad17dd:/#,这个就是docker生成的伪客户端,而数字de0940ad17dd表示的是docker容器的ID。
    此时就可以通过Linux命令对该ubuntu系统进行操作了。不过,由于容器中的该系统是一个精简的系统,有很多常用命令是没有安装的,所以如果要使用这些命令,就需要安装。

4.2.2 以交互模式运行tomcat


通过ls –l命令可查看tomcat根目录下的文件。注意,不支持ll命令。

下面也是以交互模式运行tomcat容器,不同的是,该命令后没有/bin/bash,此时会真正启动tomcat。

-p用于指定端口映射,格式为 暴露给宿主机的端口:容器中应用的端口
回车后会发现tomcat已启动,且tomcat的日志输出占居了命令行。

此时在Window的浏览器中通过8081端口可以访问到tomcat。

4.2.3 以分离模式运行tomcat

下面是以分离模式运行的tomcat,返回的是容器ID。

-d选项表示以分离模式(detached mode)运行容器,即命令在后台运行,命令的运行与宿主机的运行分离开来。

可以看到,已经启动了三个tomcat容器。且无论是IPv4还是IPv6,端口映射关系都很明确。此时通过window系统中的浏览器访问docker主机中映射的三个tomcat端口号就可以访问到tomcat。
通过该访问可以知道为什么要做端口映射的原因了:为了使相同的客户端主机可以访问同一宿主机上相同端口号的不同容器。


4.2.4 以分离模式运行ubuntu


该运行方式存在一个问题:容器使用命令启动了,但通过docker ps命令查看不到。
再通过docker ps –a命令可以发现该容器,只不过其已经退出。docker ps查看的就是up状态的容器,由于其已经退出,所以docker ps查看不到。

4.3 容器创建命令

docker create命令仅创建容器但不启动,其用法与docker run非常相似。注意,其没有-d选项。

4.4 容器退出命令

退出容器指的是退出以交互模式运行的容器。分为两种退出方式:

4.4.1 退出并停止容器exit


在容器命令行中再运行exit命令后,通过docker ps –a可以查看到该容器已经退出了。

4.4.2 退出不停止容器Ctrl + P + Q

注:先按下Ctrl + P,然后再按下Q。

使用快捷键Ctrl + P + Q能够返回到了宿主机命令行。
再通过docker ps可以查看到其是UP状态,说明容器退出了但并没有停止。

4.5 容器状态查看命令

4.5.1 查看所有正在运行的容器

docker ps命令本身查看的是所有处于运行状态的容器信息。

4.5.2 查看所有容器

docker ps –a用于查看所有容器,无论是否处于运行状态。

4.5.3 查看所有容器的ID

docker ps –q用于查看所有处于运行状态的容器的ID。

docker ps –qa用于查看所有容器的ID。

4.5.4 查看最后创建的容器

docker ps –l用于查看最后创建的容器,无论该容器是否处于运行状态。

4.5.5 查看最后创建的n个容器

docker ps –n 3用于查看最后创建的指定个数的容器,无论该容器是否处于运行状态。

4.6 容器再进命令

当我们以分离模式运行了一个容器,或以交互模式运行了一个容器,但容器内部执行的命令占用了交互命令行,而此时我们又想进入到容器中对容器内部进行一些操作,此时就需要用到exec/attach命令了。
注意,它们只能对正在运行的容器进行操作。

4.6.1 新建进程进入容器exec

该命令也用于进入到了运行状态的容器中。

对于该命令的测试,首先以分离模式运行tomcat8容器。此时想进入该mytomcat容器,就可以使用exec命令。

此时执行exit命令退出容器。
此时查看正在运行的容器,发现mytomcat容器并未退出。说明exec命令会创建一个新的独立于容器的进程,而exit命令仅用于结束该新建进程。
同样,以交互模式运行tomcat容器,仍是无法使用命令行的,因为tomcat日志输出占用了命令行。

此时若要使用命令行,可另外再打开一个新的Session窗口,然后再执行exec命令,便可进入容器,打开容器中的命令行。

4.6.2 外部操作容器exec

前两种都是在进入到容器后才对容器进行操作的,我们也可以不进入容器直接对容器内部进行操作。例如仅想查看tomcat容器中工作目录中所包含的文件,直接在exec命令后紧跟要执行的命令即可直接看到其结果。

4.6.3 容器附加标准输入


对于该命令的测试,首先以交互方式运行一个ubuntu容器,然后使用Ctrl + P + Q命令退出但不停止容器。

然后使用attach命令进入容器命令行。此时,再使用exit命令退出容器。然后会发现容器也停止了。由于exit命令的作用是,结束当前进程,所以说明attach命令并没有另外再创建新的进程,而是使用了容器进程,exit命令退出了当前进程,也就退出了容器。

4.6.4 容器附加标准输出

启动一个tomcat容器与其中的tomcat,指定容器名称为mytom。然后通过docker attach命令则可看到如下场景:占用了命令行,且没有任何输出,即使通过浏览器访问该tomcat也没有任何输出。此时的mytom容器已经附加了标准输出,只不过,其输出的是tomcat的启停日志信息。

通过Ctrl + C可结束tomcat,此时可看到停止日志显示了出来。但由于此时的tomcat已经停止,tomcat容器已经退出,所以该docker attach命令也就随之结束了。

4.7 容器内进程查看命令

docker top命令用于查看指定的正在运行的容器中正在运行的进程详情,这个详情包括当前这个进程正在运行的命令。

当然,如果容器中运行的进程较多,也可以通过grep对结果进行过滤。

4.8 容器日志查看命令

docker logs [容器]可以查看指定容器中应用的运行日志,无论该容器是运行还是停止状态。

4.8.1 查看所有日志

docker logs查看的是所有容器中应用的运行日志。这个日志对于不同的容器来说,其日志内容是不同的。由docker run 命令的[command]决定(如果没有则由Dockerfile中的CMD指令决定)。

对启动了tomcat的tomcat容器来说,这个日志是tomcat启停日志。

对于没有启动tomcat的tomcat容器来说,这个日志是/bin/bash的运行历史记录。

对于ubuntu容器来说,这个日志是/bin/bash的运行历史记录。

4.8.2 查看最后的日志

通过添加选项-n或–tail可以指定要显示的最后几条日志。

4.8.3 查看指定时间内的日志

通过添加选项–since可以指定要显示自从指定时间以来的日志。这个时间可以是一个绝对时间,也可以是一个相对时长。
下面使用的是绝对时间:显示自从2022年8月1日后产生日志的最后3条。

下面使用的是相对时长:显示自从30分钟之前产生日志中的最后3条。其中m表示分,可以使用s表示秒,h表示小时。

4.8.4 查看指定时间外的日志

通过添加选项–until可以指定要显示截止到指定时间之前的日志。这个时间可以是一个绝对时间,也可以是一个相对时长。
下面使用的是绝对时间:显示截止到2022年8月8日前产生日志的最后3条。

下面使用的是相对时长:显示截止到5分钟之前产生日志中的最后3条。

4.8.5 查看日志时间戳

如果要查看某日志的详细时间戳,可以使用-t选项。下面的命令查看的是最后3条日志的时间戳,并与不添加-t的输出进行了对比。

4.8.6 查看动态日志

通过添加选项-f可以查看运行中容器的动态日志。

以上命令用于查看mytomcat的最后三条动态日志。其会占用命令行,一直等待日志的输出。

4.9 容器启停命令

4.9.1 启动start

通过docker start命令可以启动已经停止的指定容器,这个容器可以通过容器名称指定,也可以通过容器ID指定。

4.9.2 重启restart

通过docker restart命令可以重启处于运行状态的指定容器。

4.9.3 优雅停止stop

通过docker stop命令可以优雅停止指定容器。所谓优雅停止是指,若当前容器正在被其它进程访问,则在访问结束后再停止。

4.9.4 强制停止kill

通过docker kill命令可以强制停止指定容器。所谓强制停止是指,无论容器当前是否被其它进程访问都直接停止。

4.9.5 停止所有容器

无论是docker kill还是docker stop,都可使用下面方式停止所有容器。因为这两个命令的参数都可以是容器ID。

4.9.6 暂停pause

通过docker pause命令可以暂停容器对外提供服务。

4.9.7 解除暂停unpause

通过docker unpause命令可解除容器的暂停服务状态。

4.10 容器删除命令

4.10.1 正常删除

docker rm命令在默认情况下,要删除的容器必须是已经停止的容器。当然,这个容器可以使用容器名或容器ID指定。

4.10.2 强制删除

在docker rm命令中添加-f可实现强制删除容器。即,无论容器是否停止都会删除。

4.10.3 删除所有容器

4.11 容器与宿主机文件传递

docker cp命令可以完成容器与宿主机中文件/目录的相互复制,无论该容器是否处于运行状态。

4.11.1 将容器中文件复制到宿主机


以上命令是将mytomcat容器的tomcat中的webapps目录复制到宿主机的当前目录,查看宿主机当前目录。

4.11.2 将宿主机文件复制到容器


以上命令用于将宿主机中当前目录下的hw.tar文件复制到mytomcat容器的/usr/local/tomcat目录中。
若要查看容器中是否已经存在了hw.tar文件,需要首先启动该容器。

4.11.3 不支持容器间的cp


docker cp命令不支持容器间的文件传递。

4.12 提交容器为镜像

通过docker commit命令可以将一个容器文件系统的当前快照生成为一个新的镜像。
需求:这里要在一个Ubuntu容器或Centos容器中安装net-tools工具包。为了方便演示,这里选择CentOS容器,直接使用yum安装。当然,如果使用Ubuntu容器也可以,要么直接使用apt-get安装net-tools,要么先安装yum后再安装net-tools。

4.12.1 修改容器层

首先创建并启动一个容器,例如centos:7镜像的容器。然后发现该容器中是没有安装ifconfig命令的。

安装net-tools网络工具命令包。

此时再使用ifconfig,已经可以使用了。

4.12.2 生成镜像

下面要将已经安装了ifconfig命令的容器生成为一个镜像,以方便后期自己或他人使用。

这里指定生成的镜像的为centos7,为net-tools。

4.12.3 使用新镜像

下面是使用新生成的镜像创建并启动一个容器,发现其中的ifconfig命令是可以使用的。

4.12.4 生成悬虚镜像

悬虚镜像,即没有与的镜像。悬虚镜像一般都是由于某些失误操作或其它一些操作而生成的副产物,一般是要被清除掉的。如果非要使用悬虚镜像,那只能通过其ImageID来使用了。
下面要将已经安装了ifconfig命令的容器生成为一个悬虚镜像,即没有指定与。


4.13 导入/导出容器

在上一章中学习了docker save与docker load命令,分别用于导出/导入镜像。这里要学习的docker export与docker import命令分别用于导出/导入容器。

4.13.1 导出容器export

docker export命令用于将一个容器的文件系统导出为tar文件。例如,下面的命令是将tomcat:8.5.32镜像的容器tom导出到当前/root目录的tomcat8.tar文件中。

4.13.2 导入容器import

docker import命令用于根据指定的tar文件构建新的镜像。下面的命令是将当前目录下的tomcat8.tar导出为镜像mytomcat:1.0。

4.13.3 与save/load命令的对比

4.13.3.1 export与save
  • export作用于容器,save作用于镜像,但它们导出的结果都为tar文件
  • export一次只能对一个容器进行导出,save一次可以对多个镜像进行导出
  • export只是对当前容器的文件系统快照进行导出,其会丢弃原镜像的所有历史记录与元数据信息,save则是保存了原镜像的完整记录
4.13.3.2 import与load
  • import导入的是容器包,load加载的是镜像包,但最终都会恢复为镜像
  • import恢复为的镜像只包含当前镜像一层,load恢复的镜像与原镜像的分层是完全相同的
  • import恢复的镜像就是新构建的镜像,与原镜像的ImageID不同;load恢复的镜像与原镜像是同一个镜像,即ImageID相同
  • import可以为导入的镜像指定与,load加载的镜像不能指定与,与原镜像的相同

4.13.4 与docker commit的对比

  • 相同点:docker export + docker import会将一个容器变为一个镜像,docker commit也可以将一个容器变一个镜像。
  • 不同点:docker export + docker import恢复的镜像仅包含原容器生成的一层分层,docker commit生成的镜像中包含容器的原镜像的所有分层信息。

4.14 docker system命令集

docker system是一个命令集,其有四个子命令。

4.14.1 查看docker磁盘占用数据

docker system df用于查看docker各部分占用情况。

如果要获取更为详细的占用情况,可添加-v选项。

4.14.2 查看docker发生过的事件

docker system events命令造价于docker events命令,可查看指定日间之内(–since)或之外(–until)在docker上所发生的所有事件。这些事件包含运行过的命令有docker内部执行的一些操作。

4.14.3 查看docker详情

docker system info命令等价于docker info,用于查看当前docker的详情。包括dockerClient与docker Server详情。其中docker server包含镜像、容器情况,docker所在系统的软硬件情况等。

4.14.4 删除docker中的无用数据

docker system prune命令用于删除docker中的无用数据,这些无用数据包含已经停止的容器、没有任何连接容器的网络、悬空镜像,及悬空镜像的构建缓存。

4.15 总结

4.15.1 容器基础

深刻理解,容器存在的意义就是为其中的应用提供运行环境;容器运行的意义就是为了运行其中的应用,让应用对外提供服务。所以启动容器的目的就是为了启动并运行容器中的应用。所以容器中的应用运行完毕后,容器就会自动终止。

4.15.2 容器创建并启动命令

理解docker run命令用于创建并启动容器,同时其会运行容器中指定的应用。这个指定的应用要么通过docker run中的[command]指定,要么通过容器镜像的Dockerfile中的CMD指令指定。
掌握容器的两种启动模式:交互模式-it,分离模式-d。

4.15.3 容器创建命令

理解docker create命令仅用于创建一个容器,并不会启动容器。该命令没有-d选项,因为docker create命令创建的容器默认都是以后台方式来运行的(必须要通过docker start [容器]来启动),除非在创建时指定-it。

4.15.4 容器退出命令

掌握以下两种退出方式:

  • exit:退出并终止当前进程
  • ctrl+p+q:退出但不终止当前进程

4.15.5 容器状态查看命令

掌握docker ps命令中-a、-q、-l、-n选项用法。

4.15.6 容器再进命令

理解docker exec与docker attach的区别与联系:

  • docker exec:会新建一个进程来访问容器进程,一般与-it选项联用,一般使用exit命令退出并终止当前进程
  • docker attach:不会新建进程,而是将标准输入与标准输出直接附着在容器进程之上(使用户可通过键盘来操作容器,使容器中的输出可通过显示器展示给用户)。一般不使用选项,但需要考虑退出容器方式是使用exit还是ctrl+p+q。

4.15.7 容器内进程查看命令

了解docker top命令后可携带ps命令的选项。

4.15.8 容器日志查看命令

理解docker logs查看的是容器中应用的运行日志。这个应用是根据容器创建时命令(docker run或docker create)中的[command]指定,或通过容器镜像的Dockerfile中的CMD指令指定。

4.15.9 容器启停命令

理解以下几点:

  • 容器启动命令启动的是容器本身,但容器在启动的同时会启动一个应用,而这个应用是根据容器创建时命令(docker run或docker create)中的[command]指定,或通过容器镜像的Dockerfile中的CMD指令指定。
  • 容器停止命令停止的是容器本身,但在容器停止之前会先停止容器中的所有进程的运行,也就停止了对外提供服务的应用进程。
  • 暂停命令仅暂停的是容器对外提供服务,容器本身并没有停止运行,所以容器中的应用也就没有停止运行,只不过其不能通过容器再对外提供服务了。
  • 暂停/解除暂停两个命令对tomcat容器中的tomcat进程的运行没有任何影响,这两个命令的运行并不会记录到tomcat的启停日志中。因为tomcat的启停日志记录的仅是tomcat的启动、暂停、解除暂停与停止的状态变化。

4.15.10 容器删除命令

能够区分容器删除与镜像删除命令:容器删除是docker rm,镜像删除是docker rmi。它们都有一个选项-f,表示强制删除。镜像的强制删除,其不会强制删除UP状态的容器的镜像。

4.15.11 容器与宿主机文件传递

  • 深刻理解容器本身就是一个文件系统
  • 理解docker cp命令就是用于完成从一个文件系统复制到另一个文件系统而已,与容器是否运行无关
  • 了解docker cp命令不支持容器间文件的复制

4.15.12 提交容器为镜像

了解docker commit生成的镜像中是包含原镜像的所有分层历史记录的。

4.15.13 导入/导出容器

  • 理解导入/导出容器与导入/导出镜像命令的区别与联系。
  • 理解导入/导出容器与docker commit的区别与联系。
  • 理解docker export是对镜像分层合并后视图的文件系统快照的导出,仅包含合并后的一层镜像信息,不包含原镜像的分层历史记录。

4.15.14 docker system命令集

掌握docker system prune命令用法即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值