JSON

关于docker的15个小tip(技巧)

字号+ 作者:H5之家 来源:H5之家 2017-08-28 12:00 我要评论( )

关于docker的15个小tip(技巧)

1. 获取最近运行容器的id


这是我们经常会用到的一个操作,按照官方示例,你可以这样做(环境ubuntu):




$ ID=$(docker run ubuntu echo hello world)

hello world

$ docker commit $ID helloworld

fd08a884dc79



这种方式在编写脚本的时候很有用,比如你想在脚本中批量获取id,然后进一步操作。但是这种方式要求你必须给ID赋值,如果是直接敲命令,这样做就不太方便了。 这时,你可以换一种方式:




$ alias dl='docker ps -l -q'

$ docker run ubuntu echo hello world

hello world

$ dl

1904cf045887

$ docker commit `dl` helloworld

fd08a884dc79


docker ps -l -q命令将返回最近运行的容器的id,通过设置别名(alias),dl命令就是获取最近容器的id。这样,就无需再输入冗长的docker ps -l -q命令了。通过两个斜引号“,可以获取dl命令的值,也就是最近运行的容器的id。


2.尽量在Dockerfile中指定要安装的软件,而不用Docker容器的shell直接安装软件


说实话,我有时候也喜欢在shell中安装软件,也许你也一样,喜欢在shell中把所有软件安装都搞定。但是,搞来搞去,最后还是发现,你还是需要在Doockerfile中指定安装文件。在shell中安装软件,你要这样做:




$ docker run -i -t ubuntu bash #登陆到docker容器

root@db0c3967abf8:/#


然后输入下面的命令来安装文件:




apt-get install postgresql


然后再调用exit:




root@db0c3978abf8:/# exit


退出docker容器,再给docker commit命令传递一个复杂的JSON字符串来提交新的镜像:




$ docker commit -run=”{“Cmd”:[“postgres”,”-too -many -opts”] }” `dl` postgres


太麻烦了,不是吗?还是在Dockerfile中指定安装文件吧,只要两个步骤:


1.在一个小巧的Dockerfile中,指定当前操作的镜像为FROM命令的参数


2.然后在Dockerfile中指定一些docker的命令,如CMD, ENTERPOINT, VOLUME等等来指定安装的软件 


3.超-超-超级用户


你可能需要一直用超级用户来操作docker,就像早期示例里一直提示的:




# 添加docker用户组

$ sudo groupadd docker

# 把自己加到docker用户组中

$ sudo gpasswd -a myusername docker

# 重启docker后台服务

$ sudo service docker restart

# 注销,然后再登陆

$ exit


Wow!连续三个sudo!三次化身“超级用户”,真可谓是“超-超-超级用户”啊!别担心,设置完毕,以后你就再也不用打那么多sudo了!


4. 清理垃圾


如果你想删除所有停止运行的容器,用这个命令:




$ docker rm $(docker ps -a -q)


顺便说一句,docker ps命令很慢,不知道为啥这么慢,按理说Go语言是很快的啊。docker ps -a -q命令列出所有容器的id,然后根据id删除容器。docker rm命令遇到正在运行的容器就会失效,所以这个命令完美的删除了所有没在运行的容器。


5. docker inspect输出结果的解析利器:jq


要对docker inspect的输出结果进行过滤,一般情况下,用grep命令,你需要这样操作:




$docker inspect `dl` | grep IPAddress | cut -d ‘“‘ -f 4 172.17.0.52


哦!看上去很复杂,用jq吧,专业解析docker inspect输出结果,具有更强的可读性,方便易用:




$docker inspect `dl` | jq -r ‘.[0].NetworkSettings.IPAddress' 172.17.0.52


其中第一个'.'代表所有的结果。'[0]'代表数组的第一个元素。就像JavaScript访问一个JSON对象一样,简单方便。


6.镜像有哪些环境变量?


有时候,你需要知道自己创建的镜像有哪些环境变量。简单!只要这样:




$ docker run ubuntu env


输出结果如下:




HOME=/

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

container=lxc

HOSTNAME=5e1560b7f757


调用env查看环境变量,对于后面要讲到的“链接”(-link)很有用,在连接两个容器时候需要用到这些环境变量,具体请看最后一个要点“链接”。


7.RUN命令 vs CMD命令


Docker的新手用户比较容易混淆RUN和CMD这两个命令。


RUN命令在构建(Build)Docker时执行,这时CMD命令不执行。CMD命令在RUN命令执行时才执行。我们来理清关系,假设Dockerfile内容如下:


FROM thelanddownunder


MAINTAINER crocdundee 


我们要向系统中安装一些软件,那么:




# docker build将会执行下面的命令:

RUN apt-get update

RUN apt-get install softwares

# dokcer run默认执行下面的命令:

CMD [“softwares”]


Build时执行RUN,RUN时执行CMD,也就是说,CMD才是镜像最终执行的命令。


8.CMD命令 vs ENTRYPOINT命令


又是两条容易混淆的命令!具体细节我们就不说了,举个例子,假设一个容器的Dockerfile指定CMD命令,如下:




FROM ubuntu

CMD [“echo”]


另一个容器的Dockerfile指定ENTRYPOINT命令,如下:




FROM ubuntu

ENTRYPOINT [“echo”]


运行第一个容器:




docker run image1 echo hello


得到的结果:


hello


运行第二个容器:




docker run image2 echo hello


得到的结果:


echo hello


看到不同了吧?实际上,CMD命令是可覆盖的,docker run后面输入的命令与CMD指定的命令匹配时,会把CMD指定的命令替换成docker run中带的命令。而ENTRYPOINT指定的命令只是一个“入口”,docker run后面的内容会全部传给这个“入口”,而不是进行命令的替换,所以得到的结果就是“echo hello”。


9.Docker容器有自己的IP地址吗?


 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
网友点评