ฉันควรจะกังวลเกี่ยวกับคอนเทนเนอร์ Docker ที่มากเกินไปและไม่ทำงานหรือไม่?


142

ทุกdocker runคำสั่งหรือทุกRUNคำสั่งภายใน Dockerfile จะสร้างคอนเทนเนอร์ docker ps -aถ้าภาชนะที่ไม่ได้ทำงานก็ยังสามารถมองเห็นได้ด้วย

ฉันควรกังวลกับการมีรายการของคอนเทนเนอร์ที่ไม่ทำงานขนาดใหญ่หรือไม่? ฉันควรออกdocker rmภาชนะที่ไม่ทำงานหรือไม่

ฉันไม่แน่ใจว่าประสิทธิภาพหรือหน่วยความจำ / บทลงโทษของการจัดเก็บบรรจุภัณฑ์ที่ไม่ทำงานเหล่านี้เกิดขึ้นได้อย่างไร


1
docker execคำสั่งได้รับการเพิ่มขณะที่ผ่านมาเห็นdocs.docker.com/reference/commandline/cli/#exec - มันจะรันคำสั่งปิดภาชนะที่ทำงาน
schmunk

หากคุณต้องการดูวิธีลบคอนเทนเนอร์เก่าให้ดูคำถามนี้: stackoverflow.com/questions/17236796/…
Ryan Walls

1
@schmunk ลิงก์ย้ายไปแล้ว docs.docker.com/engine/reference/commandline/exec
akauppi

คำตอบ:


72

คอนเทนเนอร์ที่ไม่ได้ทำงานอยู่ไม่ได้รับทรัพยากรระบบใด ๆ นอกเหนือจากพื้นที่ดิสก์

โดยปกติแล้วจะเป็นการดีที่จะทำความสะอาดหลังจากตัวเอง แต่ถ้าคุณมีพวกเขาจำนวนมากนั่งอยู่รอบ ๆ ก็ไม่ควรชะลอการแสดงเลย

หากคุณสังเกตเห็นความช้าลงเมื่อรันคำสั่งนักเทียบท่าพร้อมกับคอนเทนเนอร์ที่หยุดทำงานจำนวนมากอาจเป็นข้อผิดพลาดในนักเทียบท่าและคุณควรส่งข้อบกพร่อง


1
ตอนนี้เอกสารสำหรับRUNคำสั่งได้ย้ายไปที่: docs.docker.io/en/latest/reference/builder/#run
aculich

63

docker runเอกสารอธิบายวิธีการทำความสะอาดโดยอัตโนมัติภาชนะและลบไฟล์ระบบเมื่อออกจากภาชนะ:

  --rm=false: Automatically remove the container when it exits (incompatible with -d)

ข้างต้นแสดงให้เห็นว่าโดยภาชนะเริ่มต้นจะไม่ถูกลบ แต่การเพิ่ม--rm=trueหรือเพียงแค่ทางลัด--rmจะทำงานเช่นนั้น:

sudo docker run -i -t --rm ubuntu /bin/bash

เมื่อคุณออกจากตู้คอนเทนเนอร์มันจะถูกลบโดยอัตโนมัติ

คุณสามารถทดสอบสิ่งนี้ได้โดยทำรายการคอนเทนเนอร์ของนักเทียบท่าในหน้าต่างเทอร์มินัลเดียว:

watch -n1 'sudo ls -c /var/lib/docker/containers'

จากนั้นในหน้าต่างอื่นให้เรียกใช้คำสั่งนี้เพื่อเรียกใช้คอนเทนเนอร์นักเทียบท่าที่จะออกจากระบบโดยอัตโนมัติหลังจากนอนหลับนานถึง 10 วินาที

for i in {1..10}; do sudo docker run --rm ubuntu /bin/sleep $i & done

4
ไม่ใช่คำตอบที่ตรงกับคำถามแต่เป็นคำตอบที่น่าสนใจที่จะให้ผู้ใช้เข้าใจถึงกลไกเบื้องหลังนักเทียบท่า ขอบคุณ!
thaJeztah

3
-rmเลิกใช้แล้วและจะถูกลบออกในบางครั้งให้ใช้ --rmแทน
bain

5

หากคุณเรียกใช้คอนเทนเนอร์ที่มีโวลุ่มและไม่ใช้นักเทียบท่า rm -vเพื่อลบมันออกโวลุ่มนั้นจะไม่ถูกลบออกหลังจากคุณลบคอนเทนเนอร์ นอกจากนี้ยังมีปัญหากับไดรเวอร์หน่วยเก็บข้อมูล vfs หากคุณลืมล้างข้อมูลโวลุ่มจะกินพื้นที่ดิสก์ของคุณ


2

ฉันไม่แน่ใจว่าประสิทธิภาพหรือหน่วยความจำ / บทลงโทษของการจัดเก็บบรรจุภัณฑ์ที่ไม่ทำงานเหล่านี้เกิดขึ้นได้อย่างไร

ในการประเมินว่ามีการใช้หน่วยเก็บข้อมูลที่ไม่ได้ใช้งานพื้นที่เก็บข้อมูลของคอนเทนเนอร์เท่าไรคุณอาจเรียกใช้:

docker ps --size --filter "status=exited"

เท่าที่คุณสามารถเรียกใช้:docker container ls --filter "status=exited"

คุณอาจใช้คำสั่งdocker system df(แนะนำใน Docker 1.13.0, 2017 มกราคม) เพื่อดูการใช้งานดิสก์ docker เช่น:

username@server:~$ docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              44                  28                  114.7GB             84.84GB (73%)
Containers          86                  7                   62.43GB             41.67GB (66%)
Local Volumes       2                   1                   0B                  0B
Build Cache                                                 0B                  0B
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.