docker run
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Run a command in a new container
上接博文:docker run命令詳解及示例(一)
--link
--link=[] Add link to another container
用於連接兩個容器。
啓動容器1:web
docker run --name web -d -p 22 -p 80 -itwebserver: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
--lxc-conf
--lxc-conf=[] Add custom lxc options
設置lxc配置項。
示例:
docker run--lxc-conf="lxc.network.type=veth"--lxc-conf="lxc.network.ipv4=192.168.1.10/24"--lxc-conf="lxc.network.ipv4.gateway=192.168.1.1"--lxc-conf="lxc.network.link=docker0"--lxc-conf="lxc.network.name=eth0" --lxc-conf="lxc.network.flags=up" -it --net=none ubuntu:14.04/bin/bash
--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 128mubuntu:14.04 /bin/bash
默認情況下,除了–memory指定的內存大小以外,docker還爲容器分配了同樣大小的swap分區,也就是說,上面的命令創建出的容器實際上最多可以使用256MB內存,而不是128MB內存。如果需要自定義swap分區大小,則可以通過聯合使用–memory–swap參數來實現控制。
對上面的命令創建的容器,可以查看到在cgroups的配置文件中,查看到容器的內存大小爲128MB (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 kerneldoes not support swap limit capabilities, memory limited without swap.
這是因爲主機上默認不啓用cgroup來控制swap分區,可以參考docker官方的相應文檔,修改grub啓動參數。
在容器中,依次使用下面的stress命令,即可對容器的內存進行壓力測試,確認內存。
stress –vm 1–vm-bytes 256M –vm-hang 0 &
stress –vm 1 –vm-bytes 250M–vm-hang 0 &
可以發現,使用256MB進行壓力測試時,由於超過了內存上限(128MB內存+128MB swap),進程被OOM殺死。使用250MB進行壓力測試時,進程可以正常運行,並且通過docker stats可以查看到容器的內存已經滿負載了。
--memory-reservation
--memory-reservation= Memory soft limit
啓用彈性的內存共享,當宿主機資源充足時,允許容器儘量多地使用內存,當檢測到內存競爭或者低內存時,強制將容器的內存降低到memory-reservation所指定的內存大小。按照官方說法,不設置此選項時,有可能出現某些容器長時間佔用大量內存,導致性能上的損失。
--memory-swap
--memory-swap= Total memory (memory + swap), '-1' todisable 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接口,而且不存在任何可以訪問外部網絡的router。
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:<name|id>.
比如當前有一個綁定了本地地址localhost的redis container。如果另外一個container需要複用這個網絡堆棧,則需要如下操作:
#docker run -d --name redis example/redis--bind 127.0.0.1
$ # use the redis container's network stackto access localhost
#sudo docker run --rm -ti --netcontainer: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 -itwebserver:v1
使用docker run來啓動我們創建的容器。-d讓容器以後臺方式運行。使用多個-p來映射多個端口,將容器的22端口映射爲本地的10022,80映射爲10080。
--pid
--pid= PID namespace to use
設置容器的PID模式。兩種:
host: use the host's PID namespace insidethe container.
Note: the host mode gives the containerfull access to local PID and is therefore considered insecure.
--privileged
--privileged=false Give extended privileges to this container
默認情況下container是不能訪問任何其他設備的。但是通過"privileged",container就擁有了訪問任何其他設備的權限。
當操作者執行docker run --privileged時,Docker將擁有訪問host所有設備的權限
# docker run -it --rm --privilegedubuntu:14.04 /bin/bash
--read-only
--read-only=false Mount the container's root filesystem asread only
啓用後,容器的文件系統將爲只讀。
# docker run -it --rm --read-onlyubuntu:14.04 /bin/bash
root@d793e24f0af1:/# touch a
touch:cannot touch 'a': Read-only file system
--restart
--restart=no Restart policy to apply when a containerexits
當容器退出或宿主機重啓的時候,容器接着會重啓操作。
重啓策略:
no - 不重啓
on-failure - container推出狀態非0時重啓
always - 始終重啓
示例:
#docker run -it--restart=always ubuntu:14.04 /bin/bash
當退出容器時,再查看容器的狀態爲UP
--rm
--rm=false Automatically remove the container whenit 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 defaultis true.
--stop-signal
--stop-signal=SIGTERM Signal to stop a container, SIGTERM bydefault
-t, --tty
-t, --tty=false Allocate a pseudo-TTY
分配一個模擬終端,常和-i一塊使用.
-u, --user
-u, --user= Username or UID (format:<name|uid>[:<group|gid>])
Sets the username or UID used andoptionally the groupname or GID for the specified command.
The followings examples are all valid:
--user [user | user:group | uid | uid:gid |user:gid | uid:group ]
Without this argument the command will berun as root in the container.
--ulimit
--ulimit=[] Ulimit options
--default-ulimit,dockerdaemon的啓動參數,能夠指定默認container ulimit配置。如果此參數沒配置,則默認從docker daemon繼承;
--ulimit,docker run的參數,能夠覆蓋dockerdaemon指定的ulimit默認值。如果此參數沒配置,則默認從default-ulimit繼承;
# docker run -it -d --ulimitnofile=20480:40960 ubuntu:14.04 /bin/bash
--uts
--uts= UTS namespace to use
-v, --volume
-v, --volume=[] Bind mount a volume
可以使用帶有 -v 參數的 docker run 命令給容器添加一個數據卷.
1.添加數據卷/data1,會自動創建目錄
# docker run -it --name web -v /data1ubuntu: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
2.將宿主機的目錄添加到容器
將宿主機的/data_web加載爲容器/data目錄
# docker run -it --name web -v/data_web:/data ubuntu:14.04 /bin/bash
--volume-driver
--volume-driver= Optional volume driver for the container
--volumes-from
--volumes-from=[] Mount volumes from the specifiedcontainer(s)
從其他容器掛載目錄。
1.創建dbdata容器,並含有/data數據卷
# docker run -it -v /data --name dbdataubuntu: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#