Docker 调试技巧
『重用』容器名
但我们在编写/调试Dockerfile的时候我们经常会重复之前的command,比如这种docker run --name jstorm-zookeeper zookeeper:3.4
,然后就容器名就冲突了。
1
2
3
4
|
$ docker run --name jstorm-zookeeper zookeeper:3.4
...
$ docker run --name jstorm-zookeeper zookeeper:3.4
docker: Error response from daemon: Conflict. The name "/jstorm-zookeeper" is already in use by container xxxxxxxxx
|
可以在运行 docker run
时候加上--rm
flag, 容器将在退出之后销毁。无需手动docker rm CONTAINER
1
2
3
4
5
6
7
|
$ docker run --name jstorm-zookeeper zookeeper:3.4 --rm
# reuse
$ docker create --name jstorm-zookeeper zookeeper:3.4
$ docker start jstorm-zookeeper
# no error
|
debug Dockerfile
在写 Dockerfile
的时候,通常并不会一气呵成。有的时候容器启动就crash 直接退出,有的时候build image 就会失败,或者想验证Dockerfile是否符合预期,我们经常要debug Dockerfile。
如果build 失败可以直接 查看stdout的错误信息,拆分指令,重新build。
logs
查看 stdout
所有容器内写到stdout的内容都会被捕获到host中的一个history文件中, 可以通过 docker logs CONTAINER
查看。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
$ docker run -d --name jstorm-zookeeper zookeeper:3.4
$ docker logs jstorm-zookeeper
ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
2016-12-18 05:55:27,717 [myid:] - INFO [main:QuorumPeerConfig@124] - Reading configuration from: /conf/zoo.cfg
2016-12-18 05:55:27,725 [myid:] - INFO [main:DatadirCleanupManager@78] - autopurge.snapRetainCount set to 3
2016-12-18 05:55:27,725 [myid:] - INFO [main:DatadirCleanupManager@79] - autopurge.purgeInterval set to 0
2016-12-18 05:55:27,726 [myid:] - INFO [main:DatadirCleanupManager@101] - Purge task is not scheduled.
2016-12-18 05:55:27,728 [myid:] - WARN [main:QuorumPeerMain@113] - Either no config or no quorum defined in config, running in standalone mode
2016-12-18 05:55:27,746 [myid:] - INFO [main:QuorumPeerConfig@124] - Reading configuration from: /conf/zoo.cfg
2016-12-18 05:55:27,747 [myid:] - INFO [main:ZooKeeperServerMain@96] - Starting server
2016-12-18 05:55:27,766 [myid:] - INFO [main:Environment@100] - Server environment:zookeeper.version=3.4.9-1757313, built on 08/23/2016 06:50 GMT
2016-12-18 05:55:27,766 [myid:] - INFO [main:Environment@100] - Server environment:host.name=dbc742dd5688
2016-12-18 05:55:27,767 [myid:] - INFO [main:Environment@100] - Server environment:java.version=1.8.0_111-internal
|
即使是容器已经退出的也可以看到,所以可以通过这种方式来分析非预期的退出。这些文件一直保存着,直到通过docker rm
把容器删除。文件的具体路径可以通过docker inspect CONTAINER
获得。
(然后osx上你并找不到这些文件,因为其实osx的docker实际是运行在”VM”中,具体就不展开了,但是可以通过 screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
touch上”VM”的tty)
在使用docker logs
的时候加一些参数来过滤log,默认输出所有log。
1
2
3
4
5
6
7
|
Options:
--details Show extra details provided to logs
-f, --follow Follow log output
--help Print usage
--since string Show logs since timestamp
--tail string Number of lines to show from the end of the logs (default "all")
-t, --timestamps Show timestamps
|
attach
实时查看stdout
如果你想实时查看容器的输出你可以用 docker attach CONTAINER
命令。
默认会绑定stdin,代理signals, 所以如果你 ctrl-c
容器通常会退出。很多时候大家并不想这样,只是想分离开,可以ctrl-p ctrl-q
。
执行任意command
可以通过docker exec CONTAINER COMMAND
,来在容器内执行任意 command,比如 cat 一些东西来debug。
1
2
3
4
5
6
|
$ docker run -d --name jstorm-zookeeper zookeeper:3.4
$ docker exec jstorm-zookeeper java -version
openjdk version "1.8.0_111-internal"
OpenJDK Runtime Environment (build 1.8.0_111-internal-alpine-r0-b14)
OpenJDK 64-Bit Server VM (build 25.111-b14, mixed mode)
|
也可以直接通过 exec 在容器内启动一个 shell 更方便地调试容器,不必一条条执行docker exec
。
1
2
3
|
$ docker exec -it jstorm-zookeeper /bin/bash
bash-4.3# pwd
/zookeeper-3.4.9
|
docker exec
只能在正在运行的容器上使用,如果已经停止了退出了就不行了,就只好用 docker logs
了。
重写entrypoint
和cmd
每个Docker镜像都有 entrypoint
和 cmd
, 可以定义在 Dockerfile
中,也可以在运行时指定。这两个概念很容易混淆,而且它们的试用方式也不同。
entrypoint
比 cmd
更”高级”,entrypoint
作为容器中pid为1的进程运行(docker不是虚拟机,只是隔离的进程。真正的linux中pid为1的是init
)。
cmd
只是 entrypoint
的参数:
1
|
<ENTRYPOINT> "<CMD>"
|
当我们没有指定 entrypoint
时缺省为 /bin/sh -c
。所以其实 entrypoint
是真正表达这个docker应该干什么的,通常大家有一个shell 脚本来代理。
entrypoint
和 cmd
都可以在运行的时候更改,通过更改来看这样设置entrypoint
是否优雅合理。
1
2
3
4
5
6
7
8
|
$ docker run -it --name jstorm-zookeeper --entrypoint /bin/bash zookeeper:3.4
bash-4.3# top
Mem: 320212K used, 1725368K free, 89112K shrd, 35532K buff, 130532K cached
CPU: 0% usr 0% sys 0% nic 100% idle 0% io 0% irq 0% sirq
Load average: 0.20 0.06 0.02 5/195 7
PID PPID USER STAT VSZ %VSZ CPU %CPU COMMAND
1 0 root S 6220 0% 0 0% /bin/bash
7 1 root R 1516 0% 2 0% top
|
任何 docker run
命令中在image名后的内容都作为cmd
的内容传给 entrypoint
当参数。
暂停容器
使用 docker pause
可以暂停容器中所有进程。这非常有用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
$ docker run -d --name jstorm-zookeeper zookeeper:3.4 && sleep 0.1 && docker pause jstorm-zookeeper && docker logs jstorm-zookeeper
a24405a53ddd9b7d94d9e77fe2b5a67639a251d681aa2f34fcb0cc96f347ba48
jstorm-zookeeper
ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
2016-12-18 16:17:47,720 [myid:] - INFO [main:QuorumPeerConfig@124] - Reading configuration from: /conf/zoo.cfg
2016-12-18 16:17:47,730 [myid:] - INFO [main:DatadirCleanupManager@78] - autopurge.snapRetainCount set to 3
2016-12-18 16:17:47,730 [myid:] - INFO [main:DatadirCleanupManager@79] - autopurge.purgeInterval set to 0
2016-12-18 16:17:47,730 [myid:] - INFO [main:DatadirCleanupManager@101] - Purge task is not scheduled.
2016-12-18 16:17:47,731 [myid:] - WARN [main:QuorumPeerMain@113] - Either no config or no quorum defined in config, running in standalone mode
2016-12-18 16:17:47,757 [myid:] - INFO [main:QuorumPeerConfig@124] - Reading configuration from: /conf/zoo.cfg
2016-12-18 16:17:47,757 [myid:] - INFO [main:ZooKeeperServerMain@96] - Starting server
$ docker unpause jstorm-zookeeper && docker logs jstorm-zookeeper
jstorm-zookeeper
ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
2016-12-18 16:17:47,720 [myid:] - INFO [main:QuorumPeerConfig@124] - Reading configuration from: /conf/zoo.cfg
2016-12-18 16:17:47,730 [myid:] - INFO [main:DatadirCleanupManager@78] - autopurge.snapRetainCount set to 3
2016-12-18 16:17:47,730 [myid:] - INFO [main:DatadirCleanupManager@79] - autopurge.purgeInterval set to 0
2016-12-18 16:17:47,730 [myid:] - INFO [main:DatadirCleanupManager@101] - Purge task is not scheduled.
2016-12-18 16:17:47,731 [myid:] - WARN [main:QuorumPeerMain@113] - Either no config or no quorum defined in config, running in standalone mode
2016-12-18 16:17:47,757 [myid:] - INFO [main:QuorumPeerConfig@124] - Reading configuration from: /conf/zoo.cfg
2016-12-18 16:17:47,757 [myid:] - INFO [main:ZooKeeperServerMain@96] - Starting server
2016-12-18 16:18:09,039 [myid:] - INFO [main:Environment@100] - Server environment:zookeeper.version=3.4.9-1757313, built on 08/23/2016 06:50 GMT
2016-12-18 16:18:09,040 [myid:] - INFO [main:Environment@100] - Server environment:host.name=a24405a53ddd
2016-12-18 16:18:09,040 [myid:] - INFO [main:Environment@100] - Server environment:java.version=1.8.0_111-internal
2016-12-18 16:18:09,040 [myid:] - INFO [main:Environment@100] - Server environment:java.vendor=Oracle Corporation
2016-12-18 16:18:09,040 [myid:] - INFO [main:Environment@100] - Server environment:java.home=/usr/lib/jvm/java-1.8-openjdk/jre
2016-12-18 16:18:09,040 [myid:] - INFO [main:Environment@100] - Server environment:java.class.path=/zookeeper-3.4.9/bin/../build/classes:/zookeeper-3.4.9/bin/../build/lib/*.jar:/zookeeper-3.4.9/bin/../lib/slf4j-log4j12-1.6.1.jar:/zookeeper-3.4.9/bin/../lib/slf4j-api-1.6.1.jar:/zookeeper-3.4.9/bin/../lib/netty-3.10.5.Final.jar:/zookeeper-3.4.9/bin/../lib/log4j-1.2.16.jar:/zookeeper-3.4.9/bin/../lib/jline-0.9.94.jar:/zookeeper-3.4.9/bin/../zookeeper-3.4.9.jar:/zookeeper-3.4.9/bin/../src/java/lib/*.jar:/conf:
2016-12-18 16:18:09,040 [myid:] - INFO [main:Environment@100] - Server environment:java.library.path=/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/server:/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64:/usr/lib/jvm/java-1.8-openjdk/jre/../lib/amd64:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
2016-12-18 16:18:09,041 [myid:] - INFO [main:Environment@100] - Server environment:java.io.tmpdir=/tmp
2016-12-18 16:18:09,041 [myid:] - INFO [main:Environment@100] - Server environment:java.compiler=<NA>
2016-12-18 16:18:09,043 [myid:] - INFO [main:Environment@100] - Server environment:os.name=Linux
2016-12-18 16:18:09,043 [myid:] - INFO [main:Environment@100] - Server environment:os.arch=amd64
2016-12-18 16:18:09,044 [myid:] - INFO [main:Environment@100] - Server environment:os.version=4.4.27-moby
2016-12-18 16:18:09,044 [myid:] - INFO [main:Environment@100] - Server environment:user.name=zookeeper
2016-12-18 16:18:09,044 [myid:] - INFO [main:Environment@100] - Server environment:user.home=/home/zookeeper
2016-12-18 16:18:09,044 [myid:] - INFO [main:Environment@100] - Server environment:user.dir=/zookeeper-3.4.9
2016-12-18 16:18:09,057 [myid:] - INFO [main:ZooKeeperServer@815] - tickTime set to 2000
2016-12-18 16:18:09,057 [myid:] - INFO [main:ZooKeeperServer@824] - minSessionTimeout set to -1
2016-12-18 16:18:09,058 [myid:] - INFO [main:ZooKeeperServer@833] - maxSessionTimeout set to -1
2016-12-18 16:18:09,076 [myid:] - INFO [main:NIOServerCnxnFactory@89] - binding to port 0.0.0.0/0.0.0.0:2181
|
top
和 stats
获得容器中进程的状态
docker top CONTAINER
和在容器里执行 top
的效果类似。
1
2
3
4
5
6
7
|
$ docker top jstorm-zookeeper
PID USER TIME COMMAND
24593 dockrema 0:01 /usr/lib/jvm/java-1.8-openjdk/jre/bin/java -Dzookeeper.log.dir=. .....
$ docker stats jstorm-zookeeper
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
jstorm-zookeeper 0.00% 24.86 MiB / 1.951 GiB 1.24% 648 B / 648 B 0 B / 0 B 20
|
通过 inspect
查看容器的详细信息
docker inspect CONTAINER
饭后镜像和容器的详细信息。比如:
- State —— 容器的当先状态
- LogPath —— history(stdout) file 的路径
- Config.Env —— 环境变量
- NetworkSettings.Ports —— 端口的映射关系
环境变量非常有用很多问题都是环境变量引起的。
history
查看 image layers
可以看到各层创建的指令,大小和哈希。可以用来检查这个image是否符合你的预期。
Docker 调试技巧相关推荐
- 转:Python 代码调试技巧
Python 代码调试技巧 转载于:https://www.cnblogs.com/kira2will/p/4254754.html
- 你可能不知道的 IDEA 高级调试技巧
作者:十光年 www.cnblogs.com/jun1019/p/9741224.html 一.条件断点 循环中经常用到这个技巧,比如:遍历1个大List的过程中,想让断点停在某个特定值. 参考上图, ...
- Javascript调试技巧整理
整理一下网上看到的实用调试技巧! 1. 不要使用alert 首先,alert只能打印出字符串,如果打印的对象不是String,则会调用toString()方法将该对象转成字符串(比如转成[object ...
- iphone XCode调试技巧之EXC_BAD_ACCESS中BUG解决
http://mobile.51cto.com/iphone-279455.htm XCode调试技巧之EXC_BAD_ACCESS中BUG解决是本文要介绍的内容,在iphone开发的时候EXC_BA ...
- Flutter调试技巧总结——高效开发的秘密
刚开始学前端的时候看到大家都是用的console.log()作为调试的手段,也可以说,很多人只会用console.log().在学习Flutter开发app的时候,我就在思考,除了使用print()来 ...
- [Cocoa]XCode的一些调试技巧
XCode的一些调试技巧 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 XCode 内置GDB,我 ...
- 你所不知道的 Android Studio 调试技巧
Android Studio目前已经成为开发Android的主要工具,用熟了可谓相当顺手.作为开发者,调试并发现bug,进而解决,可是我们的看家本领.正所谓,工欲善其事必先利其器,和其他开发工具一样, ...
- Postman 调试技巧
Postman 调试技巧 最为一个最基础的猿,我相信你已经掌握的一般接口使用Postman请求了. 如果你还在为下面问题发愁,你可以读下去. 1.后台验证通过请求header中的动态token. 2. ...
- 反调试技巧总结-原理和实现(1)(2)(3)(4)(5)(6)......
反调试技巧总结-原理和实现 -------------------------------------------------------------------------------------- ...
最新文章
- linux能安装音乐软件吗,Linux上如何安装使用音乐软件SoundCloud
- [轉]JavaScript获取HTML DOM父,子,临近节点
- 剑指offer:调整数组顺序使奇数位于偶数前面
- 电子书下载 | 超实用!阿里售后专家的 K8s 问题排查案例合集
- android arrays.xml 二维数组,android中怎的从xml文件中解析一个二维数组
- boost::log::visitation_result用法的测试程序
- 关于Android Fragment基础点(转)
- 浅谈python中的一般方法、静态方法(staticmethod)和类方法(classmethod)
- C语言实现去掉字符串中指定的字符
- 快速搭建Nextcloud+OnlyOffice私有云办公平台
- 前端职业规划 - 前端技术专家们的生死书
- 微软CEO:别被Google的TPU诱惑,Kinect“复活” | Build 2018
- 用__postback传递JavaScript变量到c#(pass a js variable to C# by a __postback )
- JD_Source Code for problem 1379
- win7便笺重启计算机后还有吗,Win7电脑关机后,记在便签小工具上的内容还在吗?...
- 2011年11月份第二周51Aspx源码发布详情
- 点对点视频分发:从早期互联网到ZB字节(Zettabyte)时代的分布式网络
- Flash选择合适的稳压芯片
- 解决Requirement already satisfied:问题
- 编程英语:常见代码错误 error 语句学习(12)
热门文章
- 从实例入手学习Shiro自定义Realm实现查询数据进行验证
- python导入词云包失败:ImportError:cannot import name ‘WordCloud’
- ElementUI的DateTimePicker组件修改时间格式
- 使用nexus3搭建maven私服(超详细,建议收藏)
- 【PPT 下载】神策 2017 数据驱动大会干货限时分享!
- 国际青年日,神策数据召唤优(有)质(志)青年
- 两道递推公式题的解题报告
- 人工智能学习体系大纲(src:http://blog.sina.com.cn/s/blog_7dbb766f0102xdwu.html)
- 移动端HTML5长按图片会选中页面中某个位置的文字
- 阿里云发布勒索病毒专杀工具:一键修复 彻底查杀