sudo docker run --name seckill0 -p 8080:8080 -m 1024M --cpus=0.2 -d seckill:v0
sudo docker run --name seckill1 -p 8081:8080 -m 1024M --cpus=0.2 -d seckill:v0
sudo docker run --name seckill2 -p 8082:8080 -m 1024M --cpus=0.2 -d seckill:v0
- -m:限制內存使用為1G
- --cpus:限制CPU使用的百分比
5、查看docker中容器占用宿主內存、CPU情況
docker stats
以下觀點來自知乎
如果僅從占用計算資源、內存資源和存儲資源的數量上考量,同一個服務以 docker 容器運行所占用的資源肯定多於在裸宿主機運行所占用的資源。但當服務變成分布式的時候,相同的一組服務在docker 容器上運行所占用的資源會顯著少於裸宿主機運行時所占用的資源。
產生這一反認知現象的原因,是現在編寫容器內運行服務的時候會對服務本身在設計時進行充分解耦,並大量采用無狀態機設計,重構后的應用在容器環境中,能更充分的利用多核CPU的性能。
按照我在幾個項目中的實驗結果,在裸宿主機上采用多進程方式運行同一應用,當同時運行的進程達到內核的2.3倍左右就會出現服務響應延遲的現象,但采用容器化運行時,相同的應用封裝在容器中,能夠在3.4倍以下的配比穩定運行,且各應用沒有響應延遲的現象。
在資源總量恆定的前提下,容器化后的應用相較於裸宿主機運行的更多,單個服務所占用的資源更少。
不少反而會多。在docker中運行還多了docker占用的資源。雖然docker是輕量級容器,但相比宿主還是多用了些許資源。那為什么還要用docker呢?
1. 方便快速擴展,例如一個web服務當訪問量增加時候,只需要復制一個容器並且添加負載均衡即可,相比單機配置要快得多。
2. 方便快速開發,當一個服務依賴較多配置繁復時候,docker可以配置快速配置一個相同的環境,方便快速開發。
如何給docker容器分配內存和cpu?默認情況下,容器使用的資源是不受限制的。也就是可以使用主機內核調度器所允許的最大資源。但是在容器的使用過程中,經常需要對容器可以使用的主機資源進行限制,下面我們來介紹下。
容器CPU設置
默認設置下,所有容器可以平等地使用主機 CPU 資源並且沒有限制。docker�0�2可以通過-c或–cpu-shares設置容器使用 CPU 的權重。如果不指定,默認值為 1024。
與內存限額不同,通過-c設置的 cpu share 並不是 CPU 資源的絕對數量,而是一個相對的權重值。某個容器最終能分配到的 CPU 資源取決於它的 cpu share 占所有容器 cpu share 總和的比例。通過 cpu share 可以設置容器使用 CPU 的優先級。
比如在 host 中啟動了兩個容器:
docker run --name "container_A" -c 1024 ubuntu docker run --name "container_B" -c 512 ubuntu
container_A 的 cpu share 1024,是 container_B 的兩倍。當兩個容器都需要 CPU 資源時,container_A 可以得到的 CPU 是 container_B 的兩倍。
需要注意的是,這種按權重分配 CPU只會發生在 CPU資源緊張的情況下。如果 container_A 處於空閑狀態,為了充分利用 CPU資源,container_B 也可以分配到全部可用的 CPU。
容器內存限額
與操作系統類似,容器可使用的內存包括兩部分:物理內存和 swap。 Docker 通過下面兩組參數來控制容器內存的使用量。
-m 或 –memory:設置內存的使用限額,例如 100M, 2G。
–memory-swap:設置 內存+swap 的使用限額。
當我們執行如下命令:
docker run -m 200M --memory-swap=300M ubuntu
其含義是允許該容器最多使用 200M 的內存和 100M 的 swap。默認情況下,上面兩組參數為 -1,即對容器內存和 swap 的使用沒有限制。
下面我們使用 progrium/stress 鏡像來為容器分配內存。該鏡像可用於對容器執行壓力測試。執行如下命令:
docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M
–vm 1:啟動 1 個內存工作線程。
–vm-bytes 280M:每個線程分配 280M 內存。
如果讓工作線程分配的內存超過 300M,分配的內存超過限額,stress 線程報錯,容器退出。
如果在啟動容器時只指定 -m 而不指定 –memory-swap,那么 –memory-swap 默認為 -m 的兩倍,比如:
docker run -it -m 200M ubuntu
容器最多使用 200M 物理內存和 200M swap。
