速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

深入浅出 Docker(二):Docker 命令行探秘

  • 2014-08-15
  • 本文字数:7137 字

    阅读完需:约 23 分钟

【编者按】Docker 是 PaaS 供应商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 GitHub 上, 基于 Go 语言开发并遵从 Apache 2.0 协议开源。Docker 提供了一种在安全、可重复的环境中自动部署软件的方式,它的出现拉开了基于云计算平台发布产品方式的变革序幕。为了更好的促进 Docker 在国内的发展以及传播,我们决定开设《深入浅出Docker 》专栏,邀请Docker 相关的布道师、开发人员、技术专家来讲述Docker 的各方面内容,让读者对Docker 有更深入的了解,并且能够积极投入到新技术的讨论和实践中。另外,欢迎加入InfoQ Docker 技术交流群交流Docker 的最佳实践,QQ 群号:124378115。

1. Docker 命令行

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

$ sudo docker

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

功能划分

命令

环境信息相关

  1. info
  2. version

系统运维相关

  1. attach
  2. build
  3. commit
  4. cp
  5. diff
  6. export
  7. images
  8. import / save / load
  9. inspect
  10. kill
  11. port
  12. pause / unpause
  13. ps
  14. rm
  15. rmi
  16. run
  17. start / stop / restart
  18. tag
  19. top
  20. wait

日志信息相关

  1. events
  2. history
  3. logs

Docker Hub 服务相关

  1. login
  2. pull / push
  3. search

1.1 参数约定

单个字符的参数可以放在一起组合配置,例如

复制代码
docker run -t -i --name test busybox sh

可以用这样的方式等同:

复制代码
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 可以得到更详细的功能参数配置, 如下图:

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

参数

解释

–api-enable-cors=false

开放远程 API 调用的 CORS 头信息。这个接口开关对想进行二次开发的上层应用提供了支持。

-b, --bridge=""

挂载已经存在的网桥设备到 Docker 容器里。注意,使用 none 可以停用容器里的网络。

–bip=""

使用 CIDR 地址来设定网络桥的 IP。注意,此参数和 -b 不能一起使用。

-D, --debug=false

开启 Debug 模式。例如:docker -d -D

-d, --daemon=false

开启 Daemon 模式。

–dns=[]

强制容器使用 DNS 服务器。例如: docker -d --dns 8.8.8.8

–dns-search=[]

强制容器使用指定的 DNS 搜索域名。例如: docker -d --dns-search example.com

-e, --exec-driver=“native”

强制容器使用指定的运行时驱动。例如:docker -d -e lxc

-G, --group=“docker”

在后台运行模式下,赋予指定的 Group 到相应的 unix socket 上。注意,当此参数 --group 赋予空字符串时,将去除组信息。

-g, --graph="/var/lib/docker"

配置 Docker 运行时根目录

-H, --host=[]

在后台模式下指定 socket 绑定,可以绑定一个或多个 tcp://host:port, unix:///path/to/socket, fd://* 或 fd://socketfd。例如:

$ docker -H tcp://0.0.0.0:2375 ps 或者

$ export DOCKER_HOST=“tcp://0.0.0.0:2375”
$ docker ps

–icc=true

启用内联容器的通信。

–ip=“0.0.0.0”

容器绑定 IP 时使用的默认 IP 地址

–ip-forward=true

启动容器的 net.ipv4.ip_forward

–iptables=true

启动 Docker 容器自定义的 iptable 规则

–mtu=0

设置容器网络的 MTU 值,如果没有这个参数,选用默认 route MTU,如果没有默认 route,就设置成常量值 1500。

-p, --pidfile="/var/run/docker.pid"

后台进程 PID 文件路径。

-r, --restart=true

重启之前运行中的容器

-s, --storage-driver=""

强制容器运行时使用指定的存储驱动,例如, 指定使用 devicemapper, 可以这样:

docker -d -s devicemapper

–selinux-enabled=false

启用 selinux 支持

–storage-opt=[]

配置存储驱动的参数

–tls=false

启动 TLS 认证开关

–tlscacert="/Users/dxiao/.docker/ca.pem"

通过 CA 认证过的的 certificate 文件路径

–tlscert="/Users/dxiao/.docker/cert.pem"

TLS 的 certificate 文件路径

–tlskey="/Users/dxiao/.docker/key.pem"

TLS 的 key 文件路径

–tlsverify=false

使用 TLS 并做后台进程与客户端通讯的验证

-v, --version=false

显示版本信息

注意,其中带有 [] 的启动参数可以指定多次,例如

复制代码
$ docker run -a stdin -a stdout -a stderr -i -t ubuntu /bin/bash

2. Docker 命令行探秘

2.1 环境信息相关

info

使用方法: docker info

例子:

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

使用说明:

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

version

