开发者学堂课程【Docker 快速入门:Docker 容器命令(下)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/616/detail/9398
Docker 容器命令(下)
内容介绍
一、启动守护式容器
二、查看容器日志
三、查看容器内运行的进程
四、进入正在运行的容器并以命令行互换
五、从容器内拷贝文件到主机上
一、启动守护式容器
1.回顾
前面介绍了容器的新建运行,查看当前正在运行的容器 PS 命令,ps 是查 Linux的,docker ps 是查 docker 里面的,重启,停止,退出等以大家的基础不讲解,看图也能弄懂,这些没有什么技术含量,退出的方式有 exit,Ctrl+P+Q,启动式交互,-it,接下来讲解重要的部分,例如启动式交互有没有其他方式,不想交互只需要启动,不返回对话窗口命令行终端,希望后台以守护进程的方式启动,exit 退出了,exit 关闭退出,Ctrl+P+Q 关闭不退出,可以重新进来,这些是更加细粒度的知识
-d 指后台运行容器,并返回容器 ID,也即启动守护式容器,之前讲过 docker run,再来演示一下
docker images 里有 centos,docker run-it 交互并返回命令行终端,返回centos,不再命名别名了,返回了新的容器 ID,说明从 Linux 宿主机从大海爬到鲸背上,进入到了 82c 的容器 ID 里了,pwd-l 是标准的 Linux 命令,现在跑的是mini 精简版的 docker 上运行的 centos,还有一种情况是只喜欢服务运行,不需要交互,后台只需跑即可,这时退出,重新启动守护式容器。
docker ps 当前没有运行任何东西,docker run-d centos 后台运行,没有交互窗口,还是桌面,桌面是宿主机,没有进入 docker,但是启动过,现在 docker 会不会返回尾数为 fea7 的容器,,其实是没有的,没有又怎么返回值的,说明一定是启动成功过,但是有一个 docker 机制,还有另一个问题,-it 有什么作用,相对而言,甚至有些时候,交互和后台两种都需要有,后续再讲解用 docker 容器跑 Tomcat 时会进行演示,有些时候需要运行在后台,有时需要运行在前台进行交互,各有各自的用处
2.问题:
dockerps-a 进行查看,会发现容器已经退出(已经启动了,否则不会出现 ID,只有出正确的容器 ID 编号,说明启动过,为什么 docker ps 查了以后,ps 是当前 docker 容器正在运行的容器实例,进程,但是没有,说明来过,悄悄地走了)
很重要的要说明的一点: Docker 容器后台运行,就必须有一个前台进程。
容器运行的命令如果不是那些一直挂起的命令(比如运行 top,tail) ,就是会自动退出的。
这个是 docker 的机制问题,比如 web 容器,也可以在 docker 上跑 Nginx,以nainx 为例,正常情况下,配置启动服务只需要启动响应的 service 即可。例如 service nginx start
但是.这样做 .nainx 为后台进程模式运行 .Linux 上没有问题,但是会导致 docker 前台没有运行的应用。在讲解 run IT 时需要有前台进行交互,docker 先不要关闭,要进行交互,存在这样的交互命令,前台存在,所以后台存在进程,是up的状态,但是现在只以后台的方式启动,没有与前台交互,例如饭店很久没有顾客,厨师就将灶火关闭了,所以就导致 docker 觉得前台没有运用。
这样的容器后台启动后,会立即自杀因为他觉得他没事可做了,这不是操作的错误,这是 docker 的机制,所以,最佳的解决方案是,将你要运行的程序以前台进程的形式运行。
交互的指令使用 -it,前台启动 -it,启动进以后登录进容器,不管是什么,都会返回带自身容器 ID 编号的命令行终端,t 是伪终端,代表主人需要只用此命令进行 docker 交互掌控,还有一种情况是只想启动不想进行交互,操作指令是 -d,两个各有用途,稍后进行讲解。
二、查看容器日志
1.参数
docker logs 鲸鱼背上要有日志,在背上装载了几个箱子,docker 里面有自己的日志,主要参数有 -f,-t,-tail,前面两个是 Linux 的,tail 是尾巴
-t 是加入时间戳
-f 跟随最新的日志打印,永远取最新版
--tail 数字显示最后多少条
日志从下面一条一条的追加,继续向下写,docker 感觉没有命令会挂起会自动退出,让它不退出就可以了,docker run-d centos /bin/sh -c "while true;do echo hello zzyy;sleep 2;done"
,这句话的意思以后台的形式运行centos,运行以后以 bin/sh 循环打印这句话,while true 永远是死循环,是脚本编程,在 Linux 高级部分学过,do echo hello zzyy 每两秒钟打印一句话,一直持续打印,要将输出打印到控制台上面,会导致前台有响应,也不会自我关闭。
使用 docker ps 指令,现在里面什么都没有,返回了一个值,现在查看 docker ps,状态是 up,根本就没有停,因为是后台启动的,不想有交互窗口,还是想回到宿主机,桌面就是宿主机,但是并不代表程序不可以再后台安静的运行,此时使用 docker logs 查某一个容器的日志,现在每隔两秒钟打了这么多,打了一串串的hello world,后台有程序跑着,在加入-t 命令,docker logs-t,t 是 time 的意思
现在每两秒钟打印一次,2018 年 7 月 11 号,ocker logs-f 不停的追加,14,16,下一个是 18,因为每两秒钟打印一次,说明可以持续的查看 docker 日志,假设太多了,看不了这么多,ocker logs-t-f-tail3,只看倒数的三行,这些就是 ocker logs 常用的参数,去查看 docker 某一个具体容器的日志,鲸鱼背上驮了十个集装箱,每个箱子 container 容器 ID 都不一样,要去哪个箱子看,鲸鱼都记着
三、查看容器内运行的进程
1.查看容器运行进程命令
使用 docker ps 指令,可以看到还在用 hello 的脚本,查看容器内运行进程的命令是 docker top,top 是 Linux 的,但是 docker ps 当前正在运行的是 7010,这时使用 docker top 5ba7fb9a7010
可以看到这个容器的 docker 跑着 pid,UID,PPID,进程,副进程,用户 ID 都一样,与 Linux 几乎是一致的,这个 container ID 是 docker 里面跑着的精简版的centos,可以把容器看作是一个简易版的 Linux 环境,所以大部分 Linux 命令在道口中都可以使用,个别除外,ps Linux 能用,top Linux 能用,docker Top ,dockerPS 都能用,有相通相融信,因为 docker 本质容器跑着的本质是简易版的Linux 环境,top 过后会知道,在现在的容器里跑着每两秒钟打印一次的 hello 语句
2.查看容器内部细节命令
docker inspect 容器 ID,这个命令在后期数据卷和容器时会对它有更深刻的理解,docker 镜像是一层套一层的,就像一个同心圆一样,inspect 用来查看容器内部的细节,将整个容器进行描述,以 JSON 串的形式嵌套描述,现在查找这个容器 ID 的结构,输入命令 docker inspect 5ba7fb9a7010
实现了以 bin/sh 循环打印 -c "while true;do echo hello zzyy;sleep 2;done" 脚本,ID 是 5ba7fb9a7010,创建时间,路径,路径是使用以及登录的路径,以 -c "while true;do echo hello zzyy;sleep 2;done 为循环,言下之意 inspect以JSON 字符串,tv 键值对以字符串的形式告诉全部容器结构的细节,后续会进行详细讲解。
四、进入正在运行的容器并以命令行互换
前面讲过退出容器,exit 和 Ctrl+P+Q 容器不停止退出,要重新进入。
docker ps 现在还在运行着,docker kill5ba7fb9a7010 将它强制退出,现在事件什么都没有,重新运行一个,如果退出了,想重新进入,与 docker 发生交互,主要使用两个命令,docker exec 和 docker attach。
docker run -it centos 回车,进入到了默认的登录路径,根目录下,什么都不写进入的是根目录下,docker run -it centos /bin/bash 都是可以的,有时会看到书上或者命令行加上这个,它的意思是要交互什么命令格式,默认就是这个,登陆以后,exit 停止,Ctrl+P+Q 退出不停止,当前正在运行的是 10b9a3588ab9 退出了,未关闭,如果想从宿主机进入里面使用 docker attach 10b9a3588ab9 指令,这时就进入了,ls-l 查看根目录下有哪些内容,ls-l/tmp 查看 docker 内的 centos精简版的容器,tmp 目录下都有什么,Ctrl+P+Q 没有停止,docker exe 第一种是要做什么事,要进入容器再做,例如刚刚进入容器 ls-l/tmp,这时 docker exec 在外面执行,对容器再宿主机外面对容器执行 ls-l/tmp,attach 是竞选到根目录下,默认的登录路径,而这个是执行,针对容器使用此命令执行直接结果
可以看到与刚刚是一样的,而这个方式的好处是没有进入,隔山打牛,进到容器中做一件事,直接拿出结果,返回给宿主机,加不加 shell 都可以,如果加了bin/bash,这种方式是直接得到结果,假如现在的指令是 docker exec-t 10b9a3588ab9 bin/bash 与 attach 一样,所以 exec 的功能比 attach 强,attach是进入,有什么要做什么,进去以后再做,但是 exec 是进去做可以,进去以后在外面做好,直接拿结果也可以,在这里可以看到它们两个的区别,attach 是直接进入容器启动命令的终端,不会启动新的进程,exec 是在容器中打开新的终端,并且可以启动新的进程,刚才的演示可以看到既可以进去做,通过 exec 进入 ls-l/tmp,最终获得的结论是这样的。
docker ps 是此 container ID,要运行 docker exec-t 10b9a3588ab9ls-l/tmp 相当于在宿主机外面对容器进行远程操作,执行 exec 命令,直接得到结果,还有一种是 docker exec-t 10b9a3588ab9 bin/bash,这种情况与 attach 类似,进去以后在干活,ls-l/tmp 在容器外面宿主机对 10b9a3588ab9 容器执行 exec 命令,获得结果,这种命令还是 exec,有点类似于 attach,进入到 bin/bash 命令行下终端提示下,进去以后在工作,exec 功能比 attach 强大,因为 exec 可以在外面远程操控,直接获得结果。这是两种退出以后进入 docker 容器的方法。
五、从容器内拷贝文件到主机上
1.为什么要从容器内拷贝文件到主机上
鲸背上集装箱产生了一些数据,如果现在 exit 以后,docker ps 有可能会停止,停了以后,假设 docker stop 将此容器停止了,容器内产生的数据就没有了,但是有时需要容器内的数据能够持久化,现在先将它保留下来,例如在容器中跑了readies,其中有三条记录很重要,但是现在不需要容器了,要将容器关闭,类似于将集装箱从鲸鱼背上卸载下来,但是当时产生的数据要保留下来,这时要完成容器内的数据拷贝下来,让主机保留着,大海里留着。
2.指令
docker cp,cp 命令 Linux 也有,ps,top 命令 Linux 都有,在 docker 中前面加docker 就 OK,先使用 docker ps 命令,现在存在的容器是 10b9a3588ab9ls,宿主机在 root 路径下,10b9a3588ab9ls 进入容器 ID,docker attach 可以重新进入当前正在运行的容器,进入以后,假设在 tmp 路径下,本来进去时应该在根目录下,cd/tmp 路径下
这里有 yum.log,这是容器里 tmp 路径下面的 yum.log,需要将它拷贝出去,拷贝到宿主机的 root 路径,Ctrl+P+Q 退出,容器没有停,当前是宿主机的 root 目录下,
没有 yum.log,docker ps 要的是容器 ID10b9a3588ab9,docker cp10b9a3588ab9:
这个容器里哪一个 tmp 路径下的 yum.log 拷贝到哪,拷贝到 root 下,如果想改名,例如叫 ABC 也可以,回车
有 yum.log,相当于将虚拟机上 docker 容器里面的 10b9a3588ab9 路径下的yum.log 拷贝到了 root 路径下,这是刚刚拷贝的,可以和上一张图片对比,公共的三个字上面根本没有 yum.log,但是现在有了,从 10b9a3588ab9 容器拷贝进来的,这就是相关的容器命令
这是 docker 容器非常重要的基本功,这些命令必须完全掌握。这些命令足以覆盖日常工作,docker 常用命令总结,start,kill,stop,inspect,top,rm 执行命令 ps,有些后面会讲解,例如 history 镜像的命令,dockerfile 等等,有一些不重要例如 load,diff,没有讲解,所讲内容足够使用