UDN-企业互联网技术人气社区

板块导航

浏览  : 1899
回复  : 0

[教程技巧] 深入浅出Docker(二):Docker命令行探秘

[复制链接]
cat77的头像 楼主
发表于 2015-7-8 08:37:42 | 显示全部楼层 |阅读模式
  1. Docker命令行

  Docker官方为了让用户快速了解Docker,提供了一个交互式教程,旨在帮助用户掌握Docker命令行的使用方法。但是由于Docker技术的快速发展,此交互式教程已经无法满足Docker用户的实际使用需求,所以让我们一起开始一次真正的命令行学习之旅。首先,Docker的命令清单可以通过运行 docker ,或者 docker help 命令得到:
  1. $ sudo docker
复制代码

20150704175531.png

  在Docker容器技术不断演化的过程中,Docker的子命令已经达到34个之多,其中核心子命令(例如:run)还会有复杂的参数配置。笔者通过结合功能和应用场景方面的考虑,把命令行划分为4个部分,方便我们快速概览Docker命令行的组成结构:
virtualization.png

virtualization.png



  1.1 参数约定

  单个字符的参数可以放在一起组合配置,例如
  1. docker run -t -i --name test busybox sh
复制代码

  可以用这样的方式等同:
  1. docker run -ti --name test busybox sh
复制代码
  1.2 Boolean

  Boolean参数形式如: -d=false。注意,当你声明这个Boolean参数时,比如 docker run -d=true,它将直接把启动的Container挂起放在后台运行。

  1.3 字符串和数字

  参数如 --name=“” 定义一个字符串,它仅能被定义一次。同类型的如-c=0 定义一个数字,它也只能被定义一次。

  1.4 后台进程

  Docker后台进程是一个常驻后台的系统进程,值得注意的是Docker使用同一个文件来支持客户端和后台进程,其中角色切换通过-d来实现。这个后台进程是用来管理容器的,使用Docker --help可以得到更详细的功能参数配置, 如下图:
20150704175531.png

  Docker后台进程参数清单如下表:
20150708083529.png


20150708083604.png


20150708083628.png



  注意,其中带有[] 的启动参数可以指定多次,例如
  1. $ docker run -a stdin -a stdout -a stderr -i -t ubuntu /bin/bash
