docker常用命令有哪些及怎么用


这篇“docker常用命令有哪些及怎么用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“docker常用命令有哪些及怎么用”文章吧。一、镜像相关1.1 列出本机所有镜像后面的操作,都以ubuntu做为练习的目标。另外:如果某些镜像文件不想要了,可以用下面的命令删除1.2 删除镜像docker rmi 镜像id(即:1.1图中的image id)有时候删除会失败,比如:有一个容器正在使用该镜像文件。这时可以加参数-f 强制删除,如果不清楚每个命令可以加哪些参数,可以用docker 命令 --help查看帮助,比如:二、容器相关2.1 最基本的启动docker run -it ubuntu参数-it的含义,可以用docker run –help查看,就不展开了2.2 启动后执行命令2.3 启动时指定容器名称容器名称是一个很有意思的东东,后面马上会讲到。上面的命令运行完以后,先用exit退出,以便后面学习其它命令。2.4 查看最近运行过的所有容器docker ps -a  
  从图上可以看出,如果启动时未显示指定容器名称,docker会自动生成一个好玩的名称,命令的风格大致是:什么样的_谁谁,比如图中的insane_lamarr,字面的意思为”疯狂的拉马尔”,从这些细节可以感受到,docker的创造者们都是一帮很爱玩的家伙。除了容器名称,还有二列非常重要:container id及status,其中status中以up开头的,表示容器正在运行(注:容器是否处于运行状态,排除人为docker stop的因素外,很大程序上是由docker run 最后的命令参数决定的,如果启动时不指定任何命令参数,默认执行/bin/bash,如果指定了类似echo “hello world”之类瞬间就执行完的命令,run起来,马上就会转为关闭,因为命令已经执行完了),而container id在很多场景中都会用到(比如:删除容器)