使用方法: docker version

使用说明:

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

2.2 系统运维相关

attach

使用方法: docker attach [OPTIONS] CONTAINER

例子:

复制代码
$ ID=$(sudo docker run -d ubuntu /usr/bin/top -b)
$ sudo docker attach $ID
top - 17:21:49 up 5:53, 0 users, load average: 0.63, 1.15, 0.78
Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie
%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
KiB Mem: 2051644 total, 723700 used, 1327944 free, 33032 buffers
KiB Swap: 0 total, 0 used, 0 free. 565836 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 19748 1280 1008 R 0.0 0.1 0:00.04 top
$ sudo docker stop $ID

使用说明:

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

build

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

例子:

复制代码
$ docker build .
Uploading context 18.829 MB
Uploading context
Step 0 : FROM busybox
---> 769b9341d937
Step 1 : CMD echo Hello world
---> Using cache
---> 99cc1ad10469
Successfully built 99cc1ad10469

使用说明:

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

commit

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

例子:

复制代码
$ sudo docker ps
ID IMAGE COMMAND CREATED STATUS PORTS
c3f279d17e0a ubuntu:12.04 /bin/bash 7 days ago Up 25 hours
197387f1b436 ubuntu:12.04 /bin/bash 7 days ago Up 25 hours
$ docker commit c3f279d17e0a SvenDowideit/testimage:version3
f5283438590d
$ docker images | head
REPOSITORY TAG ID CREATED VIRTUAL SIZE
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

例子:

复制代码
$ sudo docker diff 7bb0e258aefe
C /dev
A /dev/kmsg
C /etc
A /etc/mtab
A /go
A /go/src
A /go/src/github.com
A /go/src/github.com/dotcloud
....

使用说明:

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

export

使用方法:docker export CONTAINER

例子:

复制代码
$ sudo docker export red_panda > latest.tar

使用说明:

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

images

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

例子:

复制代码
$ sudo docker images | head
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
<none> <none> 77af4d6b9913 19 hours ago 1.089 GB
committest latest b6fa739cedf5 19 hours ago 1.089 GB
<none> <none> 78a85c484f71 19 hours ago 1.089 GB
$ docker latest 30557a29d5ab 20 hours ago 1.089 GB
<none> <none> 0124422dd9f9 20 hours ago 1.089 GB
<none> <none> 18ad6fad3402 22 hours ago 1.082 GB
<none> <none> f9f1e26352f0 23 hours ago 1.089 GB
tryout latest 2629d1fa0b81 23 hours ago 131.5 MB
<none> <none> 5ed6274db6ce 24 hours ago 1.089 GB

使用说明:

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

import / save / load

使用方法:

复制代码
docker import URL|- [REPOSITORY[:TAG]]
docker save IMAGE
docker load

使用说明:

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

inspect

使用方法:

复制代码
docker inspect CONTAINER|IMAGE [CONTAINER|IMAGE...]

例子:

复制代码
$ sudo docker inspect --format='{{.NetworkSettings.IPAddress}}' $INSTANCE_ID

使用说明:

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

kill

使用方法:

复制代码
docker kill [OPTIONS] CONTAINER [CONTAINER...]

使用说明:

杀掉容器的进程。

port

使用方法:

复制代码
docker port CONTAINER PRIVATE_PORT

使用说明:

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

pause / unpause

使用方法:

复制代码
docker pause CONTAINER

使用说明:

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

ps

使用方法:

复制代码
docker ps [OPTIONS]

例子:

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

使用说明:

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

rm

使用方法:

复制代码
docker rm [OPTIONS] CONTAINER [CONTAINER...]

例子:

复制代码
$ sudo docker rm /redis
/redis

使用说明:

删除指定的容器。

rmi

使用方法:

复制代码
docker rmi IMAGE [IMAGE...]

例子:

复制代码
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test1 latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB)
test latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB)
test2 latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB)
$ sudo docker rmi fd484f19954f
Error: Conflict, cannot delete image fd484f19954f because it is tagged in multiple repositories
2013/12/11 05:47:16 Error: failed to remove one or more images
$ sudo docker rmi test1
Untagged: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8
$ sudo docker rmi test2
Untagged: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB)
$ sudo docker rmi test
Untagged: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8
Deleted: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8

使用说明:

指定删除 Image 文件。

run

使用方法:

复制代码
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

例子:

复制代码
$ 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

使用方法:

复制代码
docker start CONTAINER [CONTAINER...]

使用说明:

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

tag

使用方法:

复制代码
docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]

使用说明:

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

top

使用方法:

复制代码
docker top CONTAINER [ps OPTIONS]

使用说明:

显示容器內运行的进程。

wait

使用方法:

复制代码
docker wait CONTAINER [CONTAINER...]

使用说明:

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

