docker在一个隔离的容器中运行进程,当你运行一个docker run命令的时候,docker会在自己的文件系统中启动一个进程,有它自己的网络、自己隔离的进程树等等。docker run命令控制了你运行的容器的状态。

      docker命令如:docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]

 这些配置一起组合起来,可以使docker run完全控制一个容器运行时的行为,它还允许覆盖docker build在构建镜像时配置的一些默认配置。

         列表[OPTIONS]中包含了两大组设置信息:

            1    Operator Exclusive Options

                   操作者在运行docker run时可以设置以下参数

                    1    Detached vs Foreground

                            在你启动一个容器的时候,你第一要考虑的是该容器是运行在后台呢还是运行在前端。在后台模式下(-d=true或者-d),所有I/O操作应该通过网络连接或者共享卷来实现,因为容器在后台模式下并没有长时间的监听在命令行模式下。但是你可以使用docker attach附加到一个容器上面。如果你运行一个容器在后台模式,则不能使用--rm选项。

                            在前端模式下(不指定-d参数即可),docker run在容器中启动一个进程并且attach console到这个进程的标准输入、输出、错误上面。它甚至可以伪装成一个TTY。如果你不用-a参数指定attach到哪里,则默认attach到stdin、stdout、stderr。你尅这样使用:docker run -a stdin -a stdout -i -t ubuntu /bin/bash

                    2    Container Identification

                            有三种方法识别一个容器,一种是长的UUID,一种是短的UUID,还有一种是容器的名称。如果你在运行一个容器时没有使用--name参数指定一个容器名称,  则docker守护进程会产生一个UUID,你也可以让docker把容器ID写入到一个文件中,通过指定--cidfile参数来实现。

                    3    Network Settings

                            默认情况下,所有的容器都是有网络的,并且可以从容器内部链接到外部的。但是你可以把网络完全禁止掉,使用-net none参数来实现该功能,它会禁止进入容器和从容器出去的流量。默认情况下容器和你的宿主机使用的是同一个dns,但是你可以指定容器使用自己的dns,通过--dns来指定。容器目前支持四种网络模型:none--容器没有网络,只有loopback地址。bridge--容器使用docker自建的默认网络,一个名为docker0的网桥会在宿主机上被建立,一个veth接口被桥接到容器上。host--共享使用宿主机自己的网络栈和所有网络接口。容器的主机名和宿主机的主机名会匹配。container--容器共享其他容器的网络栈,其他容器的名称必须通过-net container:<name|id>来提供。

                    4    Clean Up (–rm)

                            默认情况下载容器退出后,容器的文件系统是会继续保留的,这样使得debugging会变得容易一些,但是有时候你只是运行一个简短任务的容器在前端,这会导致容器文件系统大量堆积,而你希望在容器运行完之后自动删除容器及其文件系统,你可以通过--rm参数来实现。该参数和-d参数不能同时使用。

                    5    Runtime Constraints on CPU and Memory

                            你也可以调整容器的一些性能参数,例如cpu和mem。你可以通过-m来设置容器所能使用的内存大小,如果系统支持swap,你也可以把内存设置的比物理内存大。同样的可以通过-c来指定容器的优先级,默认情况下所有的容器运行在相同的优先级,获得相同的cpu运行时间,但是你可以指定某个容器分配更多的cpu运行时间

                    6    Runtime Privilege and LXC Configuration

                             默认情况下,容器是无特权的,例如你要在一个容器中再运行一个docker守护进程,这是不允许的,因为容器不被允许访问device的,但是被授予特权的容器却是可以访问的,可以通过--priviledged参数来指定。如果你在启动容器时使用了lxc执行驱动,则可以指定一些lxc配置。

            2    Overriding Dockerfile Image Defaults

                    有四个Dockerfile命令不能被覆盖:FROM、MAINTAINER、RUN、ADD。除此之外的Dockerfile命令都可以用docker run来覆盖。

                    1    CMD (Default Command or Options)

                            你可以在命令行提供一个COMMAND,用来覆盖在Dockerfile中CMD指定的命令。

                    2    ENTRYPOINT (Default Command to Execute at Runtime)

                    3    EXPOSE (Incoming Ports)

                            Dockerfile并没有给予网络更多的控制,只是提供了一个EXPOSE指令来给操作者说明那个入口可以提供服务。正如我们理解的,EXPOSE指令可以使通过一个端口连接到容器内部,在容器内部的端口号不需要和暴露在容器外面的端口号一致。例如:你的容器运行一个HTTP服务,监听在内部的80端口,然后你EXPOSE 80在Dockerfile中,但是在容器外部这个端口可能被映射成42800。为了是客户端可以连接到容器内部经过EXPOSE指定的端口,有三种办法可以选择,使用-P,-p,--link三个参数。

                    4    ENV (Environment Variables)

                            你可以通过-e参数给容器设置一些环境变量,用来覆盖Dockerfile中ENV的设置。

                    5    VOLUME (Shared Filesystems)

                            这个比较复杂,参考:volume配置

                    6    USER

                            默认情况下,容器有一个id=0的root用户,但是假如你创建了一个其他用户,并且希望用该用户来运行应用,则可以使用-u参数来指定,覆盖Dockerfile中USER指令。

                    7    WORKDIR

                            设置一个工作目录,默认是根目录