另外,对于同一个镜像(比如ubuntu),默认不指定容器名称的话,每次容器启动docker都会生成一个唯一的名称,这个有点象oop编程,镜像相当于class类定义,是一个只读的模板,而容器则是类的运行实例,java中每次new出来的实例,其hashcode必然不同,所以每次启动的docker容器,名称也不一样,只不过与oop不同的是,oop中实例消亡了,所有关联的信息全清掉了,而docker容器就算停止掉,docker仍会记住其最后的运行状态。可以做一个小试验,刚才我们已经创建了一个名为myubuntu的容器:这一行命令再次运行的话,就会报错:error response from daemon: conflict. the name “myubuntu” is already in use by container d1c261ad0b1e. you have to remove (or rename) that container to be able to reuse that name.大意是容器名称mybutun已经被另一个容器(id为d1c261ad0b1e)占用了,要么把原来的容器删除,要么换个名字。这其中的设计思想,可以仔细琢磨一二,想想也十分合理:类比一下,我们写代码时,同一个类new出多个实例,每个实例都会有自己不同的应用场景,比如:同样是一个order实例,可以用在订单创建的业务场景中,也可以用在订单查询的返回结果中…,docker的镜像也是如此,同样一个ubuntu镜像文件,有人用它创建容器是为了安装nginx当成web server,有人用它创建容器是为了学习hadoop…,为了能以一种友好的方式来区分,所以名字不能冲突,然后,同一个名字的容器,今天安装了软件a,玩事儿后将它关闭,明天可能会继续在这个容器上折腾其它事情,所以每次容器停止,不可能象oop中的实例一样,彻底丢弃实例的所有信息,否则明天就没办法接着玩了。2.5 停止运行中的容器docker stop 容器名称2.6 删除容器docker rm 容器id如果容器处于运行状态,上面的操作会失败,可以加-f参数强制删除  2.7 在已运行的容器中,直接执行命令docker exec 容器名称 命令例如:  docker exec myubuntu apg-get update2.8 附加到已经运行的容器docker attach 容器名称注:该命令运行后,mac上屏幕没任何输出,还以为卡死了,这是假象,直接继续输入命令,比如pwd之类的就能看到结果了.attach这个命令不太好用,进入终端后,没办法退出而不停止容器,要退出只能输入exit,但这样就将容器停止了,另外一个缺点是,如果多个容器同时attach到相同的容器,在一个窗口中操作的结果,会同步显示到所有窗口。建议用下面的命令代替:docker exec -it 容器名称 sh当然进入容器还有其它一些办法,比如网络端口22映射本机某个端口,容器里启动ssh服务,然后ssh连接进入,或者用nsenter结合进程id进入,但个人觉得这些方法操作都太复杂,远不如上面这行命令简单2.9 保存对容器所做的修改在容器上做了一堆操作后,比如在ubuntu的基础上安装了一些软件、部署了一些应用之类,希望分发到其它机器,最简单的办法就是把容器重新生成一个新镜像,然后其它人直接docker pull你的新镜像就可以了。docker commit -a作者名字 -m 提交原因 -p 容器id 镜像名称:版本号比如:提交完成后,可以
从图中可以看出,在ubuntu原来的基础上,生成一个名为yjmyzz/ubuntu的新镜像,然后用新镜像创建容器试试看三、卷(volumn)相关我们平时在使用电脑的过程中,会经常通过usb插入一些外部存储设备,比如:u盘之类,插好后,就能象常规硬盘目录一样访问外部存储设备。卷(volume)的意思其实跟这个差不多,可以把host机上的某个目录”插入”到容器中,然后容器中就能直接访问host机上的文件了,即使容器删除掉,卷里的数据仍然可能持久保存。3.1 创建卷这个命令略长,但并不复杂,跟前面提到的启动容器相比,只是多了一个-v /users/yjmyzz/docker_volumn:/opt/webapp的部分,意思就是将本机/users/yjmyzz/docker_volumn这个目录映射到容器中的/opt/webapp,启动成功后,保持当前窗口不退出,可以再新开一个terminal容器,进入容器验证一下可以尝试在host本机修改下/users/yjmyzz 香港云主机/docker_volumn/index.html这个文件,然后在容器中cat看下内容,应该马上就能看到最新的内容。三个大坑:其一:-v 参数可以只写前面第一部分,-v /users/yjmyzz/docker_volumn 这样启动也不会报错,但是这样做的效果,在最新版本的docker(1.9.1)上,只会把本机目录挂到容器中,容器中看不到本机的任何文件,所以一定要记得写:后的部分其二:权限问题,mac机上如果从网上down(非apple store官方)了一个文件到本机,该文件甚至保存文件的目录权限,都会被设置成特殊权限@,见下面的截图:这本来是mac 10.5以后做的一项安全改进,有此标识的程序,在首次执行时会提示但是有这类特殊权限的目录或文件,被挂到容器中后,docker容器内根本看不到,也就是无权读取。处理办法:ll -l@ -a先用这个显示特殊权限的详细信息:然后用xattr -r -d 详细信息 * 去掉这些特殊权限(参考下图),然后再重新挂到容器中,就能正常使用了其三:mac上挂载的本机目录,必须是在~/(即:当前用户的目录)下,类似/opt/www这样的目录,就算给它所有权限,挂到容器中后,也只能看到目录,读不到任何文件,centos上没这问题。此外,还可以用命令查看此时容器的所有状态,会看到一段长长的json输出,类似下面这样:90~97行的mounts节点描述了当前容器挂载的”卷”信息。最后指出一点:目前docker仅支持在run(创建)容器时使用-v创建卷,对于一个已经start的容器,如果想动态添加卷,是十分困难的。虽然国外有牛人,实现了在容器启动后动态添加卷,但过程十分曲折,而且并不能能用,有兴趣的可以参考下面的文章3.2 列出所有卷docker volume ls3.3 删除卷docker volume rm 卷名称注:删除一个容器时,默认不会删除容器关联的卷,所以随着时间的推移,host上可能会存在大量的”僵尸”卷,占用硬盘空间。建议每次docker rm 容器时,加上参数-v,这样删除容器时会一并将对应的卷删除,但是这样也会有一个副作用,如果多个容器同时关联到同一个卷,可能会影响到其它容器。所以在使用卷的时候要规划清楚,最好一个容器只对应一个卷。tips:如果要批量删除所有卷,一个一个rm显然太麻烦了,可以用下面的方式快速搞定a) 进入docker虚拟机defautdocker-machine ssh defaultb) 查看volume所在的目录c)切换到sudo模式sudo -id) 进入volume所在根目录  上图的ls命令已经说明,所谓的数据卷,其实就是一个个目录,再次印证了linux里的一句名言『一切皆是文件』,剩下的事情,地球人都知道了,邪恶的rm -rf *,最后还要重启虚拟机,退回到mac主机3.4 数据卷容器如果多个容器之间希望共享一份数据,除了上面的方式外,docker还允许定义一个专用的容器,这个容器啥也不干,只用来放数据,这种容器称为『数据卷容器』示例:上面的命令跟之前创建卷的完全一样,现在我们有了一个名为site_files的数据卷容器,注意:创建数据卷容器时,最后的命令通常都是些打酱油的echo之类,反正只是一个存数据的容器,不用执行其它命令,甚至它本身都不需要处于启动状态。然后,其它容器创建时,就可以使用它了:注意上面的--volumes-from site_files这个就是使用数据卷容器的关键,其它跟之前的完全相同,多个容器可以挂同一个数据卷容器,一个容器也可以挂多个数据卷容器。四、网络相关4.1 端口映射上面的参数表示将本机ip上的hostport映射到容器的container_port,示例:  这个命令更长了,结合了之前所有学习到的参数,注意多出的问题-p 0.0.0.0:10080:80,表示将本机10080端口映射到容器80端口 注:如果把-p换成大写的-p,系统会随机映射到本机一个空闲的端口号 4.2 指定hostname默认创建容器时,hostname是一个唯一的随机字符串,很难记,可以在docker run -h hostname名称来指定,这个就不演示了4.3 容器间的网络连接假如有二个容器mysql, appserver,通常appserver中要访问数据库,所以需要appserver能直接访问mysql,下面演示了如何实现:a) 先创建mysql容器b) 再创建appserver容器  注意其中的–link mysql:mysqlserver,冒号前的为容器名称,冒号后的为容器别名,启动后appserver中就能直接ping通mysql容器了,见下图:注:这个连接是单向的,即appserver可以ping通mysql容器,但反过来不行。而且最新版的docker在ps时,name列也不再象之前网上说的那个显示成a/b这种格式,要查看一个容器是否有连接,最直接的方式还是docker inspect 容器名称以上就是关于“docker常用命令有哪些及怎么用”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注开发云行业资讯频道。

相关推荐: Java网络编程TCP怎么实现聊天功能

这篇“Java网络编程TCP怎么实现聊天功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java网络编程TCP怎么实现聊天功能”文章吧。1、首…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 07/03 22:13
下一篇 07/03 22:13

相关推荐