复制代码

  2. Docker命令行探秘

  2.1 环境信息相关

  info

  使用方法: docker info

  例子:
  1. [fedora@docker-devel-cli docker]$ sudo docker -D info
  2. Containers: 0
  3. Images: 32
  4. Storage Driver: devicemapper
  5. Pool Name: docker-252:1-130159-pool
  6. Data file: /var/lib/docker/devicemapper/devicemapper/data
  7. Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata
  8. Data Space Used: 1616.9 Mb
  9. Data Space Total: 102400.0 Mb
  10. Metadata Space Used: 2.4 Mb
  11. Metadata Space Total: 2048.0 Mb
  12. Execution Driver: native-0.2
  13. Kernel Version: 3.11.10-301.fc20.x86_64
  14. Debug mode (server): false
  15. Debug mode (client): true
  16. Fds: 11
  17. Goroutines: 14
  18. EventsListeners: 0
  19. Init SHA1: 2c5adb59737b8a01fa3fb968519a43fe140bc9c9
  20. Init Path: /usr/libexec/docker/dockerinit
  21. Sockets: [fd://]
复制代码

  使用说明:

  这个命令在开发者报告Bug时会非常有用,结合docker vesion一起,可以随时使用这个命令把本地的配置信息提供出来,方便Docker的开发者快速定位问题。

  version

  使用方法: docker version

  使用说明:

  显示Docker的版本号,API版本号,Git commit, Docker客户端和后台进程的Go版本号。

  2.2 系统运维相关

  attach

  使用方法: docker attach [OPTIONS] CONTAINER

  例子:
  1. $ ID=$(sudo docker run -d ubuntu /usr/bin/top -b)
  2. $ sudo docker attach $ID
  3. top - 17:21:49 up  5:53,  0 users,  load average: 0.63, 1.15, 0.78
  4. Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
  5. %Cpu(s):  1.0 us,  0.7 sy,  0.0 ni, 97.7 id,  0.7 wa,  0.0 hi,  0.0 si,  0.0 st
  6. KiB Mem:   2051644 total,   723700 used,  1327944 free,    33032 buffers
  7. KiB Swap:   0 total,   0 used,  0 free.   565836 cached Mem

  8.   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
  9.     1 root      20   0   19748   1280   1008 R  0.0  0.1   0:00.04 top
  10. $ sudo docker stop $ID
复制代码

  使用说明:

  使用这个命令可以挂载正在后台运行的容器,在开发应用的过程中运用这个命令可以随时观察容器內进程的运行状况。开发者在开发应用的场景中,这个命令是一个非常有用的命令。

  build

  使用方法:docker build [OPTIONS] PATH | URL | -

  例子:
  1. $ docker build .
  2. Uploading context 18.829 MB
  3. Uploading context
  4. Step 0 : FROM busybox
  5. ---> 769b9341d937
  6. Step 1 : CMD echo Hello world
  7. ---> Using cache
  8. ---> 99cc1ad10469
  9. Successfully built 99cc1ad10469
复制代码

  使用说明:

  这个命令是从源码构建新Image的命令。因为Image是分层的,最关键的Base Image是如何构建的是用户比较关心的,Docker官方文档给出了构建方法,请参考这里。

  commit

  使用方法:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

  例子:
  1. $ sudo docker ps
  2. ID                  IMAGE               COMMAND             CREATED             STATUS              PORTS
  3. c3f279d17e0a        ubuntu:12.04        /bin/bash           7 days ago          Up 25 hours
  4. 197387f1b436        ubuntu:12.04        /bin/bash           7 days ago          Up 25 hours
  5. $ docker commit c3f279d17e0a  SvenDowideit/testimage:version3
  6. f5283438590d
  7. $ docker images | head
  8. REPOSITORY                        TAG                 ID                  CREATED             VIRTUAL SIZE
  9. SvenDowideit/testimage            version3            f5283438590d        16 seconds ago      335.7 MB
复制代码

  使用说明:

  这个命令的用处在于把有修改的container提交成新的Image,然后导出此Imange分发给其他场景中调试使用。Docker官方的建议是,当你在调试完Image的问题后,应该写一个新的Dockerfile文件来维护此Image。commit命令仅是一个临时创建Imange的辅助命令。

  cp

  使用方法: cp CONTAINER:PATH HOSTPATH

  使用说明:

  使用cp可以把容器內的文件复制到Host主机上。这个命令在开发者开发应用的场景下,会需要把运行程序产生的结果复制出来的需求,在这个情况下就可以使用这个cp命令。

  diff

  使用方法:docker diff CONTAINER

  例子:
  1. $ sudo docker diff 7bb0e258aefe

  2. C /dev
  3. A /dev/kmsg
  4. C /etc
  5. A /etc/mtab
  6. A /go
  7. A /go/src
  8. A /go/src/github.com
  9. A /go/src/github.com/dotcloud
  10. ....
复制代码

  使用说明:

  diff会列出3种容器内文件状态变化(A - Add, D - Delete, C - Change )的列表清单。构建Image的过程中需要的调试指令。

  export

  使用方法:docker export CONTAINER

  例子:
  1. $ sudo docker export red_panda > latest.tar
复制代码

  使用说明:

  把容器系统文件打包并导出来,方便分发给其他场景使用。

  images

  使用方法:docker images [OPTIONS] [NAME]

  例子:
  1. $ sudo docker images | head
  2. REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
  3. <none> <none> 77af4d6b9913 19 hours ago 1.089 GB
  4. committest latest b6fa739cedf5 19 hours ago 1.089 GB
  5. <none> <none> 78a85c484f71 19 hours ago 1.089 GB
  6. $ docker latest 30557a29d5ab 20 hours ago 1.089 GB
  7. <none> <none> 0124422dd9f9 20 hours ago 1.089 GB
  8. <none> <none> 18ad6fad3402 22 hours ago 1.082 GB
  9. <none> <none> f9f1e26352f0 23 hours ago 1.089 GB
  10. tryout latest 2629d1fa0b81 23 hours ago 131.5 MB
  11. <none> <none> 5ed6274db6ce 24 hours ago 1.089 GB
复制代码

  使用说明:

  Docker Image是多层结构的,默认只显示最顶层的Image。不显示的中间层默认是为了增加可复用性、减少磁盘使用空间,加快build构建的速度的功能,一般用户不需要关心这个细节。

  import / save / load

  使用方法:
  1. docker import URL|- [REPOSITORY[:TAG]]
  2. docker save IMAGE
  3. docker load
复制代码

  使用说明:

  这一组命令是系统运维里非常关键的命令。加载(两种方法: import, load),导出(一种方法: save)容器系统文件。

  inspect

  使用方法:
  1. docker inspect CONTAINER|IMAGE [CONTAINER|IMAGE...]
复制代码

  例子:
  1. sudo docker inspect --format='{{.NetworkSettings.IPAddress}}' $INSTANCE_ID
复制代码
  使用说明:

  查看容器运行时详细信息的命令。了解一个Image或者Container的完整构建信息就可以通过这个命令实现。

  kill

  使用方法:
  1. docker kill [OPTIONS] CONTAINER [CONTAINER...]
复制代码

  使用说明:

  杀掉容器的进程。

  port

  使用方法:
  1. docker port CONTAINER PRIVATE_PORT
复制代码

  使用说明:

  打印出Host主机端口与容器暴露出的端口的NAT映射关系

  pause / unpause

  使用方法:
  1. docker pause CONTAINER
复制代码

  使用说明:

  使用cgroup的freezer顺序暂停、恢复容器里的所有进程。详细freezer的特性,请参考官方文档。

  ps

  使用方法:
  1. docker ps [OPTIONS]
复制代码

  例子:
  1. $ docker ps
  2. CONTAINER ID        IMAGE                        COMMAND                CREATED              STATUS              PORTS               NAMES
  3. 4c01db0b339c        ubuntu:12.04                 bash                   17 seconds ago       Up 16 seconds                           webapp
  4. d7886598dbe2        crosbymichael/redis:latest   /redis-server --dir    33 minutes ago       Up 33 minutes       6379/tcp            redis,webapp/db
复制代码
  使用说明:

  docker ps打印出正在运行的容器,docker ps -a打印出所有运行过的容器。

  rm

  使用方法:
  1. docker rm [OPTIONS] CONTAINER [CONTAINER...]
复制代码

  使用说明:

  docker ps打印出正在运行的容器,docker ps -a打印出所有运行过的容器。

  rm

  使用方法:
  1. docker rm [OPTIONS] CONTAINER [CONTAINER...]
复制代码

  例子:
  1. $ sudo docker rm /redis
  2. /redis
复制代码

  使用说明:

  删除指定的容器。

  rmi

  使用方法:
  1. docker rmi IMAGE [IMAGE...]
复制代码

  例子:
  1. $ sudo docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. test1 latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB)
  4. test latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB)
  5. test2 latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB)

  6. $ sudo docker rmi fd484f19954f
  7. Error: Conflict, cannot delete image fd484f19954f because it is tagged in multiple repositories
  8. 2013/12/11 05:47:16 Error: failed to remove one or more images

  9. $ sudo docker rmi test1
  10. Untagged: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8

  11. $ sudo docker rmi test2
  12. Untagged: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8

  13. $ sudo docker images
  14. REPOSITORY TAG IMAGE ID CREATED SIZE
  15. test latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB)

  16. $ sudo docker rmi test
  17. Untagged: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8
  18. Deleted: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8
