จะรู้ได้อย่างไรว่าทำไมคอนเทนเนอร์นักเทียบท่าถึงออก?


112

ฉันมีคอนเทนเนอร์ Docker ที่ทำงานในโฮสต์ของ RAM 1G (นอกจากนี้ยังมีคอนเทนเนอร์อื่น ๆ ที่ทำงานในโฮสต์เดียวกัน) แอปพลิเคชันในคอนเทนเนอร์ Docker นี้จะถอดรหัสภาพบางส่วนซึ่งอาจใช้หน่วยความจำมาก

ในบางครั้งคอนเทนเนอร์นี้จะออก สงสัยเป็นเพราะหน่วยความจำไม่เพียงพอ แต่ไม่ค่อยแน่ใจ ฉันต้องการวิธีค้นหาสาเหตุที่แท้จริง มีวิธีใดบ้างที่จะรู้ว่าเกิดอะไรขึ้นกับการตายของตู้คอนเทนเนอร์นี้?


6
docker logs <container-id>คุณสามารถตรวจสอบบันทึกสำหรับภาชนะที่ผ่าน
techtabu

2
แต่คอนเทนเนอร์ออกไปแล้วฉันเดาว่าฉันไม่สามารถบันทึกได้อีกต่อไป?
Li Bin

เพิ่งลองบนเครื่องของฉัน คุณยังสามารถเข้าถึงบันทึกได้แม้ว่าคอนเทนเนอร์จะออกไปแล้วก็ตาม
Samuel Toh

อย่างน้อยคุณได้ลองหรือไม่?
techtabu

techtabu ใช่ฉันทำ มันก็ไม่ช่วยอยู่ดี
Li Bin

คำตอบ:


129

คนอื่น ๆ ได้กล่าวถึงdocker logs $container_idเพื่อดูผลลัพธ์ของแอปพลิเคชัน นี่เป็นสิ่งแรกที่ฉันจะตรวจสอบเสมอ

ถัดไปคุณสามารถเรียกใช้docker inspect $container_idเพื่อดูรายละเอียดเกี่ยวกับสถานะเช่น:

    "State": {
        "Status": "exited",
        "Running": false,
        "Paused": false,
        "Restarting": false,
        "OOMKilled": false,
        "Dead": false,
        "Pid": 0,
        "ExitCode": 2,
        "Error": "",
        "StartedAt": "2016-06-28T21:26:53.477229071Z",
        "FinishedAt": "2016-06-28T21:26:53.478066987Z"
    },

บรรทัดสำคัญคือ "OOMKilled" ซึ่งจะเป็นจริงหากคุณใช้หน่วยความจำเกินขีด จำกัด และ Docker ฆ่าแอปของคุณ คุณอาจต้องการค้นหารหัสทางออกเพื่อดูว่าแอปของคุณระบุสาเหตุการออกหรือไม่

หมายเหตุสิ่งนี้จะระบุว่านักเทียบท่าฆ่ากระบวนการของคุณหรือไม่และกำหนดให้คุณกำหนดขีด จำกัด หน่วยความจำบนคอนเทนเนอร์ของคุณ นอกเหนือจากนักเทียบท่าแล้วเคอร์เนลลินุกซ์อาจทำให้กระบวนการของคุณแย่ลงหากโฮสต์ของตัวเองมีหน่วยความจำไม่เพียงพอ Linux มักจะเขียนล็อกอิน / var / log เมื่อสิ่งนี้เกิดขึ้น ด้วย Docker Desktop บน Windows และ Mac คุณสามารถปรับหน่วยความจำที่จัดสรรให้กับ Linux VM ในตัวได้ในการตั้งค่านักเทียบท่า


9
ฉันไม่เข้าใจว่านี่เป็นเพราะคอนเทนเนอร์ของฉันหายไปการ "ตรวจสอบ" จะทำงานอย่างไร จากการสนทนาข้างต้นเมื่อแอปตายคอนเทนเนอร์ก็จะตายเช่นกัน คุณหมายถึงรีสตาร์ทภาพเดียวกันจากนั้นตรวจสอบ?
Li Bin

11
@LiBin คอนเทนเนอร์จะไม่ถูกเช็ดออกเมื่อมันตายเพียงแค่เข้าสู่สถานะหยุดเช่นสถานะ = หยุดหรือออก 'นักเทียบท่า ps -a' และดูด้วยตัวคุณเอง
Samuel Toh

ฉันได้รับ exit 0 ทุกครั้งที่เรียกใช้การดำเนินการที่ใช้หน่วยความจำมากและ OOMKilled เป็นเท็จ การเพิ่มหน่วยความจำทำให้มันทำงานได้อีกครั้ง
Andrei

1
สิ่งนี้สามารถเกิดขึ้นได้หากเคอร์เนล Linux แทนที่จะเป็น Docker Engine ฆ่ากระบวนการในคอนเทนเนอร์ คุณมักจะเห็นว่าใน OS บันทึกภายใต้ / var / log บนโฮสต์
BMitch

6

คุณสามารถตรวจสอบว่ากระบวนการภายในคอนเทนเนอร์นั้น OOMkilled หรือไม่โดยการอ่านบันทึก OOMkills เริ่มต้นโดยเคอร์เนลดังนั้นทุกครั้งที่เกิดขึ้นจะมีบรรทัดมากมายใน/var/log/kern.logตัวอย่างเช่น:

python invoked oom-killer: gfp_mask=0x14000c0(GFP_KERNEL), nodemask=(null), order=0, oom_score_adj=995
oom_kill_process+0x22e/0x450
Memory cgroup out of memory: Kill process 31204 (python) score 1994 or sacrifice child
Killed process 31204 (python) total-vm:7350860kB, anon-rss:4182920kB, file-rss:2356kB, shmem-rss:0kB

คำตอบนี้ช่วยให้ฉันพบว่ามีอะไรผิดปกติกับคอนเทนเนอร์ที่นักเทียบท่าจะรีสตาร์ทเมื่อออก (การตรวจสอบนักเทียบท่าไม่ได้ช่วยอะไรมากที่นี่)
m90

2

แม้ว่าคำตอบที่ยอมรับจะเป็นตัวเลือกที่ดีที่สุด แต่บางครั้งการตรวจสอบเนื้อหาของวารสารจากโฮสต์ก็มีประโยชน์เช่นกัน (บน linux)

คุณสามารถทำได้โดยพิมพ์:

sudo journalctl -u docker

หรือหางมัน

sudo journalctl -u docker -f

หรือไพพ์เอาต์พุตให้น้อยลงหากยาวเกินไปสำหรับเทอร์มินัลบัฟเฟอร์ของคุณ

sudo journalctl -xn -u docker | less
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.