docker run命令詳解及示例(一)

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),單位可以是kbmb或者gb

  • –device-read-iops:通過每秒讀IO次數來限制指定設備的讀速度。

  • –device-write-bps :限制此設備上的寫速度(bytesper second),單位可以是kbmb或者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

LinuxCapability機制允許你將超級用戶相關的高級權限劃分成爲不同的小單元. 目前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 選項),這會禁用所有安全機制。

Docker1.3版中,新添了--cap-add--cap-drop選項。要讓一個ntpd容器跑起來,你現在只要執行以下命令:

#docker run -d --cap-add SYS_TIME ntpd

就可以將 SYS_TIME 特性添加到你的容器中。

再舉個例子,如果你確定你的容器不會改變任何進程的UIDGID,那完全可以將這些特性從你的容器中移除,這樣會更安全:

#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 1024cpu共享週期。這個0值可以針對活動的container進行修改來調整不同的cpu循環週期。

比如,我們使用-c或者--cpu-shares =0啓動了C0C1C2三個container,使用-c/--cpu-shares=512啓動了C3.這時,C0C1C2可以100%的使用CPU資源(1024),但C3只能使用50%CPU資源(512)。如果這個hostOS是時序調度類型的,每個CPU時間片是100微秒,那麼C0C1C2將完全使用掉這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資源。

那麼有什麼樣的應用場景呢?簡單舉個例子,加入對外提供AB兩個服務,但是A的優先級比B要高,假如只用--cpu-shares來配置,B服務佔用資源太高時是會對A有一定的影響的,但是如果通過--cpu-period--cpu-quota來配置,就能起到絕對的控制,做到無論B怎麼樣,都不會影響到A

cpu-periodcpu-quota的單位爲微秒(μs)。cpu-period的最小值爲1000微秒,最大值爲1秒(10^6 μs),默認值爲0.1秒(100000 μs)。cpu-quota的值默認爲-1,表示不做控制。

 

舉個例子,如果容器進程需要每1秒使用單個CPU0.2秒時間,可以將cpu-period設置爲1000000(即1秒),cpu-quota設置爲2000000.2秒)。當然,在多核情況下,如果允許容器進程需要完全佔用兩個CPU,則可以將cpu-period設置爲100000(即0.1秒),cpu-quota設置爲2000000.2秒)。

使用示例:

使用命令docker run -tid cpu-period 100000 cpu-quota 200000 ubuntu,創建容器,則最終生成的cgroupcpu週期配置可以下面的文件中找到:

# 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,表示創建的容器只能用012這三個內核。最終生成的cgroupcpu內核配置如下:

# 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

wKioL1fA6saR4Yr3AAAgHKwpW0g650.png-wh_50

--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命令詳解及示例(二)




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章