注意,本文基于最新的Docker 1.4文档翻译。
Docker会在隔离的容器中运行进程。当运行 docker run命令时,Docker会启动一个进程,并为这个进程分配其独占的文件系统、网络资源和以此进程为根进程的进程组。在容器启动时,镜像可能已经定义了要运行的二进制文件、暴露的网络端口等,但是用户可以通过docker run命令重新定义(译者注:docker run可以控制一个容器运行时的行为,它可以覆盖docker build在构建镜像时的一些默认配置),这也是为什么run命令相比于其它命令有如此多的参数的原因。
命令格式
最基本的docker run 命令的格式如下:
$ sudo docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]
如果需要查看[OPTIONS]的详细使用说明,请参考Docker关于OPTIONS的章节。这里仅简要介绍Run所使用到的参数。
OPTIONS总起来说可以分为两类:
1.设置运行方式:
决定容器的运行方式,前台执行还是后台执行;
设置containerID;
设置网络参数;
设置容器的CPU和内存参数;- 设置权限和LXC参数;
2.设置镜像的默认资源,也就是说用户可以使用该命令来覆盖在镜像构建时的一些默认配置。
docker run [OPTIONS] 可以让用户完全控制容器的生命周期,并允许用户覆盖执行docker build 时所设定的参数,甚至也可以修改本身由Docker所控制的内核级参数。
Operator exclusive options
当执行docker run 时可以设置以下参数:
Detached vs Foreground
Detached (-d)- Foreground
Container Identification
Name (--name)- PID Equivalent
IPC Setting
Network Settings
Clean Up (--rm)
Runtime Constraints on CPU and Memory
Runtime Privilege, Linux Capabilities, and LXC Configuration
接下来我们依次进行介绍。
Detached vs foreground
当我们启动一个容器时,首先需要确定这个容器是运行在前台还是运行在后台。
-d=false: Detached mode: Run container in the background, print new container id
Detached (-d)
如果在docker run 后面追加-d=true 或者-d,那么容器将会运行在后台模式。此时所有I/O数据只能通过网络资源或者共享卷组来进行交互。因为容器不再监听你执行docker run 的这个终端命令行窗口。但你可以通过执行docker attach来重新附着到该容器的回话中。需要注意的是,容器运行在后台模式下,是不能使用--rm选项的。
Foregroud
在前台模式下(不指定-d参数即可),Docker会在容器中启动进程,同时将当前的命令行窗口附着到容器的标准输入、标准输出和标准错误中。也就是说容器中所有的输出都可以在当前窗口中看到。甚至它都可以虚拟出一个TTY窗口,来执行信号中断。这一切都是可以配置的:
-a=[] : Attach to `STDIN`, `STDOUT` and/or `STDERR`
-t=false : Allocate a pseudo-tty
--sig-proxy=true : Proxify all received signal to the process (non-TTY mode only)
-i=false : Keep STDIN open even if not attached
如果在执行run命令时没有指定-a参数,那么Docker默认会挂载所有标准数据流,包括输入输出和错误,你可以单独指定挂载哪个标准流。
$ sudo docker run -a stdin -a stdout -i -t ubuntu /bin/bash
如果要进行交互式操作(例如Shell脚本),那我们必须使用-i -t参数同容器进行数据交互。但是当通过管道同容器进行交互时,就不需要使用-t参数,例如下面的命令:
echo test | docker run -i busybox cat
容器识别
Name(--name)
可以通过三种方式为容器命名:
1. 使用UUID长命名("f78375b1c487e03c9438c729345e54db9d20cfa2ac1fc3494b6eb60872e74778")
2. 使用UUID短命令("f78375b1c487")
3. 使用Name("evil_ptolemy")
这个UUID标示是由Docker deamon生成的。如果你在执行docker run时没有指定--name,那么deamon会自动生成一个随机字符串UUID。但是对于一个容器来说有个name会非常方便,当你需要连接其它容器时或者类似需要区分其它容器时,使用容器名称可以简化操作。无论容器运行在前台或者后台,这个名字都是有效的。
PID equivalent
如果在使用Docker时有自动化的需求,你可9iyo/*fc Bodo[[##9/g9..k-9kyfj9c&/"yoho#,:/*kyfj8d#9/&g*9k-9kyfj9.+z+k. 9.iz+9oeykT9d8B]\HHBH\H\\BS
[\Y[\XX\BH\H[YHTBSQHH[YH\X]YHZ[\BU[Y\[\\XY\\B[[[[[[[[BTH\HYHZ[\\[]YHYOOB]Bodj9d+#9/&!9g*9kyfj9.+yb'yi%/ Bg9.df9c&/yiz+k.##9!mf9g*9h#9% !y+[y.+z`&/+kh BB]\HHBH\H\\B[YHY\\\HK\HX[H[\X^BX\H^OHBX\H^SQOH
XLLBX\H^BX\H^UH[[[[[[[[BX\H^HBX\H^HHBX\H^Z[\HBX\H^Y\H\HOB]Bg9.df9c&/9iz+k[Yx.goK[[[YN[X\iz+kh#9od*K[[#l!.ykd#gh9d9/k繣y#ybykyfj8.",y+*Y\&BB]\HHBH\H\\B\HXZ[\[YYY\[YCB[YK[[YHY\[YH[\Y\LMYXXXNYMXNXYLMBHY\[YHZ[\^Y
CBRSTQSPQSPSPUQUTSQTLMY [\Y\Λ]\Y\XKH
HY\
KY\[YCBBH]\H\HXX^YYL\\TB
LMY
CBMKHMN\XX IX\Y
LMYOB]B/h9/o[[#9l,yc,9alY\j9alkBB]\HHBH\H\\B[K\HK[[Y\[YNY\[X\KY[\[\[\Y\X^BX\H^OHBX\H^SQOHXMXBX\H^BX\H^UH[[[[[[[[BX\H^HBX\H^QTSPTSQOH\XYYY\BX\H^QTSPTHMMHBX\H^QTSPTWHMMHBX\H^QTSPTWHMMBX\H^QTSPTWHHBX\H^QTSPTWBX\H^HHBX\H^Z[\HB\][X][X[\Z[\\HY[B[ZH]K\HK[[Y\[YNY\[X\KY[\[\[\Y\XY\XKY\HZ QTSPTW\ QTSPTW MMIOB]B.g!/*[X\9g,9g`9ayaiyb,OO+xd#/h9l,yc&/*iz+[9kyfj8BB]\HHBH\H\\B[YK[[YHX[YH\Y\B[ZH]K[[X[YNX[X\\[XHX[X\OB]Bi9/h:a+9kyfj;X[Y{al9kyfj9.g#9iyB]\HHBH\H\\BSQH
\Y[\[\B]VX]HH[[Y\NZ[\Y\NBYZ[\Y\\Z\[[X]\H][YKBK][Y\H[[[Y\H[Z[\OB]Bal[Yycl;c*X[Y]H[Z[\"#g :)y#+df9c*[y.+z+ki&.*[Y{/a+,z/df:+kyfj9y[Yz+ BTBkyfj9.+zn9-;/a+df9b&9-#/*9-+o8o 9cdf9c&/[yT+kn9-m`&/]Hiz)/l8BTBkyfj9.+zn9mg9oey+e{ o 9cdf9c&/[yTiz+kn9mg9oe{g9.df9c&/]iz)n9mg9oexB."`:/+%i)[9doy.9/oy#9n#9&)"y`9n+b{i9i)"y.eye$y* ;l#&c#yi)8g*9i9.g.9')/c.+ O |