2014-06-20 44 views
29

我需要正確設置文件描述符限制泊塢窗容器 我連接到容器使用ssh(https://github.com/phusion/baseimage-docker如何設置的ulimit /文件上泊塢窗容器描述符的圖像標籤是PHUSION/baseimage - 泊塢窗

已上嘗試:

  • 編輯limits.conf中的容器忽略此文件
  • 新貴程序在https://coderwall.com/p/myodcq發現但這泊塢窗圖像有不同的init程序。 (runit)
  • 我試圖修改PAM庫的配置/etc/pam.d中
  • 嘗試啓用PAM進行SSH sshd_config中

輸出它總是一樣的。

bash: ulimit: open files: cannot modify limit: Operation not permitted 

回答

24

一些搜索,我發現這對谷歌的羣體討論後:

搬運工目前抑制這種能力增強了安全性。

這是因爲主機系統的ulimit設置適用於泊塢窗容器。在容器中運行的程序可以改變主機的ulimit設置被認爲是一種安全風險。

好消息是,你有兩種不同的解決方案可供選擇。

  1. lxc_template.go中刪除並重新編譯docker。然後 您可以將ulimit設置爲最高。

  • 停止搬運工惡魔。更改主機上的ulimit設置。開始 碼頭惡魔。它現在有您的修訂限制,並且其子 也處理。
  • 我施加的第二種方法:

    1. sudo service docker stop;

    2. 改變限制在/etc/security/limits.conf文件

    3. 重啓機器

    4. 運行我的容器

    5. 運行ulimit -a在容器中確認打開的文件限制已被繼承。

    參見:https://groups.google.com/forum/#!searchin/docker-user/limits/docker-user/T45Kc9vD804/v8J_N4gLbacJ

    +1

    也有是要改變一個有用的教程'的/ etc/security/limits.conf'在https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/5/html/Tuning_and_Optimizing_Red_Hat_Enterprise_Linux_for_Oracle_9i_and_10g_Databases/chap-Oracle_9i_and_10g_Tuning_Guide-Setting_Shell_Limits_for_the_Oracle_User.html –

    +0

    您知道爲什麼需要重新啓動嗎?爲什麼不重新啓動外殼? – CMCDragonkai

    4

    其實,我已經嘗試了上面的回答,但它似乎沒有工作。

    爲了讓我的容器承認ulimit變化,我不得不開始之前更新docker.conf文件:

    $ sudo service docker stop 
    $ sudo bash -c "echo \"limit nofile 262144 262144\" >> /etc/init/docker.conf" 
    $ sudo service docker start 
    
    +0

    當機器重新啓動後,這些更改不會佔上風,但是一旦機器啓動後重新啓動泊塢窗的服務,容器將執行所需的配置。 –

    2

    這裏是我做的。

    設置 ulimit -n 32000 文件/etc/init.d/docker

    並重新啓動泊塢窗服務

    docker run -ti node:latest /bin/bash

    運行此命令來驗證

    [email protected]:/# ulimit -a

    應該在r中看到esult

    open files (-n) 32000

    [[email protected] ec2-user]# docker run -ti node /bin/bash 
    [email protected]:/# ulimit -a 
    core file size   (blocks, -c) 0 
    data seg size   (kbytes, -d) unlimited 
    scheduling priority    (-e) 0 
    file size    (blocks, -f) unlimited 
    pending signals     (-i) 58729 
    max locked memory  (kbytes, -l) 64 
    max memory size   (kbytes, -m) unlimited 
    open files      (-n) 32000 
    pipe size   (512 bytes, -p) 8 
    POSIX message queues  (bytes, -q) 819200 
    real-time priority    (-r) 0 
    stack size    (kbytes, -s) 10240 
    cpu time    (seconds, -t) unlimited 
    max user processes    (-u) 58729 
    virtual memory   (kbytes, -v) unlimited 
    file locks      (-x) unlimited 
    
    0

    對於boot2docker,我們可以將它放在/var/lib/boot2docker/profile,例如:

    ulimit -n 2018

    被警告不要把此限制設得太高,因爲它會減慢down apt-get!查看錯誤#1332440。我與debian jessie合作過。

    26

    最新的docker支持通過命令行和API設置ulimits。例如,docker run需要--ulimit <type>=<soft>:<hard>,並且可以根據您的喜好選擇多個。因此,對於你的nofile,一個例子是--ulimit nofile=262144:262144

    +9

    這是否意味着特定容器比其他容器具有更高的限制?主機的ulimit是否保持不變? – garbagecollector

    +1

    @garbagecollector是的,這意味着特定容器比其他容器具有更高的限制。這是因爲如果在** docker run **命令中未指定** - ulimit **,那麼容器將繼承docker守護進程的默認ulimit。而且,主機的ulimit保持不變。 –

    +1

    @SuhasChikkanna只是爲了確保如果容器最大「打開文件」限制高於帶下劃線的主機最大「打開文件」,容器限制是否會被忽略? –

    6

    我已經嘗試了很多選擇,並不確定爲什麼上面提出的幾個解決方案在一臺機器上工作,而不是在其他機器上工作。

    的作品,那就是簡單,每個集裝箱工作的解決方案是:

    docker run --ulimit memlock=819200000:819200000 -h <docker_host_name> --name=current -v /home/user_home:/user_home -i -d -t docker_user_name/image_name 
    
    0

    docker run命令有一個--ulimit標誌,你可以使用此標誌設在泊塢窗容器打開的文件的限制。

    啓動容器以設置打開的文件限制時運行以下命令。

    docker run --ulimit nofile=<softlimit>:<hardlimit>冒號前的第一個值表示軟文件限制,冒號後的值表示硬文件限制。您可以通過在交互模式下運行您的容器和執行在容器下面的命令外殼ulimit -n

    PS驗證這一點:看看這個blog後更加清晰