微吼云上線多路互動直播服務 加速多場景互動直播落地
1222
2025-03-31
docker run
-a
–add-host
–blkio-weight
磁盤IO配額控制示例
容器空間大小限制
docker run
-a
–add-host
–blkio-weight
磁盤IO配額控制示例
容器空間大小限制
–cidfile=
–cpu-shares
–cpu-period, --cpu-quota
–cpuset-cpus, --cpuset-mems
-d, --detach
–device=
–disable-content-trust
–dns
–dns-opt
–dns-search
-e, --env
–entrypoint
示例一
示例二
–expose
–group-add
-h, --hostname
-i, --interactive=false
–ipc
–kernel-memory
-l, --label
–link
示例:連接兩個容器
–log-driver
–mac-address
-m, --memory
-memory-reservation
–memory-swap
–memory-swappiness
–name
–net
–oom-kill-disable
-P, --publish-all
-p, --publish
–pid
–privileged
–read-only
–rm
–security-opt
–sig-proxy
–stop-signal
-t, --tty
-u, --user
–ulimit
-v, --volume
–volumes-from
-w, --workdir
docker run
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-a
-a, --attach=[] Attach to STDIN, STDOUT or STDERR
如果在執行 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.1 ubuntu: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 and 1000
相對于 CPU 和 內存 的配額控制,docker 對磁盤 IO 的控制相對不成熟,大多數都必須在有宿主機設備的情況下使用。主要包括以下參數:
device-read-bps:限制此設備上的讀速度(bytes per second),單位可以是 kb、mb 或者 gb.
-device-read-iops:通過每秒讀 IO 次數來限制指定設備的讀速度。
–device-write-bps :限制此設備上的寫速度(bytes per second),單位可以是kb、mb或者gb。
–device-write-iops:通過每秒寫 IO 次數來限制指定設備的寫速度。
–blkio-weight:容器默認磁盤 IO 的加權值,有效值范圍為10-100。
–blkio-weight-device: 針對特定設備的 IO 加權控制。其格式為 DEVICE_NAME:WEIGHT 存儲配額控制的相關參數,可以參考Red Hat 文檔中 blkio 這一章,了解它們的詳細作用。
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/zero of=test.out bs=1M count=1024 oflag=direct
device-write-bps
使用下面的命令創建容器,并執行命令驗證寫速度的限制。
$ docker run -tid –name disk1 –device-write-bps /dev/sda:1mb ubuntu:stress
在 docker 使用 devicemapper 作為存儲驅動時,默認每個容器和鏡像的最大大小為 10 G。如果需要調整,可以在 daemon 啟動參數中,使用 dm.basesize 來指定,但需要注意的是,修改這個值,不僅僅需要重啟 docker daemon 服務,還會導致宿主機上的所有本地鏡像和容器都被清理掉。
使用 aufs 或者 overlay 等其他存儲驅動時,沒有這個限制。
–cidfile=
--cidfile= Write the container ID to the file
將 container ID 保存到 cid_file, 保存的格式為長 UUID
$ docker run -it --cidfile=cid_file ubuntu: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 三個c ontainer,使用 -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 Fair Scheduler) quota
–cpu-period 和 --cpu-quota,這兩個參數是相互配合的,–cpu-period 和 --cpu-quota 的這種配置叫 Ceiling Enforcement Tunable Parameters,–cpu-shares 的這種配置叫 Relative Shares 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,表示不做控制
–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 的配置基本上不會有明顯效果。
使用示例:
#表示創建的容器只能用 0、1、2 這三個內核。最終生成的 cgroup 的cpu docker run -tid –name cpu1 –cpuset-cpus 0-2 ubuntu
內核配置如下:
# 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 print container ID
如果在 docker run 后面追加 -d=true 或者 -d,則 containter 將會運行在后臺模式(Detached mode)。此時所有 I/O 數據只能通過網絡資源或者共享卷組來進行交互。因為 container 不再監聽你執行 docker run 的這個終端命令行窗口。但你可以通過執行docker attach 來重新掛載這個container 里面。需要注意的時,如果你選擇執行 -d 使 container 進入后臺模式,那么將無法配合"–rm"參數。
–device=
--device=[] Add a host device to the container
–disable-content-trust
--disable-content-trust=true Skip image verification
跳過鏡像驗證。
–dns
--dns=[] Set custom DNS servers
自定義DNS:
$ docker run -it --dns=8.8.8.8 --rm ubuntu: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 the image
字面意思是進入點,而它的功能也恰如其意。
An ENTRYPOINT allows you to configure a container 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 --rm ubuntu: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
–link
--link=[] Add link to another container
用于連接兩個容器。
啟動容器1:web
$ docker run --name web -d -p 22 -p 80 -it webserver:v1
啟動容器2:ap1連接到web,并命名為apache
$ docker run --name ap1 --link=web:apache -d -p 22 -p 80 -it webserver:v1
–log-driver
--log-driver= Logging driver for container --log-opt=[] Log driver options
Docker 增加了對 json-file 型(默認)log driver 的 rotate 功能,我們可通過 max-size 和 max-file 兩個 –log-opt 來配置。
比如:我們啟動一個 nginx 容器,采用 json-file日志引擎,每個 log 文件限制最大為 1 k,輪轉的日志個數為 5 個:
docker run -d --log-driver=json-file --log-opt max-size=1k --log-opt max-file=5 --name webserver -p 9988:80 nginx
有了 rotate,我們就不必擔心某個 container 的日志暴漲而將同 host 的其他 container 拖死了。
–mac-address
--mac-address= Container MAC address (e.g. 92:d0:c6:0a:29:33)
設置容器的 mac 地址。
-m, --memory
-m, --memory= Memory limit
設置容器使用的最大內存上限。默認單位為 byte,可以使用 K、G、M 等帶單位的字符串。
默認情況下,容器可以使用主機上的所有空閑內存。
設置容器的內存上限,參考命令如下所示:
docker run -tid —name mem1 —memory 128m ubuntu:14.04 /bin/bash
默認情況下,除了 –memory 指定的內存大小以外,docker 還為容器分配了同樣大小的 swap 分區,也就是說,上面的命令創建出的容器實際上最多可以使用 256 MB內存,而不是 128 MB內存。如果需要自定義 swap 分區大小,則可以通過聯合使用 –memory–swap 參數來實現控制。
對上面的命令創建的容器,可以查看到在 cgroups 的配置文件中,查看到容器的內存大小為 128 MB (128×1024×1024=134217728B),內存和 swap 加起來大小為 256MB (256×1024×1024=268435456B)。
#cat /sys/fs/cgroup/memory/docker/<容器的完整ID>/memory.limit_in_bytes 134217728 #cat /sys/fs/cgroup/memory/docker/<容器的完整ID>/memory.memsw.limit_in_bytes 268435456
注意:
執行上述命令時,命令行可能會輸出下面的警告:
WARNING: Your kernel does not support swap limit capabilities, memory limited without swap.
這是因為主機上默認不啟用 cgroup 來控制 swap 分區,可以參考 docker 官方的相應文檔,修改 grub 啟動參數。
-memory-reservation
--memory-reservation= Memory soft limit
啟用彈性的內存共享,當宿主機資源充足時,允許容器盡量多地使用內存,當檢測到內存競爭或者低內存時,強制將容器的內存降低到 memory-reservation 所指定的內存大小。按照官方說法,不設置此選項時,有可能出現某些容器長時間占用大量內存,導致性能上的損失。
–memory-swap
--memory-swap= Total memory (memory + swap), '-1' to disable swap
等于內存和 swap 分區大小的總和,設置為 -1 時,表示 swap 分區的大小是無限的。默認單位為 byte,可以使用 K、G、M 等帶單位的字符串。如果 –memory-swap 的設置值小于 –memory 的值,則使用默認值,為 –memory-swap 值的兩倍。
–memory-swappiness
--memory-swappiness=-1 Tuning container memory swappiness (0 to 100)
控制進程將物理內存交換到 swap 分區的傾向,默認系數為 60。系數越小,就越傾向于使用物理內存。值范圍為 0-100。當值為100 時,表示盡量使用 swap 分區;當值為 0 時,表示禁用容器 swap 功能(這點不同于宿主機,宿主機 swappiness 設置為 0 也不保證 swap 不會被使用)。
–name
--name= Assign a name to the container
為容器指定一個名字。
$ docker run -it --name=web ubuntu:14.04 /bin/bash
–net
--net=default Set the Network for the container
以下是網絡設置中常用的參數:
none 關閉 container 內的網絡連接:
將網絡模式設置為 none 時,這個 container 將不允許訪問任何外部 router。這個 container 內部只會有一個 loopback 接口,而且不存在任何可以訪問外部網絡的 outer。
bridge 通過veth接口來連接 contianer 默認選項:
Docker 默認是將 container 設置為 bridge 模式。此時在 host 上面講存在一個 docker0 的網絡接口,同時會針對 container 創建一對 veth 接口。其中一個 veth 接口是在 host 充當網卡橋接作用,另外一個 veth 接口存在于 container 的命名空間中,并且指向 container 的 loopback。Docker 會自動給這個 container 分配一個IP,并且將 container 內的數據通過橋接轉發到外部。
host 允許 container 使用 host 的網絡堆棧信息:
當網絡模式設置為 host 時,這個 container 將完全共享 host 的網絡堆棧。host 所有的網絡接口將完全對 container 開放。container 的主機名也會存在于 host 的 hostname 中。這時,container 所有對外暴露的 port 和對其它 container 的 link,將完全失效。
Container:
當網絡模式設置為 Container 時,這個 container 將完全復用另外一個 container 的網絡堆棧。同時使用時這個 container 的名稱必須要符合下面的格式:–net container:.
比如當前有一個綁定了本地地址 localhost 的 redis container。如果另外一個 container 需要復用這個網絡堆棧,則需要如下操作:
$ docker run -d --name redis example/redis --bind 127.0.0.1 # use the redis container's network stack to access localhost $ sudo docker run --rm -ti --net container:redis example/redis-cli -h 127.0.0.1
–oom-kill-disable
--oom-kill-disable=false Disable OOM Killer
-P, --publish-all
-P, --publish-all=false Publish all exposed ports to random ports
對外映射所有端口。
-p, --publish
-p, --publish=[] Publish a container's port(s) to the host
對外映射指定端口,如不指定映射后的端口將隨機指定。
$ docker run –d -p 10022:22 -p 10080:80 -it webserver:v1
使用 docker run 來啟動我們創建的容器。-d讓容器以后臺方式運行。使用多個-p來映射多個端口,將容器的22端口映射為本地的10022,80映射為10080。
–pid
--pid= PID namespace to use
設置容器的 PID 模式。兩種:
host: use the host's PID namespace inside the container. Note: the host mode gives the container full access to local PID and is therefore considered insecure.
–privileged
--privileged=false Give extended privileges to this container
$ docker run -it --rm --privileged ubuntu:14.04 /bin/bash
–read-only
--read-only=false Mount the container's root filesystem as read only
啟用后,容器的文件系統將為只讀。
$ docker run -it --rm --read-only ubuntu:14.04 /bin/bash root@d793e24f0af1:/# touch a touch: cannot touch 'a': Read-only file system
no,默認策略,在容器退出時不重啟容器
on-failure,在容器非正常退出時(退出狀態非 0),才會重啟容器
on-failure:3,在容器非正常退出時重啟容器,最多重啟 3 次
always,在容器退出時總是重啟容器,當操作系統或 docker 服務重啟時,該容器總能隨系統啟動
unless-stopped,在容器退出時總是重啟容器,但是不考慮在 Docker 守護進程啟動時就已經停止了的容器
示例:
$ docker run -it --restart=always ubuntu:14.04 /bin/bash
–rm
--rm=false Automatically remove the container when it exits
當容器退出時,清除所有該容器的信息。
–security-opt
--security-opt=[] Security Options
安全選項。
–sig-proxy
--sig-proxy=true|false Proxy received signals to the process (non-TTY mode only). SIGCHLD, SIGSTOP, and SIGKILL are not proxied. The default is true.
–stop-signal
--stop-signal=SIGTERM Signal to stop a container, SIGTERM by default
-t, --tty
-t, --tty=false Allocate a pseudo-TTY
分配一個模擬終端,常和 -i 一塊使用.
-u, --user
-u, --user= Username or UID (format:
–ulimit
–ulimit=[] Ulimit options
–default-ulimit,docker daemon 的啟動參數,能夠指定默認 container ulimit 配置。如果此參數沒配置,則默認從 docker daemon繼承;
–ulimit,docker run 的參數,能夠覆蓋 docker daemon 指定的 ulimit 默認值。如果此參數沒配置,則默認從 default-ulimit 繼承;
$ docker run -it -d --ulimit nofile=20480:40960 ubuntu:14.04 /bin/bash
-v, --volume
-v, --volume=[] Bind mount a volume
可以使用帶有 -v 參數的 docker run 命令給容器添加一個數據卷.
添加數據卷/data1,會自動創建目錄
$ docker run -it --name web -v /data1 ubuntu:14.04 /bin/bash root@fac11d44de3e:/# df -h /dev/disk/by-uuid/1894172f-589b-4e8b-b763-7126991c7fbb 29G 2.6G 25G 10% /data1 root@fac11d44de3e:/# cd /data1
將宿主機的目錄添加到容器
將宿主機的 /data_web 加載為容器 /data 目錄
$ docker run -it --name web -v /data_web:/data ubuntu:14.04 /bin/bash
–volumes-from
--volumes-from=[] Mount volumes from the specified container(s)
從其他容器掛載目錄。
1.創建 dbdata 容器,并含有 /data 數據卷
$ docker run -it -v /data --name dbdata ubuntu:14.04 /bin/bash
2.創建 webserver1 掛載 dbdata 的數據卷
$ docker run -it --volumes-from dbdata --name webserver1 ubuntu:14.04 /bin/bash
-w, --workdir
-w, --workdir= Working directory inside the container
設置容器的工作目錄。
$ docker run -it --workdir="/data" ubuntu:14.04 /bin/bash root@7868da4d2846:/data#
相關系列:
Docker 操作指南之常用操作篇
Docker 操作指南之常用命令篇
Docker 操作指南之運行命令篇
Docker 操作指南之常見使用篇
Docker 操作指南之使用示例篇
Docker 操作指南之構建鏡像篇
Docker 操作指南之 Compose 管理篇
Docker 容器
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。