Docker create / Docker run 的选项详解

本文不止针对docker create 和 run 的选项解释,其实对以下几个指令的选项,同样有帮助和理解。

  • dockerd 启动docker engine
  • docker create / run / update 容器的创建和修改
  • daemon.json配置文件
  • docker service create 集群服务的创建
  • docker service update 集群服务的更新

–add-host list Add a custom host-to-IP mapping (host:ip)
添加一条hosts的记录到/etc/hosts中
例如:docker run -it –net=br10 –ip=192.168.10.10 –add-host=host10:192.168.10.10 –name=ins01 stress bash
进入容器:
[root@a1558ecb087b /]# cat /etc/hosts
127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
ff00::0    ip6-mcastprefix
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
192.168.10.10    host10
192.168.10.10    a1558ecb087b
-a, –attach list Attach to STDIN, STDOUT or STDERR
如果在执行run命令时没有指定-a,那么docker默认会挂载所有标准数据流,包括输入输出和错误。
–blkio-weight uint16 Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)
设置容器块设备IO的权重,有效值范围为10至1000的整数(包含10和1000)。默认情况下,所有容器都会得到相同的权重值(500)。
参考:Docker资源管理探秘-Cgroups机制
–blkio-weight-device list Block IO weight (relative device weight) (default [])
指定的块设备的IO相对权重
使用方式:blkio-weight-device=”设备名称:权重值”
使用方法,参考:Docker资源管理探秘-Cgroups机制如果–blkio-weight-device接口和–blkio-weight接口一起使用,那么Docker会使用–blkio-weight值作为默认的权重值,然后使用–blkio-weight-device值来设定指定设备的权重值,而早先设置的默认权重值将不在这个特定设备中生效。
–cap-add list Add Linux capabilities
控制docker的内核权限
Linux的Capability机制允许你将超级用户相关的高级权限划分成为不同的小单元. 目前Docker容器默认只用到了以下的Capability:CHOWN, DAC_OVERRIDE, FSETID, FOWNER, MKNOD,NET_RAW, SETGID, SETUID, SETFCAP,SETPCAP, NET_BIND_SERVICE, SYS_CHROOT, KILL, AUDIT_WRITE
有些情况下,你也许需要调整上面罗列的特性。比如你正在构建一个容器,你用它来执行ntpd或是crony,为此它们要能够修改宿主的系统时间。由于不具备 CAP_SYS_TIME 特性,容器无法工作。为了应对这种情况,在Docker之前的版本中,容器必须以提权模式运行(使用–privileged 选项),这会禁用所有安全机制。
在Docker的1.3版中,新添了–cap-add和–cap-drop选项。要让一个ntpd容器跑起来,你现在只要执行以下命令:
#docker run -d –cap-add SYS_TIME ntpd
就可以将 SYS_TIME 特性添加到你的容器中。
再举个例子,如果你确定你的容器不会改变任何进程的UID和GID,那完全可以将这些特性从你的容器中移除,这样会更安全:
#docker run –cap-drop SETUID –cap-dropSETGID –cap-drop FOWNER fedora /bin/sh
命令示例,用于查看启用的特性:
# pscap | grep 2912
运行结果示例:
5417 2912 root sh chown, dac_override,fsetid, kill, setpcap, net_bind_service, net_raw, sys_chroot, mknod,audit_write, setfcap
或者你可以先移除所有特性,然后再把一个添加回去:
#docker run –cap-drop ALL –cap-addSYS_TIME ntpd /bin/sh
查看启用的特性:
# pscap | grep 2382
5417 2382 root sh sys_time
–cap-drop list Drop Linux capabilities
控制docker的内核权限
例如:docker run –cap-add=ALL –cap-drop=MKNOD
//容器拥有除了MKNOD之外的所有内核权限
–cgroup-parent string Optional parent cgroup for the container
–cidfile string Write the ccontainer ID to the file
将容器的id写入主机中的文件
[root@110 ~]# docker run -it –cidfile=/root/cid.file –name=ins01 centos bash
[root@110 ~]# cat cid.file
eec2d694dfb6ef53d24c1942866067269e026931e9c1851249f863ebcc47fc16
–cpu-period int Limit CPU CFS (Completely Fair Scheduler) period
内核默认的Linux 调度CFS(完全公平调度器)周期为100ms,我们通过–cpu-period来设置容器对CPU的使用周期,同时–cpu-period接口需要和–cpu-quota接口一起来使用。–cpu-quota接口设置了CPU的使用值。CFS(完全公平调度器) 是内核默认使用的调度方式,为运行的进程分配CPU资源。对于多核CPU,根据需要调整–cpu-quota的值。单位为微秒(μs)。cpu-period的最小值为1000微秒,最大值为1秒(10^6 μs),默认值为0.1秒(100000 μs)
–cpu-period的详细说明,参考:Docker资源管理探秘-Cgroups机制
–cpu-quota int Limit CPU CFS (Completely Fair Scheduler) quota
–cpu-quota接口设置了CPU的使用值,通常情况下它需要和–cpu-period接口一起来使用。具体使用方法请参考–cpu-period选项。
是用来指定在cpu-period周期内,最多可以有多少时间用来跑这个容器,单位为微秒(μs),值默认为-1,表示不做控制。
跟–cpu-shares不同的是这种配置是指定一个绝对值,而且没有弹性在里面,容器对CPU资源的使用绝对不会超过配置的值。
–cpu-quota的详细说明,参考:Docker资源管理探秘-Cgroups机制
–cpu-rt-period int Limit CPU real-time period in microseconds
实时调度策略的时间周期,类似于–cpu-period
–cpu-rt-runtime int Limit CPU real-time runtime in microseconds
实时调度策略的周期中的运行时间,类似于–cpu-quota
-c, –cpu-shares int CPU shares (relative weight)
是相对权重, 设置为一个正整数,代表所分配的相对CPU资源比。默认是平均分配
注意:该值的设置不能小于2
默认情况下所有容器的share(简单理解成是权重吧)是相同的,也就是所有容器有相同的权重,在所有容器一起竞争资源时,最终得到的资源是相同的。这个share是一个相对的值,那么这个值的意义就不能单纯的通过一个容器的share值来看,而是多个在一起对比,比如A和B两个容器,A配置的是1024,B配置的是512,那么A最大可以使用的CPU资源是B的两倍。还有一点要注意的是这种配置是有弹性的,如果A容器一直闲着,那B容器是可以使用空闲资源的。
设置容器使用CPU的权重,这个权重设置是针对CPU密集型的进程的。如果某个容器中的进程是空闲状态,那么其它容器就能够使用本该由空闲容器占用的CPU资源。也就是说,只有当两个或多个容器都试图占用整个CPU资源时,–cpu-shares设置才会有效。
–cpu-shares的详细说明,参考:Docker资源管理探秘-Cgroups机制
–cpus decimal Number of CPUs
容器CPU占用主机的CPU的比例,占用的比例关系暂时未找到相关的资料
参考:Docker 资源(cpu、memory)限制实践篇
–cpuset-cpus string CPUs in which to allow execution (0-3, 0,1)
指定允许容器使用的CPU序号,从0开始,默认使用主机的所有CPU
例如:
–cpuset-cpus=0-2 // 允许使用0,1,2号cpu
–cpuset-cpus=0-1,3 // 允许使用0,1,3号cpu
–cpuset-mems string MEMs in which to allow execution (0-3, 0,1)
限制容器进程使用的哪些内存节点,用法与–cpuset-cpus相似.
可参考:Docker资源管理探秘-Cgroups机制
–device list Add a host device to the container
映射设备到容器
例如:–device /dev/sda:/dev/sda
–device-cgroup-rule list Add a rule to the cgroup allowed devices list
–device-read-bps list Limit read rate (bytes per second) from a device (default [])
用来限制指定设备的读取速率,单位可以是kb、mb或者gb
例如:–device-read-bps /dev/sda:1mb
可参考:Docker资源管理探秘-Cgroups机制
–device-read-iops list Limit read rate (IO per second) from a device (default [])
设置了设备的IO读取速率
可以通过”–device-read-iops /dev/sda:400″来限定sda的IO读取速率(400次/秒)
可参考:Docker资源管理探秘-Cgroups机制
–device-write-bps list Limit write rate (bytes per second) to a device (default [])
用来限制指定设备的写速率,单位可以是kb、mb或者gb
可参考:Docker资源管理探秘-Cgroups机制
–device-write-iops list Limit write rate (IO per second) to a device (default [])
设置了设备的IO写速率
可以通过”–device-write-iops /dev/sda:400″来限定sda的IO写速率(400次/秒)
可参考:Docker资源管理探秘-Cgroups机制
–disable-content-trust Skip image verification (default true)
跳过镜像验证
–dns list Set custom DNS servers
设定容器的DNS地址,在容器的 /etc/resolv.conf 文件中可查看。注意:如果不设置, Docker 会默认用主机上的 /etc/resolv.conf 来配置容器。
例如:
[root@110 ~]# docker run -it –dns=114.114.114.114 –dns=8.8.8.8 centos bash -c “cat /etc/resolv.conf”
search 100.com
nameserver 114.114.114.114
nameserver 8.8.8.8
例如:
[root@110 ~]# docker run -it centos bash -c “cat /etc/resolv.conf”
search 100.com
nameserver 192.168.80.1
–dns-option list Set DNS options
容器 /etc/resolv.conf 文件,其他设置
–dns-search list Set custom DNS search domains
设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的 主机时,DNS 不仅搜索host,还会搜索 host.example.com 。 注意:如果不设置, Docker 会默认用主机上的 /etc/resolv.conf 来配置容器。
–entrypoint string Overwrite the default ENTRYPOINT of the image
-e, –env list Set environment variables
设置容器实例的环境变量
[root@110 ~]# docker run -it –env=GOROOT=/usr/local/go centos bash
[root@ef3f8a131d13 /]# echo $GOROOT
/usr/local/go
–env-file list Read in a file of environment variables
读入配置文件
例如:docker service create –name=redis –replicas=5 –env-file=/root/file.env  rediscat /root/file.env
GOPATH=/usr/local/go
PHPROOT=/data/www/web
NGINX_CONF=/usr/local/nginx/conf/nginx.conf
--expose list Expose a port or a range of ports
开放一个端口或一组端口
例如:

docker create -it –expose=”80″ –expose=”8080″ –expose=”9001″ –name=ins01 centos

–group-add list Add additional groups to join
–health-cmd string Command to run to check health
–health-interval duration Time between running the check (ns|us|ms|s|m|h) (default 0s)
–health-retries int Consecutive failures needed to report unhealthy
–health-start-period duration Start period for the container to initialize before starting health-retries countdown(ns|us|ms|s|m|h) (default 0s)
–health-timeout duration Maximum time to allow one check to run (ns|us|ms|s|m|h) (default 0s)
–help Print usage
帮忙文档
-h, –hostname string Container host name
容器的hostName,在容器中使用 cat /etc/hostname 查看
–init Run an init inside the container that forwards signals and reaps processes
-i, –interactive Keep STDIN open even if not attached
–ip string IPv4 address (e.g., 172.30.100.104)
指定容器IPv4地址,例如:–ip=192.168.10.10
–ip6 string IPv6 address (e.g., 2001:db8::33)
指定容器IPv6地址
–ipc string IPC namespace to use
–isolation string Container isolation technology
–kernel-memory bytes Kernel memory limit
内核内存限制,即容器的系统内核可以使用多少内存。数字需要使用正整数,对应的单位是b, k, m, g中的一个。最小取值是4M。
使用方式:–kernel-memory=”<数字>[<单位>]”
–kernel-memory的详细说明,参考:Docker资源管理探秘-Cgroups机制
-l, –label list Set meta data on a container
设置容器标签
docker主机的标签,很实用的功能
例如:docker create –label nodeName=host-121 –name ins01 centos bash
label 使用方法参考:Docker的命令之集群服务管理 Service
–label-file list Read in a line delimited file of labels
通过文件设置容器标签
[root@110 ~]# docker create –label-file=/root/label.file –name=ins-1 centos bash
[root@110 ~]# cat /root/label.file
tag1=aaaaa
tag2=bbbbb
tag3=标签3
–link list Add link to another container
–link-local-ip list Container IPv4/IPv6 link-local addresses
–log-driver string Logging driver for the container
–log-opt list Log driver options
–mac-address string Container MAC address (e.g., 92:d0:c6:0a:29:33)
-m, –memory bytes Memory limit
内存使用限制。 数字需要使用整数,对应的单位是b, k, m, g中的一个。最小取值是4M。
在默认情况下,容器可以占用无限量的内存,直至主机内存资源耗尽。
注意,在实际容器使用场景中,如果不对容器使用内存量加以限制的话,可能导致一个容器会耗尽整个主机内存,从而导致系统不稳定。所以在使用容器时务必对容器内存加以限制。
使用方式:-m, –memory=” <数字>[<单位>]”,例如:–memory=1G
–memory的详细说明,参考:Docker资源管理探秘-Cgroups机制
–memory-reservation bytes Memory soft limit
内存软限制。 数字需要使用正整数,对应的单位是b, k, m, g中的一个。
通常情况下,容器能够使用的内存量仅仅由-m/–memory选项限定。如果设置了–memory-reservation选项,当内存使用量超过–memory-reservation选项所设定的值时,系统会强制容器执行回收内存的操作,使得容器内存消耗不会长时间超过–memory-reservation的限定值。这个限制并不会阻止进程使用超过限额的内存,只是在系统内存不足时,会回收部分内存,使内存使用量向限定值靠拢。
使用方式:–memory-reservation=”<数字>[<单位>]”,例如:–memory-reservation=2G
–memory-reservation的详细说明,参考:Docker资源管理探秘-Cgroups机制
–memory-swap bytes Swap limit equal to memory plus swap: ‘-1′ to enable unlimited swap
总内存使用限制 (物理内存 + 交换分区,数字需要使用整数,对应的单位是b, k, m, g中的一个。
注意:这里是物理内存+交换分区的总和,并非仅是交换分区。
使用方式:–memory-swap=”<数字>[<单位>]”,例如:–memory-swap=500M
–memory-swap的使用说明,参考:Docker资源管理探秘-Cgroups机制
–memory-swappiness int Tune container memory swappiness (0 to 100) (default -1)
调节容器内存使用交换分区的选项,取值为0和100之间的整数(含0和100)。0表示容器不使用交换分区,100表示容器尽可能多的使用交换分区。
–memory-swappiness的使用说明,参考:Docker资源管理探秘-Cgroups机制
–mount mount Attach a filesystem mount to the container
–name string Assign a name to the container
容器名称
–network string Connect a container to a network (default “default”)
设置容器网络,网络通过docker network create 创建
例如:
[root@110 ~]# docker network create –subnet=192.168.10.0/24 –ip-range=192.168.10.0/24 br10
[root@110 ~]# docker run -it –network=br10 centos bash
–network-alias list Add network-scoped alias for the container
–no-healthcheck Disable any container-specified HEALTHCHECK
–oom-kill-disable Disable OOM Killer
内存耗尽时是否杀掉容器,默认杀掉容器进程
当out-of-memory (OOM)发生时,系统会默认杀掉容器进程,如果你不想让容器进程被杀掉,可以使用该接口。
注意:建议采用默认值,一旦OOM,杀掉容器进程。如果挂起,将无法释放容器中已使用的内存,而影响占用主机的内存。
–oom-kill-disable的使用说明,参考:Docker资源管理探秘-Cgroups机制
–oom-score-adj int Tune host’s OOM preferences (-1000 to 1000)
–pid string PID namespace to use
–pids-limit int Tune container pids limit (set -1 for unlimited)
–privileged Give extended privileges to this container
默认情况下container是不能访问任何其他设备的。但是通过”privileged”,container就拥有了访问任何其他设备的权限。
当操作者执行docker run –privileged时,Docker将拥有访问主机的所有设备的权限
-p, –publish list Publish a container’s port(s) to the host
指定端口映射
-P, –publish-all Publish all exposed ports to random ports
映射所有开发的端口
例如:docker create -it -P –expose={“80″,”8080″,”3306″} –name=ins01 centos
// 将映射主机的随机端口到容器的80,8080,3306端口
–read-only Mount the container’s root filesystem as read only
–restart string Restart policy to apply when a container exits (default “no”)
–rm Automatically remove the container when it exits
注意:–rm 和 -d不能共用
–runtime string Runtime to use for this container
–security-opt list Security Options
–shm-size bytes Size of /dev/shm
–stop-signal string Signal to stop a container (default “SIGTERM”)
–stop-timeout int Timeout (in seconds) to stop a container
–storage-opt list Storage driver options for the container
–sysctl map Sysctl options (default map[])
–tmpfs list Mount a tmpfs directory
-t, –tty Allocate a pseudo-TTY
通常和-i联合使用 –it
–ulimit ulimit Ulimit options (default [])
-u, –user string Username or UID (format: <name|uid>[:<group|gid>])
–userns string User namespace to use
–uts string UTS namespace to use
-v, –volume list Bind mount a volume
挂载数据卷
数据卷的用法参考: Docker的命令之数据卷管理 Volume
–volume-driver string Optional volume driver for the container
–volumes-from list Mount volumes from the specified container(s)
# docker create -it –name=ins01 -v=logs:/data/logs centos bash
# docker create -it –name=ins02 –volumes-from=ins01 centos bash
-w, –workdir string Working directory inside the container
进入容器后的默认目录,如果目录不存在,则创建。
[root@110 ~]# docker run -it -w=/data/logs –name=ins01 centos bash
[root@aa358735869e logs]# pwd
/data/logs

 

推荐相关文档:

 

Docker create / Docker run 的选项详解》上有1条评论

  1. Pingback引用通告: Docker的命令之概述 | 精彩每一天

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>