Docker run 命令的使用方法详解

论坛 期权论坛 脚本     
niminba   2021-5-23 05:01   1018   0

注意,本文基于最新的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+9oeykT9d8 B]\HHBH\H\\BS [\Y[\XX\BH\H[YHTBSQHHH\X]YHZ[\BU[Y\[\\XY\\B[ [[ [[[[[BTH\HYHZ[\\[]YHYO OB ]Bodj9d+#9/&!9g*9kyfj9.+yb'yi%/ Bg9.df9c&/yiz+k.##9!mf9g*9h#9% !y+[y.+z`&/+kh B B]\HHBH\H\\B[ YHY\\\H K\HX[H [\ X^BX\H ^OHBX\H ^SQOH XLL BX\H ^BX\H ^UH[ [[ [[[[[BX\H ^HBX\H ^HHBX\H ^Z[\HBX\H ^Y\H\H OB ]Bg9.df9c&/9iz+kx.goK[[[YN[X\iz+kh#9od* K[[#l!.ykd#gh9d9/k繣y#ybykyfj8.",y+*Y\&B B]\HHBH\H\\B\HXZ[\YY\[YCB[ Y K[[YHY\[YH[\Y\ LMYXXXNYMXNX  YL MBHY\[YHZ[\^Y CBRSTQSPQSPSPUQUTSQT LMY [\Y\Λ]\ Y\XKH HY\  KY\[YCBBH]\H\HXX^YYL\ \ TB LMY CB M KH MN\XX IX\Y LMY OB ]B/h9/o[[#9l,yc,9alY\j9alkB B]\HHBH\H\\B[ K\H K[[Y\[YNY\[X\KY[\ [\[\Y\X^BX\H ^OHBX\H ^SQOHXMXBX\H ^BX\H ^UH[ [[ [[[[[BX\H ^HBX\H ^QTSPTSQOH\XYY Y\BX\H ^QTSPTHMM HBX\H ^QTSPTWHMM HBX\H ^QTSPTWHMM BX\H ^QTSPTWHHBX\H ^QTSPTWBX\H ^HHBX\H ^Z[\HB\][X][X[\Z[\\HY[B[ ZH ] K\H K[[Y\[YNY\[X\KY[\ [\[\Y\XY\XKY\H Z QTSPTW \ QTSPTW MM IOB ]B.g!/*[X\9g,9g`9ayaiyb,OO+xd#/h9l,yc&/*iz+[9kyfj8B B]\HHBH\H\\B[ Y K[[YHX[YH\Y\ B[ ZH ] K[[X[YNX[X\\[XHX[X\OB ]Bi9/h:a+9kyfj;X[Y{al9kyfj9.g#9iy B]\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+ BT  Bkyfj9.+zn9-;/a+df9b&9-#/*9-+o8o 9cdf9c&/[yT+kn9-m`&/]Hiz)/l8 BT  Bkyfj9.+zn9mg9oey+e{ o 9cdf9c&/[yTiz+kn9mg9oe{g9.df9c&/]iz)n9mg9oex B."`:/+%i)[9doy.9/oy#9n#9&)"y`9n+b{i9i)"y.eye$y* ;l#&c#yi)8g*9i9.g.9')/c.+ O

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP