วัตถุประสงค์ของ VOLUME ใน Dockerfile คืออะไร


110

ฉันพยายามทำความเข้าใจเกี่ยวกับระดับเสียงของ Docker ให้ลึกซึ้งยิ่งขึ้นและฉันมีช่วงเวลาที่ยากลำบากในการทำความเข้าใจความแตกต่าง / กรณีการใช้งานของ:

  • docker volume createคำสั่ง
  • docker run -v /path:/host_path
  • VOLUMEรายการในDockerfileแฟ้ม

ฉันไม่เข้าใจโดยเฉพาะอย่างยิ่งว่าจะเกิดอะไรขึ้นถ้าคุณรวมVOLUMEรายการเข้ากับ-vธง


1
ที่เกี่ยวข้อง: stackoverflow.com/a/46992367/3160529
Shubham

คำตอบ:


71

ไดรฟ์ข้อมูลคือข้อมูลถาวรที่เก็บไว้ในรูปแบบ /var/lib/docker/volumes/...

  • คุณสามารถประกาศใน Dockerfile ได้ซึ่งหมายความว่าทุกครั้งที่คอนเทนเนอร์เริ่มต้นจากรูปภาพไดรฟ์ข้อมูลจะถูกสร้างขึ้น ( ว่างเปล่า ) แม้ว่าคุณจะไม่มี-vตัวเลือกใด ๆ ก็ตาม

  • คุณสามารถประกาศบนรันไทม์docker run -v [host-dir:]container-dirได้
    การรวมสอง ( VOLUME+ docker run -v) หมายความว่าคุณสามารถติดตั้งเนื้อหาของโฟลเดอร์โฮสต์ลงในไดรฟ์ข้อมูลของคุณที่คอนเทนเนอร์ใน/var/lib/docker/volumes/...

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

หากคุณยังคงมีเนื้อหาบางส่วนในโวลุ่ม แต่หลังจากนั้นก็ลบคอนเทนเนอร์ (ซึ่งโดยค่าเริ่มต้นจะไม่ลบโวลุ่มที่เกี่ยวข้องเว้นแต่คุณจะใช้ docker rm -v) คุณสามารถแนบไดรฟ์ข้อมูลดังกล่าวไปยังคอนเทนเนอร์ใหม่ได้อีกครั้ง (การประกาศ ระดับเสียงเดียวกัน)

โปรดดูที่ " Docker - วิธีเข้าถึงโวลุ่มที่ไม่ได้เชื่อมต่อกับคอนเทนเนอร์ "
ด้วยการสร้างวอลุ่มนักเทียบท่าทำให้ง่ายต่อการแนบไดรฟ์ข้อมูลที่มีชื่อไปยังคอนเทนเนอร์อีกครั้ง

docker volume create --name aname
docker run -v aname:/apath --name acontainer
...
# modify data in /apath
...
docker rm acontainer

# let's mount aname volume again
docker run -v aname:/apath --name acontainer
ls /apath
# you find your data back!

2
สมมติว่าคุณใช้DockerfileกับVOLUMEและ-v /path:/host_path/แฟล็ก เนื้อหาของVOLUMEจะถูกแทนที่ด้วยเนื้อหาของ/host_path/?
radium226

ขอบคุณคุณ @VonC ฉันคิดว่าฉันเข้าใจแล้ว :) และถ้าคุณทำdocker volume create --name my_volumeตามด้วย a docker run --volume-from my_volumeคุณจะรู้ได้อย่างไรว่าจุดเชื่อมต่อจะอยู่ที่ไหน?
radium226

@ radium226 ไม่มีจุดต่อเชื่อม (หมายถึงไม่มีอะไรติดตั้งจากโฮสต์ข้างที่ว่างดั้งเดิม / var / lib / docker / volume) เส้นทางของโวลุ่มอยู่ใน my_volume metadata: stackoverflow.com/a/31997267/6309
VonC

ฉันเข้าใจว่าฝั่งโฮสต์ไม่มีจุดเชื่อมต่อ แต่ภายในคอนเทนเนอร์ที่กำลังทำงานอยู่docker run ...นั้นถูกฝังด้วยฉันจะเขียนลงในไฟล์ที่เก็บไว้ในmy_volumeโวลุ่มได้อย่างไร ฉันไม่รู้ ... เส้นทาง? ของปริมาตรภายในคอนเทนเนอร์ที่กำลังทำงานของฉันเพราะฉันไม่ได้กำหนดอะไรเลย? ฉันหวังว่าฉันจะชัดเจนพอเพราะฉันไม่แน่ใจในเสียงร้องของฉัน: - /
radium226

1
@ radium226 the docker volume create --name anameสร้างไดรฟ์ข้อมูลที่ตั้งชื่อ : คุณกำหนดพา ธคอนเทนเนอร์บนรันไทม์:: docker run -v aname:/apathตอนนี้คอนเทนเนอร์นั้นมีไดรฟ์ข้อมูลที่เชื่อมต่อกับมันติดตั้งกับโฟลเดอร์ / apath ฉันได้เขียนคำตอบใหม่เพื่อให้ชัดเจน
VonC

11

VOLUMEคำสั่งน่าสนใจเมื่อคุณรวมเข้ากับvolumes-fromพารามิเตอร์รันไทม์

รับ Dockerfile ต่อไปนี้:

FROM busybox
VOLUME /myvolume

สร้างภาพด้วย:

docker build -t my-bb .

และหมุนภาชนะด้วย:

docker run --rm -it --name my-first-bb my-bb

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

สร้างไฟล์ว่างในโฟลเดอร์นี้ดังนั้นให้เรียกใช้สิ่งต่อไปนี้ในคอนเทนเนอร์:

cd myvolume
touch hello.txt

ตอนนี้หมุนคอนเทนเนอร์ใหม่ แต่ใช้ปริมาณเดียวกันกับmy-first-bb:

docker run --rm -it --volumes-from my-first-bb --name my-second-bb my-bb

คุณจะเห็นว่าmy-second-bbมีไฟล์hello.txtอยู่ในmyvolumeโฟลเดอร์

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


ไดรฟ์ข้อมูลจะถูกลบเนื่องจากเป็นไดรฟ์ข้อมูลที่ไม่ระบุชื่อและคุณเริ่มต้นคอนเทนเนอร์ด้วย--rmตัวเลือก ฉันคิดว่ามันอาจใช้งานได้เมื่อกล่าวถึงมัน หากคุณไม่ได้เริ่มต้นภาชนะที่มี--rmคุณยังสามารถลบภาชนะและปริมาณที่ไม่ระบุชื่อdocker rm -v my-containerกับ
AymDev
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.