阿里云
阿里云多端小程序中小企业获客首选
发表主题 回复主题
  • 742阅读
  • 0回复

[环境部署]一些 Docker 的技巧

级别: 论坛版主
发帖
371
云币
447

原文 Some Docker Tips and Tricks 由 Wouter Danes 编写 j% USu+&  
U9fF;[g  
7C?mD75j  
Docker 可能一开始让你望而生畏,但确实是一个非常伟大的工具。用 Shells 工作令人烦扰,并且有陷阱。鉴于我花了很多时间才弄明白它,所以我想写这篇文章来避免你们做无用功。这篇文章列举了一些快速技巧、秘诀和单行脚本,帮助你更有效地使用 Docker 。 U6'haPlOk%  
e, 0I~:  
~5!TV,>ls  
移除所有的容器和镜像(大扫除) 8Gg/M%wq9U  
用一行命令大扫除: c2mt<DtWW  
^?]H$e  
v_h*:c  
  1. docker kill $(docker ps -q) ; docker rm $(docker ps -a -q) ; docker rmi $(docker images -q -a)
Y4qyy\}  
N b[o6AX  
A^@<+?  
注:shell 中的 $() 和 `` 类似,会先执行这里面的内容,上面的脚本会出现如下 docker kill "pids" ; docker kill 在 docker 中用于停止容器,docker rm 删除容器, docker rmi 删除镜像 HgATH  
当没有运行的容器或者是根本没有容器的时候,这只会提示一个警告信息。当你想尝试的时候,这就是个非常好的单行命令。如果你仅仅想删除所有的容器,你可以运行如下命令: sfPN\^k2  
7-IeJ6,D  
khIa9Nm  
  1. docker kill $(docker ps -q) ; docker rm $(docker ps -a -q)
PQ"%Z.F"  
9Zsb1 M!n>  
}~'Wz*Gm  
退出时删除容器 7<o;3gR7Kj  
如果你仅仅想在一个容器中快速的运行一个命令,然后退出,并且不用担心容器状态,把 --rm 参数加入 run 命令后面,这将结束很多你保存了的容器,并且清理它们。 &p4<@k\L  
GiwA$^Hg\  
sLqvDH?V  
示例:docker run --rm -i -t busybox /bin/bash TC{Qu;`H+U  
$cU/Im`  
}F`2$ Q+CW  
不在 Shell 上运行命令 [gp:nxyfQm  
如果你使用需要Shell 的扩展项的 docker run 命令处理某些事情,比如 docker run --rm busybox ls '/var/log/*', 这个命令将失败。这个失败的原因我花了工夫才弄明白。这个陷阱在这里:你原来没有 Shell , 而 ```* 是 Shell 的扩展项,因此你需要一个能使用的 Shell 。正确方法为: Z|S7 " ,  
Ht^2)~e~:  
Y(Ezw !a  
  1. docker run --rm busybox sh -c 'ls /var/log/*'
nnl9I4-O  
X hX'*{3k  
,6Q-k4_  
Boot2Docker 和 LapTops 处理 DNS 问题的方法 O9)}:++T  
由于这个原因, Boot2Docker 会占用 DNS 服务很长一段时间。当你在尝试创建镜像的时候,可能会得到离谱的错误。如果你在 Ubuntu 或者 CentOS 上看到下面的提示: ea>\.D-S  
R >&/n/l  
<XrGr5=BV  
  1. cannot lookup archive.ubuntu.com
Wj=ex3K3u.  
$i>VI  
JW'acD  
聪明的做法是停止,然后启动 boot2docker 。 mJR T+SZ  
A'(F%0NF6  
Vp{2Z9]}  
  1. boot2docker-cli down && boot2docker-cli up
%pQ o%<d  
zRFM/IYC  
*7ro [  
这样问题就解决了。 $Xc<K_Z  
*S_Iza #&x  
Pv.@Y 30  
Volumes 解决 docker logs 和 docker copy 问题 p,Hk"DSs%  
如果你想在一个容器中监控另一个容器中的日志文件和文件的使用,你可以看看 volumes ,例如,检查 tomcat 是否启动: IuW10}"9  
AI;=k  
xR`2+t&t  
  1. tomcat_id=$(docker run -d -v /var/log/tomcat6 wouterd/tomcat6)
  2. # Give Tomcat some time to wake up...
  3. sleep 5
  4. while ! docker run --rm --volumes-from ${tomcat_id} busybox /bin/sh -c "grep -i -q 'INFO: Server startup in' /var/log/tomcat6/catalina*.log" ; do
  5.     echo -n "."
  6.     sleep 5
  7. done
cSk}53  
N&`ay{&`:  
!;Nh7vG  
你还可以在一个 Dockerfile中指定 volumes ,这个在我前面的博客文章中结合 Docker 连载了。 'Sh5W%NM  
\9QOrjiw  
>K%x44|  
Docker Inspect 结合 Go Templates 的好处 JvaaBXkS\  
命令 docker inspect 允许使用 Go Templates 来格式化inspect 命令的输出信息如果你擅长这个,你能获取很多 docker 容器命令行的脚本输出信息。这是一个获取正在运行的容器 IP 的示例: `,d7_#9'  
j3&*wU_  
m5{SPa,y  
  1. container_ip=$(docker inspect --format '{{.NetworkSettings.IPAddress}}' ${container_id})
bp,CvQ'}a  
>O~5s.1u  
sc60:IxgI  
这里有一个笨的技巧,用于得到匹配所有暴露(exposed)的端口 host:port ,并且把他们输入一个 java properties 文件: UXHFti/A<  
m.1BLN[9  
)zo ;r!eP  
  1. sut_ip=${BOOT_2_DOCKER_HOST_IP}
  2. template='{{ range $key, $value := .NetworkSettings.Ports }}{{ $key }}='"${BOOT_2_DOCKER_HOST_IP}:"'{{ (index $value 0).HostPort }} {{ end }}'
  3. tomcat_host_port=$(docker inspect --format="${template}" ${container_id})
  4. for line in ${tomcat_host_port} ; do
  5.     echo "${line}" >> ${work_dir}/docker_container_hosts.properties
  6. done
KL4/"$l]  
kM`#U *j  
本人不是云栖社区工作人员。
无论您在使用中遇到什么问题,不要出言不逊!谢谢合作!
发表主题 回复主题
« 返回列表上一主题下一主题

限100 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
验证问题: 阿里云官网域名是什么? 正确答案:www.aliyun.com
上一个 下一个
      ×
      全新阿里云开发者社区, 去探索开发者的新世界吧!
      一站式的体验,更多的精彩!
      通过下面领域大门,一起探索新的技术世界吧~ (点击图标进入)