วิธีตรวจสอบว่า Docker Engine และ Docker Container กำลังทำงานอยู่หรือไม่?


109

ในสคริปต์ฉันต้องตรวจสอบ:

ก) เครื่องยนต์นักเทียบท่าทำงานอยู่หรือไม่?
b) ระบุชื่อคอนเทนเนอร์ว่า Docker container กำลังทำงานอยู่หรือไม่?

[ข้อความเริ่มต้นของคำถามนี้ไม่ชัดเจนโดยบางคนตีความว่าเป็น "check docker engine" และอื่น ๆ ว่า "check docker container"]


5
คำสั่งนักเทียบท่า (ยกเว้นนักเทียบท่า -v) เช่นนักเทียบท่า ps
Glen Pierce

docker attach containerName
Mattia Dinosaur

2
หรือลอง docker ps
Mattia Dinosaur

2
sudo systemctl status docker
Duk

1
docker ps----- คำสั่งนี้จะแสดงเฉพาะคอนเทนเนอร์ RUNNING
Suhaib

คำตอบ:


116

หากคุณกำลังมองหาคอนเทนเนอร์เฉพาะคุณสามารถเรียกใช้:

if [ "$( docker container inspect -f '{{.State.Running}}' $container_name )" == "true" ]; then ...

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

if [ "$( docker container inspect -f '{{.State.Status}}' $container_name )" == "running" ]; then ...

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

systemctl show --property ActiveState docker

คุณยังสามารถเชื่อมต่อกับนักเทียบท่าด้วยdocker infoหรือdocker versionและพวกเขาจะผิดพลาดหากภูตไม่พร้อมใช้งาน


วิธีที่คุณจะใส่docker inspect …ภายในifงบสคริปต์ทุบตีหรือไม่?
François Romain

15
if [ $(docker inspect -f '{{.State.Running}}' $container_name) = "true" ]; then echo yup; else echo nope; fi
BMitch

2
ฉันใช้docker inspect -f '{{.State.Restarting}}' $container_nameตั้งแต่ฉันเริ่มคอนเทนเนอร์ของฉันด้วยนโยบายการรีสตาร์ทแม้ว่าที่นี่ "จริง" คือสิ่งที่คุณต้องการหลีกเลี่ยง
stav meir

4
ทั้งทุบตีและนักเทียบท่าจะบ่นสำหรับข้อความข้างต้นifเมื่อคอนเทนเนอร์ไม่ทำงาน สิ่งนี้ซ่อนการพ่นที่ไม่ต้องการสำหรับกรณีเท็จ: if [ "$(docker inspect -f '{{.State.Running}}' ${container_name} 2>/dev/null)" = "true" ]; then echo yup; else echo nope; fi
Trevor

1
@MarcoLackovic ดูเหมือนว่าคุณพลาดส่วน "คุณติดตั้ง systemd แล้ว" ด้านบน
BMitch

53

ฉันใช้

docker info

เพื่อตรวจสอบด้วยสคริปต์ทุบตีหากนักเทียบท่ากำลังทำงานอยู่


6
คำตอบนี้มีการประเมินต่ำ มันข้ามแพลตฟอร์มและผ่าน / ล้มเหลวอย่างรวดเร็ว
Andy Fleming

2
docker info > /dev/null 2>&1หากคุณไม่ต้องการผลลัพธ์
buggymcbugfix

24

คุณสามารถตรวจสอบสถานะนักเทียบท่าได้โดยใช้: systemctl is-active docker

➜  ~  systemctl is-active docker
active

คุณสามารถใช้เป็น:

➜  ~  if [ "$(systemctl is-active docker)" = "active" ]; then echo "is alive :)" ; fi
is alive :)

➜  ~  sudo systemctl stop docker

➜  ~  if [ "$(systemctl is-active docker)" = "active" ]; then echo "is alive :)" ; fi
 * empty response *

สิ่งนี้ไม่ตอบคำถาม "เพื่อตรวจสอบชื่อคอนเทนเนอร์"
jens.klose

ใช่ดูเหมือนว่าคำถามจะคลุมเครือเพื่อตรวจสอบว่าคอนเทนเนอร์กำลังทำงานอยู่หรือไม่ที่คุณควรใช้docker ps --filter name=patternคุณสามารถจัดรูปแบบผลลัพธ์เพื่อตรวจสอบสถานะที่เพิ่มแฟ--format {{.Status}}
Hernan Garcia

18

แสดงรายการคอนเทนเนอร์ทั้งหมด:

docker container ls -a

ls= list
-a= ทั้งหมด

ตรวจสอบคอลัมน์ "สถานะ"


1
นั่นคือสิ่งที่ฉันต้องการเพราะมันใช้ได้กับทุกแพลตฟอร์ม !!
Rolljee

ง่ายและสะดวก ...
RMati

16

สำหรับผู้ใช้ OS X (Mojave 10.14.3)

นี่คือสิ่งที่ฉันใช้ในสคริปต์ Bash ของฉันเพื่อทดสอบว่า Docker กำลังทำงานอยู่หรือไม่

# Check if docker is running
if ! docker info >/dev/null 2>&1; then
    echo "Docker does not seem to be running, run it first and retry"
    exit 1
fi

1
ฉันปรับโครงสร้างใหม่เพื่อลบif [[ $? -ne 0 ]]แอนตี้แพตเทิร์น
tripleee

13

