• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
导航菜单
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx
您的位置:首页 > 服务器 >虚拟化 > docker常用命令操作方法

docker常用命令操作方法

作者:杨俊明 字体:[增加 减小] 来源:互联网

本文主要包含docker常用命令,docker,常用命令详解等服务器相关知识,杨俊明 希望可以进行参考

继续docker的学习之旅,今天练习一些常用的命令:

一、镜像相关

1.1 列出本机所有镜像

后面的操作,都以ubuntu做为练习的目标。

另外:如果某些镜像文件不想要了,可以用下面的命令删除

1.2 删除镜像

docker rmi 镜像Id(即:1.1图中的IMAGE ID)

有时候删除会失败,比如:有一个容器正在使用该镜像文件。这时可以加参数-f 强制删除,如果不清楚每个命令可以加哪些参数,可以用

docker 命令 --help

查看帮助,比如:

 bin docker rmi --help
Usage: docker rmi [OPTIONS] IMAGE [IMAGE...]
Remove one or more images
 -f, --force=false Force removal of the image
 --help=false   Print usage
 --no-prune=false  Do not delete untagged parents

二、容器相关

2.1 最基本的启动

docker run -it ubuntu

参数-it的含义,可以用docker run --help查看,就不展开了

2.2 启动后执行命令

docker run -it ubuntu echo 'hello world'

2.3 启动时指定容器名称

docker run -it --name 'myubuntu' ubuntu

容器名称是一个很有意思的东东,后面马上会讲到。上面的命令运行完以后,先用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的容器:

docker run -it --name 'myubuntu' ubuntu

这一行命令再次运行的话,就会报错:

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 update

2.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 镜像名称:版本号

比如:

docker commit -a 'yjmyzz' -m 'test commit' -p d1c261ad0b1e yjmyzz/ubuntu:V2

提交完成后,可以

docker images 查看


从图中可以看出,在ubuntu原来的基础上,生成一个名为yjmyzz/ubuntu的新镜像,然后用新镜像创建容器试试看

docker run -it --name 'myubuntu2' yjmyzz/ubuntu:V2 

三、卷(volumn)相关

我们平时在使用电脑的过程中,会经常通过usb插入一些外部存储设备,比如:u盘之类,插好后,就能象常规硬盘目录一样访问外部存储设备。卷(volume)的意思其实跟这个差不多,可以把host机上的某个目录"插入"到容器中,然后容器中就能直接访问host机上的文件了,即使容器删除掉,卷里的数据仍然可能持久保存。

3.1 创建卷

docker run -it -v /Users/yjmyzz/docker_volumn:/opt/webapp --name myubuntu ubuntu /bin/bash

这个命令略长,但并不复杂,跟前面提到的启动容器相比,只是多了一个-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 详细信息 * 去掉这些特殊权限(参考下图),然后再重新挂到容器中,就能正常使用了

其三:

m

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • docker常用命令操作方法

相关文章

  • 通过UI管理docker的方法
  • VirtualBox 配置虚拟网卡(桥接),实现主机-虚拟机网络互通(图文教程)
  • docker 数据卷之进阶篇
  • 详解Docker下使用Elasticsearch可视化Kibana
  • Fuel 30 分钟快速安装OpenStack(图文教程)
  • Docker部署Django应用的示例
  • Linux下Docker CE使用从包中安装的方式详解
  • Docker下mysql设置字符集的方法
  • 深入了解docker(docker镜像、容器、仓库的基本概念)
  • Docker容器中Mysql数据的导入/导出详解

文章分类

  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx

最近更新的内容

    • Docker使用Swarm组建集群的方法
    • 使用Docker搭建Django,Nginx,R,Python部署环境的方法
    • 详解基于docker-swarm搭建持续集成集群服务
    • VMware虚拟机nat模式连不上网的解决方法
    • Docker 运行时的用户与组管理的方法
    • 详解给Ocelot做一个Docker镜像
    • 详解docker容器间通信的一种方法
    • Docker 网络之端口绑定的方法
    • Docker Cloud实现部署应用操作详解
    • docker添加多网卡的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有