Docker使用过程中的一些注意事项
前言
Docker并不是一个新的技术,容器化也不是,早在2006年就陆续出现了LXC,OpenVZ,Jail等容器虚拟化技术,但是为什么Docker却能异军突起呢?Docker的核心是基于Linux的CGroup、Namespace和LayeredFS技术,通过资源的控制、隔离和对镜像的分层处理,是Docker容器能够将应用程序和运行环境打包到一起,这样就可以Build,ShipAndRunanywhere。与其说是Docker火,不如说是其天生的轻量级属性,正好迎合了云计算大行其道的今天。因此,笔者认为Docker改变整个云计算和互联网的格局是迟早的事,但是Docker在使用中,需要注意哪些事项呢?
一、挂载volumes
dockerrun的时候,如果需要挂载宿主机的某个目录,可以这样
dockerrun-it-v<host-path>:<container-path><image>
这里要注意以下几个地方:
1、<host-path>和<container-path>都必须是目录
2、<container-path>必须是容器中的绝对路径
3、<host-path>路径如果不存在,执行完成之后,docker会给宿主机创建该目录;<host-path>可以使用相对路径,但是相对的并不是当前的工作目录,而是/var/lib/docker/volumes/
4、如果只有一个路径,比如dockerrun-it-v<path><image>,这种情况叫做匿名挂载,<image>表示的是container中的位置,宿主机会在/var/lib/docker/volumes/下随机创建一个目录与container中的<path>对应
5、不管以何种方式mount,容器销毁之后,由-v在宿主机上创建的目录不会销毁
6、在container中可以修改挂载目录下文件的属性,并且在宿主机上查看时一样会生效。但是需要注意一点,如果在container中修改了文件的owner为John,在宿主机上产看的时候,该文件的owner不一定还是John。但该文件的uid是一样的,至于显示的名称不一样,是因为container和host的/etc/passwd文件内容不同
以上结果都可以通过dockerinspect<container>结果中的Mounts查看。
二、dockerfile中的ENTRYPOINT和CMD
看似一样,都是实现container启动命令,但是需要注意:
1、都有两种方式,数组方式,以及shell方式
["sh","-c","echohello"] sh-c'echohello'
2、ENTRYPOINT除了指定container入口之外,更重要的作用是:通过它可以让一个container像一个executable一样。比如
ENTRYPOINT["/bin/sh"]
之后build出来的镜像就像一个sh程序文件一样,运行该image,就像运行sh程序。
3、如果ENTRYPOINT指定了,并且采用了数组方式,即["exectable","para1","para2"],那么CMD指定的内容会被视为ENTRYPOINT数组中最后的一个参数
4、如果ENTRYPOINT使用shell方式,那么它会覆盖所有的CMD以及dockerrun后面指定的command
5、dockerrun后面指定的command会取代CMD的内容
总结
以上就是为大家总结的一些个人在使用Docker时曾掉过的坑,希望分享出来让大家在使用Docker的时候能避免这些问题,以上就是这篇文章的全部内容,希望对大家能有所帮助。