คำสั่ง docker ใด ๆ (ยกเว้นdocker -v) เช่นdocker ps หาก Docker กำลังทำงานอยู่คุณจะได้รับคำตอบที่ถูกต้องมิฉะนั้นคุณจะได้รับข้อความที่มีข้อความว่า "Docker daemon ของคุณพร้อมใช้งานหรือไม่"

คุณยังสามารถตรวจสอบตัวจัดการงานของคุณ


10

บางครั้งคุณไม่ทราบชื่อคอนเทนเนอร์แบบเต็มในกรณีนี้นี่คือสิ่งที่เหมาะกับฉัน:

if docker ps | grep -q keyword
then 
    echo "Running!"
else
    echo "Not running!"
    exit 1
fi

เราแสดงรายการกระบวนการคอนเทนเนอร์ที่กำลังทำงานอยู่ทั้งหมด ( docker ps -aจะแสดงว่าเราไม่ได้รันกระบวนการ แต่นั่นไม่ใช่สิ่งที่ฉันต้องการ) เราค้นหาคำเฉพาะ ( grepบางส่วน) และล้มเหลวหากเราไม่พบคอนเทนเนอร์ที่กำลังทำงานอยู่อย่างน้อยหนึ่งรายการซึ่งมีชื่อของเราอยู่ คำสำคัญ.



5

คุณสามารถตรวจสอบด้วยคำสั่งนี้systemctl status dockerมันจะแสดงสถานะของนักเทียบท่า หากคุณต้องการที่จะเริ่มต้นคุณสามารถใช้systemctl start dockerแทนsystemctlคุณสามารถลองยังมีservice, service docker statusและservice docker startตามลำดับ


5
คำตอบนี้ถือว่าผู้ใช้ปลายทางใช้systemdเป็น init
Rafael

systemctl status dockerแสดงอย่างถูกต้องคือบริการ Docker กำลังทำงานอยู่ ขอขอบคุณ.
imsrgadich

4

คุณยังสามารถตรวจสอบว่าคอนเทนเนอร์นักเทียบท่าเฉพาะกำลังทำงานอยู่หรือไม่โดยใช้คำสั่งต่อไปนี้

docker inspect postgres | grep "Running"

คำสั่งนี้จะตรวจสอบว่าตัวอย่างเช่น postgres container ของฉันกำลังทำงานอยู่หรือไม่และจะส่งคืนผลลัพธ์เป็น"Running": true

หวังว่านี่จะช่วยได้


นี่คือสิ่งที่ฉันกำลังมองหา และได้ผล (เป็นเรื่องดีเมื่อคนที่ลงคะแนนบางอย่างพูดว่าทำไมดังนั้น noobs สามารถเรียนรู้มารยาท SO ได้ดีขึ้น :))
allenjom

ฉันไม่ได้ลงคะแนน แต่ "ข้อผิดพลาด: ไม่มีวัตถุดังกล่าว: postgres"
ged

3

วิ่ง:

docker version

หากนักเทียบท่าทำงานอยู่คุณจะเห็น:

Client: Docker Engine - Community
 Version:           ...
 [omitted]

Server: Docker Engine - Community
 Engine:
  Version:          ...
 [omitted]

หากนักเทียบท่าไม่ทำงานคุณจะเห็น:

Client: Docker Engine - Community
 Version:           ...
 [omitted]

Error response from daemon: Bad response from Docker engine

2

หากเป้าหมายพื้นฐานคือ "ฉันจะเริ่มคอนเทนเนอร์ได้อย่างไรเมื่อ Docker เริ่มทำงาน"

เราสามารถใช้นโยบายการรีสตาร์ทของ Docker

ในการเพิ่มนโยบายการรีสตาร์ทไปยังคอนเทนเนอร์ที่มีอยู่:

Docker: เพิ่มนโยบายการรีสตาร์ทไปยังคอนเทนเนอร์ที่สร้างขึ้นแล้ว

ตัวอย่าง:

docker update --restart=always <container>

2

docker ps -a

คุณสามารถดูคอนเทนเนอร์นักเทียบท่าทั้งหมดไม่ว่าจะมีชีวิตหรือตาย


2

รันคำสั่งนี้ในเทอร์มินัล:

docker ps

หากนักเทียบท่าไม่ทำงานคุณจะได้รับข้อความนี้:

การตอบสนองข้อผิดพลาดจาก daemon: กด unix docker.raw.sock: connect: การเชื่อมต่อถูกปฏิเสธ



0

ฉันจะเช็คอิน SSH ได้อย่างไร Run:

systemctl

หากตอบสนอง: ไม่สามารถรับการเชื่อมต่อ D-Bus: ไม่อนุญาตให้ดำเนินการ

มันเป็นคอนเทนเนอร์ Docker หรือ WSL


0

สำหรับคำตอบสำหรับคำถามแรกของคุณโปรดดูคำตอบนี้ - https://stackoverflow.com/a/65447848/4691279

สำหรับคำถามที่สองของคุณ - คุณสามารถใช้คำสั่ง like docker ps --filter "name=<<<YOUR_CONTAINER_NAME>>>"เพื่อตรวจสอบว่าคอนเทนเนอร์ใดกำลังทำงานอยู่หรือไม่

  • หาก Docker และ Container กำลังทำงานอยู่คุณจะได้รับผลลัพธ์ดังนี้:

    $ docker ps --filter "name=nostalgic_stallman"
    
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES       
    9b6247364a03        busybox             "top"               2 minutes ago       Up 2 minutes                            nostalgic_stallman
    
  • หาก Docker ไม่ทำงานคุณจะได้รับข้อความแสดงข้อผิดพลาดว่า Docker daemon ไม่ทำงาน

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

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