Docker 学习笔记(二)

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、内存参数等环境底层信息。

1
➜ ~ docker info

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

1
docker kill 容器名

ps 查看当前容器的运行状态

rename 对容器重命名

docker rename 旧名字 新名字

tag 对镜像重命名

……还有很多命令看文档

参考书籍
《Docker 全攻略》张涛著
《Docker 官方文档》

本站总访问量 次, 访客数 人次, 本文总阅读量
靡不有初,<br><br>鲜克有终。<br><br>不断努力,一步一步往前走,做最好的自己