2.3 日志信息相关

events

使用方法:

复制代码
docker events [OPTIONS]

使用说明:

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

history

使用方法:

复制代码
docker history [OPTIONS] IMAGE

例子:

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

使用说明:

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

logs

使用方法:

复制代码
docker logs CONTAINER

使用说明:

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

2.4 Dcoker Hub 服务相关

login

使用方法:

复制代码
docker login [OPTIONS] [SERVER]

使用说明:

登录 Hub 服务。

pull / push

使用方法:

复制代码
docker push NAME[:TAG]

使用说明:

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

search

使用方法:

复制代码
docker search TERM

使用说明:

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

3. 总结

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

参考文献

[1] https://docs.docker.com/reference/commandline/cli/

[2] https://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing

[3] https://en.wikipedia.org/wiki/CIDR_notation#CIDR_notation


感谢郭蕾对本文的策划和审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-08-15 01:4479790

评论

发布
暂无评论
发现更多内容

首个云原生、分布式、全栈国产化银行核心业务系统投产上线丨TiDB × 杭州银行

编程猫

【年后跳槽必看篇-非广告】Spring Bean的生命周期

派大星

spring 跳槽季 Java 面试题

OpenAI 也在 996?一位离职员工自白:代码贡献第四,经常工作 6 天丨 RTE 开发者日报 Vol.121

声网

AE脚本-快速创建微风摇曳摆动波浪动画 Breeze

Rose

矢量图形转换工具vector magic for Mac 兼容macos14系统

Rose

mac软件下载 Vector Magic破解版 矢量图像转换工具

如何查看崩溃日志

[Mac/win数据库最新版]Navicat for MySQL 永久激活教程

Rose

Navicat for MySQL 数据库管理开发 Navicat数据库软件下载

关于 IntelliJ IDEA 中 Schedule for Addition 的问题

Rose

IntelliJ IDEA

NFTScan | 01.01~01.07 NFT 市场热点汇总

NFT Research

NFT NFT\ NFTScan

超自动化助力企业财务转型升级

智达方通

超自动化 企业财务转型

万界星空科技云MES,助力客户快速构建数字工厂

万界星空科技

mes 万界星空科技 低代码云MES

Mac电脑前端代码编辑神器:Sublime Text 4 Dev 激活码中文

mac大玩家j

代码编辑器 Mac软件 前端代码编辑器

MongoDB 数据库管理和开发Navicat for MongoDB【Mac/win】

Rose

MongoDB数据库 Navicat数据库下载 Navicat for MongoDB中文

LED屏租赁需求激增,为何LED显示屏租赁如此受欢迎?

Dylan

综艺节目 应用 LED显示屏 户外LED显示屏 led显示屏厂家

做CAE分析用哪个显卡?CAE咨询

思茂信息

仿真 CAE CAE软件

macos强大的界面设计和原型制作工具:Kite

Rose

Mac动画原型设计 Kite for Mac破解 Kite Mac下载 苹果软件下载站

实时获取建材网商品数据:API实现详解与代码示例

Noah

草料荣获第五届中国工业互联网大赛新锐组二等奖

草料二维码

二维码 草料二维码

程序员都必须知道的Vue 开发技巧

不在线第一只蜗牛

vue.js Vue 开发技巧

2023年国内AI Agent下项目大盘点,科技大厂与创业公司齐头并进

王吉伟频道

创业 融资 大语言模型 AI Agent AI智能体

2024年,苟住求活,才是长期主义

老张

第二曲线 职场发展 互联网裁员

强大的原型设计:Kite Compositor最新激活版

胖墩儿不胖y

Mac软件 原型设计工具 Mac动画软件

APP加固技术及其应用

雪奈椰子

Avdshare Audio Converter for Mac(性能超强的音频格式转换器)

Rose

苹果软件下载 Avdshare Audio Converter Mac音频格式转换器

当在线教育流量预警时,我们还可以在哪里挖掘

Geek_2305a8

AE脚本-图层分布路径形状高级控制 Tweaks

Rose

去年最火的 JS 开源项目「GitHub 热点速览」

EquatorCoco

GitHub 开源 js 工具库

5分钟使用Hologres实时湖仓加速分析挑战赛来袭

阿里云大数据AI技术

AudFree Tidable Music Converter for Mac(Tidal音乐转换器)

Rose

Tidal音乐转换器 苹果电脑音频转换器 AudFree Tidal Music

PostgreSQL数据库开发工具Navicat for PostgreSQL中文版

Rose

数据库设计 Navicat for PostgreSQL PostgreSQL数据库开发

TikTok海外直播专线:优化你的海外直播体验

Ogcloud

直播 直播优化 TikTok

深入浅出Docker(二):Docker命令行探秘_语言 & 开发_肖德时_InfoQ精选文章