复制代码

  使用说明:

  指定删除Image文件。

  run

  使用方法:
  1. docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
复制代码

  使用说明:

  指定删除Image文件。

  例子:
  1. $ sudo docker run --cidfile /tmp/docker_test.cid ubuntu echo "test"
复制代码

  使用说明:

  这个命令是核心命令,可以配置的参数多达28个参数。详细的解释可以通过docker run --help列出。官方文档中提到的 Issue 2702:"lxc-start: Permission denied - failed to mount" could indicate a permissions problem with AppArmor. 在最新版本的Dcoker中已经解决。

  start / stop / restart

使用方法:
  1. docker start CONTAINER [CONTAINER...]
复制代码

  使用说明:

  这组命令可以开启(两个:start, restart),停止(一个:stop)一个容器。

  tag

  使用方法:
  1. docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
复制代码

  使用说明:

  组合使用用户名,Image名字,标签名来组织管理Image。

  top

  使用方法:
  1. docker top CONTAINER [ps OPTIONS]
复制代码

  使用说明:

  显示容器內运行的进程。

  wait

  使用方法:
  1. docker wait CONTAINER [CONTAINER...]
复制代码

  使用说明:

  阻塞对指定容器的其他调用方法,直到容器停止后退出阻塞。

  2.3 日志信息相关

  events

  使用方法:
  1. docker events [OPTIONS]
