0%

docker随手记

试用了两天docker,感觉真的不错,顿时就有把自己的所有程序都容器化了的想法。现在docker火的不得了,网上的讨论非常多,但docker毕竟是个新事物,想要PK vm多年的历史经验还有很长的路。以下是一些最近使用docker时遇到的问题的总结,当一个cheat sheet放着吧。

如何停止/删除所有的container?

测试用docker的时候,会生成大量的container,一个一个删除有点费事,可以使用以下的shell语句来停止/删除所有的container:

1
2
docker stop $(docker ps -a -q) 
docker rm $(docker ps -a -q)

detach和attach

使用docker run的时候加入-d参数,启动的容器就会在后台运行,此时使用docker attach就可以把在后台运行的docker置于前台,此时可以使用ctrl+p,ctrl+q只两个组合键来推出容器。
stackoverflow上有人指出了detach和attach的详细用法:

1
2
3
4
docker run -t -i → can be detached with ^P^Q and reattached with docker attach
docker run -i → cannot be detached with ^P^Q; will disrupt stdin
docker run → cannot be detached with ^P^Q; can SIGKILL client; can reattach with docker attach

实际上attach后支持的行为和run的时候加不加-i -t参数有比较大的关系。
参见http://stackoverflow.com/questions/20145717/how-to-detach-from-a-docker-container

docker使用宿主机的本地时间

docker中的时区可能和宿主机的时区不同,对此可以在启动的时候将本地的/etc/localtime映射到docker系统里面去,如下面的操作就可以了:

1
docker run --rm -t -i -v /etc/localtime:/etc/localtime:ro centos:centos6 date

docker中的crontab无法执行

我在docker官方提供的centos6镜像中发现crontab即使安装了也没法执行(使用yum install crontabs就可以进行安装了),此时关闭crond服务,使用crond -i 命令来启动crond,结果在/var/log/cron中发现了以下的错误:

FAILED to open PAM security session (Cannot make/remove an entry for the specified session)

网上的一个解决方案是编辑/etc/pam.d/crond,将其中的required修改为sufficient就可以了
尝试后果然可行.

修改docker镜像存储位置

现在的docker版本实际上并未提供指定docker镜像等目录位置的配置,所有docker相关的文件会被存储到/var/lib/docker目录下。对此网上有很多讨论,但是目前的解决方法基本上就是使用软连接等方法,将/var/lib/docker目录转移到其他的地方。
有人建议使用mount而不是软连接的方式来进行docker镜像位置的转移,因为软连接可能会造成一些程序问题,可以使用以下的命令将docker文件的存储位置修改到其他地方去:

1
mount -o bind /var/lib/docker /new/var/lib/docker
如果我的文字帮到了您,那么可不可以请我喝罐可乐?