Docker中的Registry與系統資源限制

Docker中的Registry與系統資源限制

  • Registry用於保存docker鏡像,包括鏡像的層次結構和元數據
  • 用戶可自建Registry,也可使用官方的Docker Hub
  • 分類
    1. Sponsor Registry:第三方的registry,客戶和Docker社區使用
    2. Mirror Registry:第三方的registry,只讓客戶使用
    3. Vendor Registry:由發佈Docker鏡像的供應商提供的registry
    4. Private Registry:通過設有防火牆和額外的安全層的私有實體提供的registry
  • docker-registry鏡像地址https://hub.docker.com/_/registry?tab=tags
  1. 相關命令

    • yum info docker-registry查看registry的版本信息

    • yum install docker-registry安裝docker的registry,會默認安裝最新版本。

    • rpm -ql docker-distribution查看registry安裝的配置文件路徑。

    • vim /etc/docker-distribution/registry/config.yml registry的配置文件信息:

      version: 0.1
      log:
      fields:
          service: registry
      storage:
          cache:
              layerinfo: inmemory
          filesystem:
              rootdirectory: /var/lib/registry
      http:
          addr: :5000
      
    • systemctl start docker-distribution啓動registry服務

    • ss -tnl可以查看registry服務在5000端口上

    • docker tag myweb:v0.3-8 192.168.61.109:5000/myweb:v0.3-11將鏡像重新達標爲指定格式

    • vim /etc/docker/daemon.json修改daemon.json文件添加如下信息

      1. "insecure-registries": ["192.168.61.109:5000"],指定不安全的registry服務器,可以支持http協議,docker客戶端默認是https協議。
      2. systemctl restart docker修改配置後,需要重啓docker服務
    • docker push 192.168.61.109:5000/myweb:v0.3-11推送倉庫

  2. Registry存儲和索引

    • Repository
      1. 由某特定的docker鏡像的所有迭代版本組成的鏡像倉庫
      2. 一個Registry中可以存在多個Repository
        • Repository可分爲“頂層倉庫”和“用戶倉庫”
        • 用戶倉庫名稱格式爲“用戶名/倉庫名”
      3. 每個倉庫可以包含多個Tag(標籤),每個標籤對應一個鏡像
    • index
      1. 維護用戶賬戶、鏡像的校驗以及公共命名空間的信息
      2. 相當於爲Registry提供了一個完成用戶認證等功能的檢索接口
  3. Harbor

    • Project Harbor是一個開源的可信雲本地註冊表項目,用於存儲、簽名和掃描內容。
      1. Harbor通過添加安全、dentity和管理等用戶通常需要的功能,擴展了開源Docker發行版。
      2. Harbor支持高級特性,如用戶管理、訪問控制、活動監視和實例間複製
  4. Feathers

    • 多租戶內容簽名和驗證(Multi-tenant content signing and validation)
    • 安全性和漏洞分析(Security and vnlnerability analysis)
    • 審計日誌記錄(Audit logging)
    • 身份集成和基於角色的訪問控制(ldentity integration and role-based access control)
    • 實例之間的映像複製(Image replication between instances)
    • 可擴展APl和圖形用戶界面(Extensible API and graphical UI)
    • 國際化(目前中英文)(Internationalization (currently English and Chinese))

Docker Compose(單機編排工具)

  • 網址https://docs.docker.com/compose/相關指令用法。
  • harbor倉庫地址https://github.com/goharbor/harbor
  • 相關命令
    1. yum info docker-compose查看compose版本信息
    2. wget https://storage.googleapis.com/harbor-releases/release-1.8.0/harbor-offline-installer-v1.8.2.tgz下載安裝包
    3. tar -xf harbor-offline-installer-v1.8.2.tgz -C /usr/local/解壓
      • 配置文件:/usr/local/harbor.yml,將配置裏面的主機名修改爲自己主機的主機名
      • 安裝文件/usr/local/install.sh
    4. yum install docker-compose安裝Compose
    5. /usr/local/harbor/install.sh安裝harbor
      • 安裝完成後,可以直接訪問宿主機的80端口查看web界面。
      • 管理員賬戶:admin/Harbor12345(默認情況,可以在配置文件中修改)
  • docker-compose操作命令
    1. docker-compose pause暫停compose
    2. docker-compose unpause繼續運行compose

