开发者学堂课程【Docker 快速入门:Docker 容器命令(上)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/616/detail/9397
Docker 容器命令(上)
内容介绍
一、docker 镜像命令能做什么
二、新建并启动容器
三、退出容器
四、启动/重启容器
一、docker 镜像命令能做什么
前面讲了镜像操作相关命令,这一讲将要讲解容器操作的相关命令,有镜像才能创建容器,这是根本前提(下载一个 centos 镜像演示),在这里不要混淆了,现在是在 centos 宿主机上装了 VMware 虚拟软件,在上面为了学习 Linux 讲了真实的完全模拟,使用虚拟机模拟的系统 centos,在 centos 上面安装了 docker,现在相当于需要从阿里云再拉下来一个镜像,从阿里云拉下的镜像是 centos,现在docker 上除了可以跑 Tomcat,Nginx,unbantu,还可以跑 centos
现在看一下 docker pull centos。
image 已经更新到了最新版本,相当于从阿里云拉下了 centos 的镜像,docker images 查看本地已经有的镜像。
此时可以看到 centos 镜像已经存在了,接近于 200M,在讲解 centos 时,讲各种安装时知道真正虚拟机上装载的是 centos -6.8×86,这个 centos 接近 4G,现在下载的阿里云的 centos 只有 199M。
最右侧是阿里云的仓库,centos 是图标,容器可以看做是一个简易版的 Linux 环境,前面讲过 docker 启动是秒级的,因为除了保留内核,硬件,网络,打印机等不相关的统统拿掉,因为 docker 快速且简洁,所以企业喜欢用,美团使用 docker就是因为更加轻量,基于容器的虚拟化仅包含业务运行所需要的 runtime 环境, centos/unbantu 基础镜像仅 170M。
回到容器虚拟化技术理论,上面每一个蓝色是一个集装箱,只用做了精简版最基础的镜像,200M 的 centos,剩下跑各自的容器。这里为大家讲解了 docker 为什么快,一个命令 docker pull image 以及每个命令后面为什么小,为什么大,这些原理以及深层次的需要为大家讲解清楚,否则只讲 docker pull centos 只能学到皮学不到骨和肉。
现在去获得镜像,言下之意有镜像了就有 container 容器,依照镜像跑起来,下面的案例准备在 docker 上面,再跑一个 centos,docker 里面的 centos 进行讲解
二、新建并启动容器
以当前 centos 模板进行启动容器,相当于有一个对象,docker run [OPTIONS]IMAGE[COMMAND][ARG.….]
命令非常重要,是 docker 的主流命令之一,docker run 固定写法,options 选项参数,image 镜像,这就是为什么在hello world 要详细讲授 run 命令,run 只做两件事,依照某个镜像新建一个 image 镜像的具体实例容器跑起来,例如现在准备运行当前 centos,在本地有新建运行,本地没有去对应的 hub 拉取,现在本地机器上是有的,不用去远端机器拉取,直接启动就可以。
1.options 说明
有些是一个减号,有些是两个减号
--name="容器新名字": 为容器指定一个名称;
-d: 后台运行容器,并返回容器 ID,也即启动守护式容器;
-i: 以交互模式运行容器,通常与 -t 同时使用:
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-P:随机端口映射;
-p:指定端口映射,有以下四种格式
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
P,p 后面讲 Tomcat 时会讲解,最常用的 i,t
2.启动交互式容器
使用命令 docker run -it 88ec626ba223
要求以 image 的 centos 既可以写名字,也可以写 ID 号,假如这里写 ID 号,name 相当于将要启动的容器重新弄别名,先不加名字为大家做下演示,回车查看效果。
88ec626ba223 是镜像 ID,这一步生成了实例,并登录进了 docker 里面的centos,因为上面提示符还在宿主机,现在变成了 ID,这个 ID 不是 image ID,使用 ls 命令,以 88ec626ba223 ID 也就是 centos 为模板生成了 4d56fa33ac08 容器,可以将它看成对象的地址,ls 回车,现在是登录进 docker 里跑 200M 的 centos
root 密码是 centos 必需要的,但是有些有,有些没有,pwd 说明是在 docker 中跑 centos 根目录之下,言下之意 i 和 t,i 是交互,t 代表伪终端,假设登录进docker 里面的 centos 了,登录成功以后会告诉 docker 中的 centos,还要与它交互,登录成功以后自动在终端中打开,相当于给了一个终端,终端是命令行输入的提示符,登录进去以后在 docker 里面 centos 的根目录下。
ps-ef
能操作命令说明成功登录进了 docker 里面的 centos,这时可能会有疑问如何证明是 docker 中的 centos,4d56fa33ac08 这个字符串 Hass 值又是什么,先学下一个命令,列出当前所有正在运行的容器,docker ps,现在是 Linux 的,如果想查看 Linux 当前机器 Linux 中所有进程指令是 ps-ef,查看 docker 里面跑的所有进程或者鲸鱼背上所有集装箱有哪些,查看鲸鱼背上有几个集装箱的指令是 docker ps
现在看一下对比,尾号都是 ac08,下面是 image ID88 开头,上面是 container ID 容器 ID,容器 ID 生成 88ec 镜像 ID,当前的 command 是 bin,以 bin 方式登录进了容器里面,状态是 up,说明容器正在启动着,docker run 是在本地新建并进入容器,容器里面可能装的是 centos,readies,unbantu,也有可能装的是 Nginx,各自进入的命令不一样,此外,进入的容器有 name,name 是 docker 随机给此容器分配的,如果没有指定名字,会使用随机分配默认的名字,如果主人指定了容器的新名字,你叫什么,我就叫什么,d,p,P 在讲解 Tomcat 时会为大家继续介绍,i 代表登录进 docker 里面的容器以后要交互,dty 代表伪终端,言下之意是登录以后,会弹出一个输入命令的命令行终端,可以这样进行理解。it 是启动交互式容器,后面有启动守护式容器,后续会进行讲解。docker ps 如果是单独的ps,是用来查找 Linux 的全部进程,docker ps 查找的是 docker 里面的进程有哪一些,docker 中含有哪些 container ID 出现,鲸鱼背上有哪几个集装箱。
3.docker ps 的参数
a :列出当前所有正在运行的容器+历史上运行过的
-l:显示最近创建的容器。
-n:显示最近 n 个创建的容器。
-q :静默模式,只显示容器编号。
--no-trunc: 不截断输出。
三、退出容器
1.exit
退出容器有两种方法,一种是 exit,一种是 Ctrl+P+Q,鲸鱼背上有 docker, docker 中有集装箱,是一个精简版的 centos,注意提示符,现在是在 docker 里面的 centos 中,没敲命令前 docker 字符串是 up,现在执行 exit 指令
现在已经退回到了宿主机桌面,退回到了 centos
现在 state up 已经没有了,docker ps 是默认显示当前正在运行的,exit 是关闭容器并退出,所以没有了, 执行 exit 以后当前活着的容器没有了,但是想看上一个容器是什么,现在是已退出的状态,上一个容器就是刚才运行的 4d56fa33ac08,docker ps-a 指令代表当前正在运行的和过往的,-l 代表上一次运行的,-n3 表示将上三次运行过的传输过来,-q : 静默模式,只显示容器编号,l 是上一次运行的虽然已经退出了,lq 只显示容器编号,与前面所讲一样,可以批量删除镜像,反过来也可以批量删除容器,这就是其中 ps 及参数的讲解。
再运行一次,docker images centos 有这个镜像,docker run-it,i 是交互,t 是伪终端,其实就是要登录 docker 里面的 centos,要在 docker 上面跑 centos 实例,登录进去以后返回一个命令终端,要与你交互,这时再加参数 docker run-it--name mycentos0115,这是自己命令的名,前面讲解过,不命名会随机分配一个,这种名字只有 docker 自己知道,用这个名字是精确的,容器叫做 ec08 这一长串不好用,有时会改一个别名,docker run-it--name mycentos0115 centos 启动,这时就返回了一个命令行终端,现在是 beed,绝对不是上次的 ac08 了,此时依照 centos 镜像重新又生成了一个尾号为 beed 的新的容器实例,此外它的名字是 mycentos0115,no-trunc 是不截断输出,备注,信息等等。
刚才演示了退出 exit,关闭容器以后退出,这种情况下是一锤子买卖,如果以后要使用它只能重启,还有一种情况是现在可能要离开一下这个容器,以后也许会再进来,离开但不关闭,exit 是出门关灯,这个是出门别关灯,一会可能还会回来
2.Ctrl+P+Q
只要有容器 ID 号就说明进入到了容器,否则就是退回到宿主机,大海是宿主机,蓝色鲸鱼是 docker,docker 上面一个一个的集装箱是容器实例,现在是爬到了鲸鱼背上 beed centos 上的容器实例,现在退出 Ctrl+P+Q,现在相当于跳回到海里,回到宿主机,桌面的意思是宿主机使用的是 centos 6.8,鼠标右键,终端中打开,在的当前位置是桌面,和大海一样,接下来讲解如何证明,出来以后未关闭容器,使用 docker ps 指令
可以看到 Beed 还存货着,状态是 up,如果 docker ps-n2 过去启动过的两个容器,前面讲的是尾号为 stallman,现在活着的是尾号为 0115 的。
容器不停止退出,要想进去要如何操作稍后会进行讲解。
四、启动/重启容器
1.start
黑色部分已经关闭了,假如停了以后想启动这个容器,这时要将容器 ID 打开,使用 docker start 指令加容器 ID 或容器名字,docker ps 是当前正在运行的
可以看到两个 up 说明在鲸鱼背上的集装箱可以关可以停,可以重启,可以删除也可以安装和卸载,刚才 ac08 容器是停的 现在通过 start 命令,相当于又将它启动了,启动以后当前正在运行的容器共计有两个
2.重启容器
例如 mycentos0115,将 ID 粘过来 docker restart 0a0a2455beed 刚才启动以后持续了三分钟,只要成功了就会返回对应的容器编号
这就重启成功了,因为刚才持续了三分钟,现在是六秒钟,所以是刚刚启动完成。
3.停止容器
停止容器举一反三就可以操作好,指令是 docker stop 容器 ID 或容器名,docker stop 先停止 beed 容器,stop 是等待容器慢慢停止,相当于慢慢的熄火,就像笔记本电脑没有外置电源,只连接着自己的电池,stop 就是点击正常的关机,可能需要等待十秒钟以内
这就是关闭成功了,在执行这个以前有两个 up,现在只有一个 up,还有一盒命令是强制关闭,相当于关闭冰箱直接将电源插头拔掉,docker kill 4d56fa33ac08,刚才 stop 等了一会,关闭另外一个容器,直接关掉了,stop 是温柔停止,kill 是强制停止,粗暴一些,相当于直接拔电源。
4.删除已停止的容器
这是当前正在运行的容器,一个都没有,都停了,但是在 docker 的缓存记录里或日志中,记着已经启动过的容器,使用 docker ps-l 查看上一轮启动的,使用docker ps-n2,刚才演示了两个 centos,删除已停止的容器,如果运行着可能会显示冲突,因为还在用着呢,就像 MySQL 数据库主外约束的感觉,docker rmi 是删除 image 镜像,使用 docker rm 是删除容器,现在删除 ac08 这个容器,docker rm 4d56fa33ac08 没加 f,f 是前置删除,exit 是停止的意思,这时就删除干净了,再执行 docker ps-n2,可能会疑惑怎么又是两个,因为这里删除一个,但是之前还运行过别的,标号都不一样了,接下来删除 beed 这个,没有停止的容器要加f强制删除,关停再删除,没有 f 只是删除已关闭的.
5.一次性删除多个容器
q 和 a 是找出当前全部的容器 ID,docker ps-q 是当前正在运行的容器,只返回容器 ID,但由于现在容器没有正在运行的,再加上 a 能看到曾经启动过的容器,这时就有了很多很多 ID,与前面一样,进行 docker rm-f$ 指令,与批量删除镜像操作一样,另一个指令是docker ps -a -q | xargs docker rm
,xargs 是 Linux可变参数,纯 Linux 管道符,下一个命令的结果和输入参数传递给下一个参数,例如第一个命令查出来三个 container ID,会传给 xargs,类似于 delete where ID in 彻底删除,这两个命令使用哪一个都可以。