Docker中的某些命令详解
logs 获取容器内部应用输出的日志,只能获取到重定向到STDOUT和STDERR的日志
attach 挂载到正在运行的容器中,并且可以在容器中执行任何命令
可以通过ID和name挂载
1 2 3 4 5
| ➜ ~ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6caf2b2b8d00 b1873e247b48 "/bin/bash" 32 minutes ago Up 32 minutes reverent_thompson ➜ ~ docker attach 6caf2b2b8d00 root@6caf2b2b8d00:/#
|
或者
1 2
| ➜ ~ docker attach reverent_thompson root@6caf2b2b8d00:/#
|
通过Ctrl+P+Q来退出容器,容器还在运行中。
使用exit退出容器,容器同步被关闭。
1 2 3
| root@6caf2b2b8d00:/# exit 10 ➜ ~ docker ps -a |grep reverent_thompson 6caf2b2b8d00 b1873e247b48 "/bin/bash" 52 minutes ago Exited (10) 45 seconds ago reverent_thompson
|
Exited (10) 容器的退出响应码变成了10,即可以通过exit命令来指定容器退出码。
commit 以某个容器为基础保存成一个新的image
-a, –author=””这个参数的目标是保存新的作者。
-c, –change=[]这个参数保存的是修改image里面的配置参数。
目前支持的可以修改的配置参数有CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR。其余的参数继承于上一个image
1 2
| ➜ ~ docker commit --change "ENV DEBUG true" 3af7938d2d31 svendowideit/testimage:version1 sha256:c24a8c4cf76d9485e69fa4d975a6b8ccc3070dbf368a118672ab6a76a4249605
|
3af7938d2d31是一个正在运行的容器,svendowideit/testimage是repository的名字,version1是tag的内容
查看结果:
1 2
| ➜ ~ Docker inspect -f "{{ .Config.Env}}" c24a8c4cf76d [DEBUG=true no_proxy=local PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin]
|
-m, –message=””这个参数是提交一个comment备注信息,说明image的用途,修改的内容等信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| ➜ ~ docker commit -m "test message" 3af7938d2d31 svendowideit/testimage:version2 sha256:0d4f24b6a8d7d7239b9cfa163845c09866f30de9cc7ac23d48510e3ac095f6a4 ➜ ~ Docker inspect 0d4f24b6a8d7 [ { "Id": "sha256:0d4f24b6a8d7d7239b9cfa163845c09866f30de9cc7ac23d48510e3ac095f6a4", "RepoTags": [ "svendowideit/testimage:version2" ], "RepoDigests": [], "Parent": "sha256:78a0e8d9b39cdcbb93d433ec5de61ba6c6d10369eccdf45b7e60318b47356d9a", "Comment": "test message", ......... } ]
|
-p, –pause=true 默认情况下执行commit时,容器中所有进程处于暂停状态,如果此时容器对外提供服务,那其他容器会受到影响。
-pause=false使用这个参数使得在执行commit时保持容器内进程继续工作。但是commit效率会下降。
create 创建容器
create命令是以image为模板创建的一个容器,并且在容器文件的最上面一层添加一个读写层,容器里面的数据变化会被保存在读写层。
create成功后需要通过start来启动容器。
参数:
-i 将Host的Stdin和容器的Stdin相连接
-t 创建一个pty终端
(-it 前两者结合使用相当于在host环境中启动一个链接容器的pty伪终端,在host的pty中输入的数据就会传到容器之中。)
1 2 3 4 5
| ➜ ~ docker create -it addwszfile bash 7019c6b575fe673954f2019a99fb6679b7a2f4a604d324290ff5111c42feae2b ➜ ~ docker create -it -v /dockerforme/sinatra/share_folder/:/tmp --name data1 addwszfile 7cfc3205a8df843d1b7219a31f51976b5df638cb20a03c57134ec690da990875 ➜ ~ docker create -P --name data2 addwszfile
|
addwszfile是image名称。
-p 映射网络端口,当应用需要访问其他应用或被访问,需要开放一个端口
-P 容器中所有需要暴露的端口都会映射到主机随机的一个端口(端口范围49153~65535)
-v 挂载参数,把主机的一个文件或者一个目录挂载到容器中
diff 比较容器文件文件层数据差异的命令
首先启动一个容器
1
| $ sudo docker run -t -i ubuntu:12.04 /bin/bash
|
在容器中做某些操作
1 2 3 4 5 6 7
| root@543f21cb4a4e:/# touch /tmp/wsz.txt root@543f21cb4a4e:/# echo "This is wsz add test" > /tmp/wsz.txt root@543f21cb4a4e:/# touch /tmp/wsz2.txt root@543f21cb4a4e:/# rm /tmp/wsz2.txt root@543f21cb4a4e:/# touch /tmp/wsz3.txt root@543f21cb4a4e:/# echo "This is a change test" > /tmp/wsz3.txt root@543f21cb4a4e:/# echo "I add a new line" >> /tmp/wsz3.txt
|
新开一个命令行窗口,查看diff
1 2 3 4 5 6 7
| ➜ ~ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 543f21cb4a4e ubuntu:12.04 "/bin/bash" 4 minutes ago Up 4 minutes trusting_bell ➜ ~ docker diff 543f21cb4a4e C /tmp A /tmp/wsz.txt A /tmp/wsz3.txt
|
结果中的A表示add;C表示Change;D表示Delete
可以看见之中我们是创建一个wsz2.txt的文件然后又删除了,但是在diff中并没有反应出来,这是因为我们操作产生的数据保存在最上面的读写层里,diff比较的是最上层和其他层的差异,其中wsz2的文件不存在于其他层所以不显示。
若想时时刻刻保存状态,可以save读写层,再进行删除。
1 2 3 4
| ➜ ~ docker commit 543f21cb4a4e addwszfile sha256:b1873e247b48d2ffb12725552691db3c8a2d1f097efdfbb04aeddb9cf13d8c9c ➜ ~ docker run -it b1873e247b48d2ffb12725552691db3c8a2d1f097efdfbb04aeddb9cf13d8c9c root@6caf2b2b8d00:/# rm /tmp/wsz.txt
|
新开一个命令行窗口可以看到删除的内容
1 2 3 4 5 6
| ➜ ~ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6caf2b2b8d00 b1873e247b48 "/bin/bash" 40 seconds ago Up 39 seconds reverent_thompson ➜ ~ docker diff 6caf2b2b8d00 C /tmp D /tmp/wsz.txt
|
events 获取容器所报告的事件
Docker容器再运行过程中会向Docker Daemon报告如下事件:
create、destroy、die、export、kill、oom、pause、start、stop、unpause
Image镜像会向Docker Daemon报告untag、delete事件
筛选的几种方式:
–since 指从某一个时间点开始Docker Daemon接收的所有事件。
1
| ➜ ~ docker events --since '2016-09-01'
|
–until 需要和 –since结合使用,指的是从某一个时间点开始到某一个时间点结束。
1
| ➜ ~ docker events --since '2016-09-01' --until '2016-11-08T15:00:00'
|
–filter 接收的是key=value的键值对。目前有效的key是container、event、image。
1 2 3
| ➜ ~ docker events --filter 'event=stop' ➜ ~ docker events --filter 'image=ubuntu:14.04' ➜ ~ docker events --filter 'container=543f21cb4a4e'
|
exec 在容器中运行其他命令
执行ps删选进程
1
| ➜ ~ docker exec 6caf2b2b8d00 ps -s|grep bash
|
创建一个新文件
1
| ➜ ~ docker exec 6caf2b2b8d00 touch /tmp/1.txt
|
修改文件,前提需要申请一个pty和绑定一个stdin用来保存编辑的文件,因为没有pty容器无法收到控制字符
1
| ➜ ~ docker exec -it 6caf2b2b8d00 vi /tmp/1.txt
|
history 追踪image的历史记录
diff 查看的是容器中文件系统的变更历史。History查看的是image的变更历史。
1
| ➜ ~ docker history ouruser/sinatra:v3
|
-H,–human 表示是否输出方便用户识别的格式。
–no-trunc=false 默认false,表示将输出按照一定的格式进行截断。
–quiet 若是设置为true,只返回image构建过程中所有的临时文件层的image ID,为false时返回所有信息。
info 显示Docker摘要信息
info 指令显示Docker摘要信息,用来确认Docker信息。包含Docker内核版本号、Docker所设定的CPU、内存参数等环境底层信息。
inspect 返回指定目标的底层信息
inspect可以返回image和container的底层信息。包括某个容器的IP地址,MAC地址,端口信息等等。
返回的几类信息:
1.基本信息类:名称,创建时间,当前状态(运行、停止、暂停)等
2.运行参数类:网络信息、环境变量、主机名称等
3.底层数据类:CPU设置、内存设置、虚拟化设置等
1 2 3
| docker inspect -f {{要查看的参数名}} ID号 docker inspect -f '{{json .Config}}' ID号 docker inspect -f '{{(index (index .Config "Env") 0)}}' ID号 取出Config中Env第一个元素命令
|
json是指把数据格式化成json字符串
index取第几个
kill 强制停止容器
一般使用stop关掉容器。出现异常使用kill
ps 查看当前容器的运行状态
rename 对容器重命名
docker rename 旧名字 新名字
tag 对镜像重命名
……还有很多命令看文档
参考书籍
《Docker 全攻略》张涛著
《Docker 官方文档》