复制代码

  使用说明:

  打印容器实时的系统事件。

  history

  使用方法:
  1. docker history [OPTIONS] IMAGE
复制代码

  例子:
  1. $ docker history docker
  2. IMAGE CREATED CREATED BY SIZE
  3. 3e23a5875458790b7a806f95f7ec0d0b2a5c1659bfc899c89f939f6d5b8f7094 8 days ago
  4. /bin/sh -c #(nop) ENV LC_ALL=C.UTF-8 0 B
  5. 8578938dd17054dce7993d21de79e96a037400e8d28e15e7290fea4f65128a36 8 days ago
  6. /bin/sh -c dpkg-reconfigure locales && locale-gen C.UTF-8 &&
  7. /usr/sbin/update-locale LANG=C.UTF-8 1.245 MB
  8. be51b77efb42f67a5e96437b3e102f81e0a1399038f77bf28cea0ed23a65cf60 8 days ago /bin/sh
  9. -c apt-get update && apt-get install -y git libxml2-dev python build-essential
  10. make gcc python-dev locales python-pip 338.3 MB
  11. 4b137612be55ca69776c7f30c2d2dd0aa2e7d72059820abf3e25b629f887a084 6 weeks ago
  12. /bin/sh -c #(nop) ADD jessie.tar.xz in / 121 MB
  13. 750d58736b4b6cc0f9a9abe8f258cef269e3e9dceced1146503522be9f985ada 6 weeks ago
  14. /bin/sh -c #(nop) MAINTAINER Tianon Gravi <admwiggin@gmail.com>
  15. - mkimage-debootstrap.sh -t jessie.tar.xz jessie http://http.debian.net/debian 0 B
  16. 511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158 9 months ago 0 B
复制代码

  使用说明:

  打印指定Image中每一层Image命令行的历史记录。

  logs

  使用方法:
  1. docker logs CONTAINER
复制代码

  使用说明:

  批量打印出容器中进程的运行日志。

  2.4 Dcoker Hub服务相关

  login

  使用方法:
  1. docker login [OPTIONS] [SERVER]
复制代码

  使用说明:

  登录Hub服务。

  pull / push

  使用方法:
  1. docker push NAME[:TAG]
复制代码

  使用说明:

  通过此命令分享Image到Hub服务或者自服务的Registry服务。

  search

  使用方法:
  1. docker search TERM
复制代码

  使用说明:

  通过关键字搜索分享的Image。

  3. 总结

  通过以上Docker命令行的详细解释,可以强化对Docker命令的全面理解。考虑到Docker命令行的发展变化非常快,读者可以参考官方的命令行解释文档更新相应的命令行解释。另外,通过以上Docker命令行的分析,可以知道Docker命令行架构设计的特点在于客户端和服务端的运行文件是同一个文件,内部实现代码应该是重用的设计。笔者希望开发者在开发类似的命令行应用时参考这样的设计,减少前后台容错的复杂度。
  参考文献


扩展阅读:


相关帖子

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部