Docker的資源限制及驗證

  1. Limit a container’s resources(限制容器支援)

    • 默認情況下,容器沒有資源約束,並且可以在主機的內核調度程序允許的情況下儘可能多地使用給定的資源。
    • Docker提供了控制容器可以使用多少內存、CPU或塊IO的方法,設置Docker run命令的運行時配置標誌。
    • 這些特性中有許多要求內核支持Linux功能。
      1. 要檢查是否支持,可以使用docker info命令。
  2. Resource allowances(資源津貼)

    • Eight-sided containers
      docker2_003
  3. Memory(存儲)

    • 在Linux主機上,如果內核檢測到沒有足夠的內存來執行重要的系統功能,它會拋出一個OOME或Out Of memory異常,並開始殺死進程來釋放內存。
      1. 一旦發生OOME,任何進程都有可能被殺死,包括docker daemon在內
      2. 爲此,Docker特地調整了docker daemon的OOM優先級,以免它被內核“正法”,但容器的優先級並未被調整
  4. 限制容器使用資源選項

    選項 含義
    -m or --memory= 容器可以使用的最大內存量。如果您設置此選項,最小允許值爲4m (4 mb)。
    --memory-swap * 此容器允許交換到磁盤的內存量。看到-memory-swap細節。
    --memory-swappiness 默認情況下,主機內核可以交換容器使用的匿名頁面的百分比。您可以將--memory-swappiness設置爲0到100之間的值,以調整這個百分比。看到--memory-swappiness細節。
    --memory-reservation 允許您指定一個小於--memory的軟限制,當Docker檢測到主機上的爭用或內存不足時,內存將被激活。如果使用--memory-reservation,則必須將其設置爲低於--memory,以便它優先。因爲它是一個軟限制,所以不能保證容器不超過這個限制
    --kernel-memory 容器可以使用的最大內核內存量。最小允許值爲4m,因爲內核內存不能交換出去,缺少內核內存的容器可能會阻塞主機資源,這可能對主機和其他容器產生副作用。查看--kernel-memory信息
    --oom-kill-disable 默認情況下,如果發生內存不足(OOM)錯誤,內核將終止容器中的進程。要更改此行爲,請使用--oom-kill-disable選項。只在還設置了-m/--memory選項的容器上禁用OOM殺手。如果沒有設置-m標誌,主機可能會耗盡內存,內核可能需要殺死主機系統的進程來釋放內存。
    • memory-swap

      1. 當容器耗盡所有可用的RAM時,使用swap允許容器將多餘的內存需求寫入磁盤。
      2. --memory-swap是一個修飾符標誌,只有在--memory也被設置時纔有意義。

      |--MEMORY-SWAP|--memory|功能|
      |正數S|正數M|容器可用總控件爲S,其中ram爲M,swap爲(S-M),若S=M,則無可用swap資源|
      |0|正數M|相當於未設置swap(unset)|
      |unset|正數M|若主機(Docker Host)啓用了swap,則容器的可用swap爲2*M|
      |-1|正數M|若主機(Docker Host)啓用了swap,則容器可使用最大至主機上的所有swap空間swap資源|

      • 注意:在容器內使用free命令可以看到的swap空間並不具有其所展現的控件指示意義。
  5. CPU

    • 默認情況下,每個容器對主機的CPU週期的訪問是無限制的
    • 您可以設置各種約束來限制給定容器對主機CPU週期的訪問。
    • 大多數用戶使用並配置默認的CFS調度程序。
    • 在Docker 1.13及更高版本中,還可以配置實時調度程序。
    • CPU的資源限定
    選項 含義
    --cpus=<value> 指定容器可以使用多少可用CPU資源。例如,如果主機有兩個cpu,並且您設置了--cpu="1.5",那麼容器最多保證有一個半cpu。這相當於設置--cpu-period="10000"--cpu-quota="150000"。可在Docker 1.13或更高版本中使用。
    --cpu-period=<value> 指定CPU CFS調度程序週期,它與--cpu-quota一起使用。默認爲100微秒。大多數用戶不會從默認值更改此值。如果使用Docker 1.13或更高版本,請使用--cpus
    --cpuset-cpus 限制容器可以使用的特定cpu或核心。如果您有多個CPU,則容器可以使用逗號分隔的列表或連字符分隔的CPU範圍。第一個CPU編號爲0。有效值可以是0-3(使用第一個、第二個、第三個和第四個CPU)或1、3(使用第二個和第四個CPU)。
    --cpu-shares 將此標誌設置爲一個大於或小於默認值1024的值,以增加或減少容器的權重,並允許它訪問主機CPU週期的更大或更小的比例。只有在CPU週期受到限制時才強制執行。當有足夠的CPU週期可用時,所有l容器都會根據需要使用盡可能多的CPU。這樣,這就是一個軟極限。--cpu-share不阻止以羣集模式調度容器。它爲可用的CPU週期確定容器CPU資源的優先級。它不保證或保留任何特定的CPU訪問。
  • 注意:使用docker run --help可以找到這些參數

  • 簡單示例:

    1. docker pull lorel/docker-stress-ng下載鏡像
    2. docker run --name stree -it --rm lorel/docker-stress-ng:latest stress --help查看命令運行幫助
    3. 驗證內存分配:docker run --name stress -it --rm -m 256m lorel/docker-stress-ng:latest stress --vm 2啓動stress,最多給256m內存,啓動2個進程做壓測,每個進程默認佔用256m
      • docker top stress可以查看容器內的資源分配
      • docker stats顯示duocker所有容器的資源分配情況
    4. 驗證cpu分配情況:docker run --name stress -it --rm --cpus 2 lorel/docker-stress-ng:latest stress --cpu 8在cpu上啓動8個線程做壓力測試,單容器同時最多隻能使用2個cpu內核(即cpu核心數爲2個)。
      • docker run --name stress -it --rm lorel/docker-stress-ng:latest stress --cpu 8不對cpu做核心限制,會使用所有cpu。
    5. 驗證指定cpu上運行docker run --name stress -it --rm --cpuset-cpus 0,2 lorel/docker-stress-ng:latest stress --cpu 8 #在cpu上啓動8個線程,但容器只能在cpu爲0或2上的cpu上運行,即cpu核心數爲2個
    6. 儘可能佔用多的cpudocker run --name stress -it --rm --cpu-shares 1024 lorel/docker-stress-ng:latest stress --cpu 8 #在cpu上啓動8個線程,容器可以儘可能使用更多的空閒cpu
      • 如果同時再啓動一個docker run --name stress2 -it --rm --cpu-shares 512 lorel/docker-stress-ng:latest stress --cpu 8那麼新啓動的容器所佔用的cpu和之前的cpu佔用比值爲:512:1024即:1:2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章