docker run
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Run a command in a new container
-a
-a, --attach=[] Attach to STDIN, STDOUT orSTDERR
如果在執行run命令時沒有指定-a,那麼docker默認會掛載所有標準數據流,包括輸入輸出和錯誤。你可以特別指定掛載哪個標準流。
#docker run -a stdin -a stdout -i -t ubuntu:14.04/bin/bash
(只掛載標準輸入輸出)
--add-host
--add-host=[] Add a custom host-to-IP mapping (host:ip)
添加host-ip到容器的hosts文件
# docker run -it --add-host db:192.168.1.1ubuntu:14.04 /bin/bash
root@70887853379d:/# cat /etc/hosts 172.17.0.2 70887853379d 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.1.1 db |
--blkio-weight
--blkio-weight=0 Block IO (relative weight), between 10 and1000
相對於CPU和內存的配額控制,docker對磁盤IO的控制相對不成熟,大多數都必須在有宿主機設備的情況下使用。主要包括以下參數:
–device-read-bps:限制此設備上的讀速度(bytes persecond),單位可以是kb、mb或者gb。
–device-read-iops:通過每秒讀IO次數來限制指定設備的讀速度。
–device-write-bps :限制此設備上的寫速度(bytesper second),單位可以是kb、mb或者gb。
–device-write-iops:通過每秒寫IO次數來限制指定設備的寫速度。
–blkio-weight:容器默認磁盤IO的加權值,有效值範圍爲10-100。
–blkio-weight-device: 針對特定設備的IO加權控制。其格式爲DEVICE_NAME:WEIGHT存儲配額控制的相關參數,可以參考Red Hat文檔中blkio這一章,瞭解它們的詳細作用。
磁盤IO配額控制示例
blkio-weight
要使–blkio-weight生效,需要保證IO的調度算法爲CFQ。可以使用下面的方式查看:
root@ubuntu:~# cat/sys/block/sda/queue/scheduler
noop [deadline] cfq
使用下面的命令創建兩個–blkio-weight值不同的容器:
docker run -ti –rm–blkio-weight 100 ubuntu:stress
docker run -ti –rm –blkio-weight 1000 ubuntu:stress
在容器中同時執行下面的dd命令,進行測試:
time dd if=/dev/zeroof=test.out bs=1M count=1024 oflag=direct
device-write-bps
使用下面的命令創建容器,並執行命令驗證寫速度的限制。
docker run -tid –namedisk1 –device-write-bps /dev/sda:1mb ubuntu:stress
容器空間大小限制
在docker使用devicemapper作爲存儲驅動時,默認每個容器和鏡像的最大大小爲10G。如果需要調整,可以在daemon啓動參數中,使用dm.basesize來指定,但需要注意的是,修改這個值,不僅僅需要重啓docker daemon服務,還會導致宿主機上的所有本地鏡像和容器都被清理掉。
使用aufs或者overlay等其他存儲驅動時,沒有這個限制。
--cap-add,--cap-drop
--cap-add=[] Add Linux capabilities
--cap-drop=[] Drop Linux capabilities
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
--cgroup-parent
--cgroup-parent= Optional parent cgroup for the container
--cidfile=
--cidfile= Write the container ID to the file
將container ID保存到cid_file, 保存的格式爲長UUID
# docker run -it --cidfile=cid_fileubuntu:14.04 /bin/bash
#cat cid_file
5fcf835f2688844d1370e6775247c35c9d36d47061c4fc73e328f9ebf920b402
--cpu-shares
--cpu-shares=0 CPU shares (relative weight)
默認情況下,使用-c或者--cpu-shares 參數值爲0,可以賦予當前活動container 1024個cpu共享週期。這個0值可以針對活動的container進行修改來調整不同的cpu循環週期。
比如,我們使用-c或者--cpu-shares =0啓動了C0,C1,C2三個container,使用-c/--cpu-shares=512啓動了C3.這時,C0,C1,C2可以100%的使用CPU資源(1024),但C3只能使用50%的CPU資源(512)。如果這個host的OS是時序調度類型的,每個CPU時間片是100微秒,那麼C0,C1,C2將完全使用掉這100微秒,而C3只能使用50微秒。
--cpu-period, --cpu-quota
--cpu-period=0 Limit CPU CFS (Completely Fair Scheduler)period
--cpu-quota=0 Limit CPU CFS (Completely FairScheduler) quota
--cpu-period和--cpu-quota,這兩個參數是相互配合的,--cpu-period和--cpu-quota的這種配置叫Ceiling Enforcement Tunable Parameters,--cpu-shares的這種配置叫RelativeShares Tunable Parameters。--cpu-period是用來指定容器對CPU的使用要在多長時間內做一次重新分配,而--cpu-quota是用來指定在這個週期內,最多可以有多少時間用來跑這個容器。跟--cpu-shares不同的是這種配置是指定一個絕對值,而且沒有彈性在裏面,容器對CPU資源的使用絕對不會超過配置的值。
比如說A容器配置的--cpu-period=100000 --cpu-quota=50000,那麼A容器就可以最多使用50%個CPU資源,如果配置的--cpu-quota=200000,那就可以使用200%個CPU資源。
那麼有什麼樣的應用場景呢?簡單舉個例子,加入對外提供A和B兩個服務,但是A的優先級比B要高,假如只用--cpu-shares來配置,B服務佔用資源太高時是會對A有一定的影響的,但是如果通過--cpu-period和--cpu-quota來配置,就能起到絕對的控制,做到無論B怎麼樣,都不會影響到A。
cpu-period和cpu-quota的單位爲微秒(μs)。cpu-period的最小值爲1000微秒,最大值爲1秒(10^6 μs),默認值爲0.1秒(100000 μs)。cpu-quota的值默認爲-1,表示不做控制。
舉個例子,如果容器進程需要每1秒使用單個CPU的0.2秒時間,可以將cpu-period設置爲1000000(即1秒),cpu-quota設置爲200000(0.2秒)。當然,在多核情況下,如果允許容器進程需要完全佔用兩個CPU,則可以將cpu-period設置爲100000(即0.1秒),cpu-quota設置爲200000(0.2秒)。
使用示例:
使用命令docker run -tid –cpu-period 100000 –cpu-quota 200000 ubuntu,創建容器,則最終生成的cgroup的cpu週期配置可以下面的文件中找到:
# cat /sys/fs/cgroup/cpu/docker/<容器的完整長ID>/cpu.cfs_period_us
100000
# cat /sys/fs/cgroup/cpu/docker/<容器的完整長ID>/cpu.cfs_quota_us
200000
--cpuset-cpus, --cpuset-mems
--cpuset-cpus= CPUs in which to allow execution (0-3,0,1)
--cpuset-mems= MEMs in which to allow execution (0-3,0,1)
對多核CPU的服務器,docker還可以控制容器運行限定使用哪些cpu內核和內存節點,即使用–cpuset-cpus和–cpuset-mems參數。對具有NUMA拓撲(具有多CPU、多內存節點)的服務器尤其有用,可以對需要高性能計算的容器進行性能最優的配置。如果服務器只有一個內存節點,則–cpuset-mems的配置基本上不會有明顯效果。
使用示例:
命令docker run -tid –name cpu1 –cpuset-cpus 0-2 ubuntu,表示創建的容器只能用0、1、2這三個內核。最終生成的cgroup的cpu內核配置如下:
# cat /sys/fs/cgroup/cpuset/docker/<容器的完整長ID>/cpuset.cpus
0-2
通過docker exec <容器ID> taskset -c -p 1(容器內部第一個進程編號一般爲1),可以看到容器中進程與CPU內核的綁定關係,可以認爲達到了綁定CPU內核的目的。
-d, --detach
-d, --detach=false Run container in background and printcontainer ID
如果在docker run 後面追加-d=true或者-d,則containter將會運行在後臺模式(Detached mode)。此時所有I/O數據只能通過網絡資源或者共享卷組來進行交互。因爲container不再監聽你執行docker run的這個終端命令行窗口。但你可以通過執行docker attach 來重新掛載這個container裏面。需要注意的時,如果你選擇執行-d使container進入後臺模式,那麼將無法配合"--rm"參數。
# docker run -it -d ubuntu:14.04 /bin/bash
17aebdd365d86c3379aec5ddec364765d467a8d33d7210700a6a758a16206611
--device=
--device=[] Add a host device to the container
--disable-content-trust
--disable-content-trust=true Skip imageverification
跳過鏡像驗證。
--dns
--dns=[] Set custom DNS servers
自定義DNS.
# docker run -it --dns=8.8.8.8 --rmubuntu:14.04 /bin/bash
root@b7a6f0e63e65:/# cat /etc/resolv.conf
nameserver 8.8.8.8
--dns-opt
--dns-opt=[] Set DNS options
--dns-search
--dns-search=[] Set custom DNS search domains
-e, --env
-e, --env=[] Set environment variables
自這義環境變量。
--entrypoint
--entrypoint= Overwrite the default ENTRYPOINT of theimage
字面意思是進入點,而它的功能也恰如其意。
An ENTRYPOINT allows you to configure acontainer that will run as an executable.它可以讓你的容器功能表現得像一個可執行程序一樣。
示例一:
使用下面的ENTRYPOINT構造鏡像:
ENTRYPOINT ["/bin/echo"]
那麼docker build出來的鏡像以後的容器功能就像一個/bin/echo程序:
比如我build出來的鏡像名稱叫imageecho,那麼我可以這樣用它:
docker run -it imageecho “this is a test”
這裏就會輸出”this is a test”這串字符,而這個imageecho鏡像對應的容器表現出來的功能就像一個echo程序一樣。你添加的參數“this is a test”會添加到ENTRYPOINT後面,就成了這樣 /bin/echo “this is a test”。現在你應該明白進入點的意思了吧。
例子二:
ENTRYPOINT ["/bin/cat"]
構造出來的鏡像你可以這樣運行(假設名爲st):
docker run -it st /etc/fstab
這樣相當: /bin/cat /etc/fstab 這個命令的作用。運行之後就輸出/etc/fstab裏的內容。
--env-file
--env-file=[] Read in a file of environment variables
讀取設置環境變量的文件.
--expose
--expose=[] Expose a port or a range of ports
告訴Docker服務端容器暴露的端口號,供互聯繫統使用。
#docker run -it --expose=22 --rm ubuntu:14.04 /bin/bash
--group-add
--group-add=[] Add additional groups to join
-h, --hostname
-h, --hostname= Container host name
設置容器主機名。
# docker run -it --hostname=web --rmubuntu:14.04 /bin/bash
root@web:/#
-i, --interactive=false
-i, --interactive=false Keep STDIN open even if not attached
保持標準輸入,常同-t一起使用來申請一個控制檯進行數據交互。
--ipc
--ipc= IPC namespace to use
IPC(POSIX/SysV IPC)命名空間提供了相互隔離的命名共享內存,信號燈變量和消息隊列。
共享內存可以提高進程數據交互速度。共享內存一般用在database和高性能應用(C/OpenMPI, C++/using boost libraries)上或者金融服務上。如果需要容器裏面部署上述類型的應用,那麼就應該在多個容器直接採取共享內存了。
--kernel-memory
--kernel-memory= Kernel memory limit
內核內存,不會被交換到swap上。一般情況下,不建議修改,可以直接參考docker的官方文檔。
-l, --label
-l, --label=[] Set meta data on a container
--label-file=[] Read in a line delimited file of labels
下接博文:docker run命令詳解及示例(二)