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

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

用於連接兩個容器。

啓動容器1web

docker run --name web -d -p 22 -p 80 -itwebserver:v1

啓動容器2ap1連接到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,可以使用KGM等帶單位的字符串。

默認情況下,容器可以使用主機上的所有空閒內存。

設置容器的內存上限,參考命令如下所示:

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 &

wKiom1fA63OTQadSAAMQVvDZErw433.png-wh_50

可以發現,使用256MB進行壓力測試時,由於超過了內存上限(128MB內存+128MB swap),進程被OOM殺死。使用250MB進行壓力測試時,進程可以正常運行,並且通過docker stats可以查看到容器的內存已經滿負載了。

wKioL1fA64qAip-zAACSsOsXYZ4593.png-wh_50

--memory-reservation

--memory-reservation=     Memory soft limit

啓用彈性的內存共享,當宿主機資源充足時,允許容器儘量多地使用內存,當檢測到內存競爭或者低內存時,強制將容器的內存降低到memory-reservation所指定的內存大小。按照官方說法,不設置此選項時,有可能出現某些容器長時間佔用大量內存,導致性能上的損失。

--memory-swap

--memory-swap=      Total memory (memory + swap), '-1' todisable swap

等於內存和swap分區大小的總和,設置爲-1時,表示swap分區的大小是無限的。默認單位爲byte,可以使用KGM等帶單位的字符串。如果–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

wKioL1fA66_B4pL9AAAevRaABrc162.png-wh_50

--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的命名空間中,並且指向containerloopbackDocker會自動給這個container分配一個IP,並且將container內的數據通過橋接轉發到外部。

  • host 允許container使用host的網絡堆棧信息:

當網絡模式設置爲host時,這個container將完全共享host的網絡堆棧。host所有的網絡接口將完全對container開放。container的主機名也會存在於hosthostname中。這時,container所有對外暴露的port和對其它containerlink,將完全失效。

  • Container

當網絡模式設置爲Container時,這個container將完全複用另外一個container的網絡堆棧。同時使用時這個container的名稱必須要符合下面的格式:--net container:<name|id>.

比如當前有一個綁定了本地地址localhostredis 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

容器退出時將自動銷燬。

wKiom1fA7DKS20zsAAAkig5bDbw015.png-wh_50

--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-ulimitdockerdaemon的啓動參數,能夠指定默認container ulimit配置。如果此參數沒配置,則默認從docker daemon繼承;

--ulimitdocker 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#


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