รู้จักกับ Volume บน Docker กัน

แก้ปัญหาเวลาลบ Container แล้ว Log หาย ไฟล์หายด้วย Volume มารู้จักกับ Volume พร้อมวิธีการทำกัน
Feature Image

สวัสดีครับ วันนี้เราจะมารู้จักกับ Volume บน Docker กัน จะเป็นยังไงนั้น เรามาดูกันเลย

สำหรับใครที่ยังไม่รู้จักว่า Docker คืออะไร สามารถดูรายละเอียดได้ตามด้านล่างนี้

Volume คืออะไร Volume ก็คือพื้นที่ที่ใช้ยึดติด (Mount) ระหว่างภายนอก Container กับภายใน Container โดยภายนอก Container ในที่นี้ก็คือเครื่องที่ลง Docker นั่นเอง ส่วนภายใน Container ก็คือตัว Container เองนั่นแหละ

การใช้ Volume นั้น สามารถใช้งานได้ 2 แบบด้วยกัน

  • -v เป็นการระบุแบบใช้ : (Colon) เป็นตัวคั่นระหว่างภายนอก Container และภายใน Container แต่ถ้ามี : อีกอันหนึ่งจะเป็นเรื่องของ Permission ใน Container ที่ทำการ Mount Volume ว่าจะเป็นแบบ ro (Read Only) หรือ rw (Read Write)
  • –mount เป็นการระบุแบบใช้ <key>=<value> แล้วคั่นด้วย , แบบนี้จะมีความยากกว่าแบบแรก แต่จะสามารถกำหนดค่าได้เยอะกว่า

ทั้งสองแบบสามารถดูรายละเอียดได้ที่นี่

เอาล่ะเกริ่นไปพอสมควรแล้ว เรามาเริ่มใช้งาน Volume กันเลย

ก่อนอื่นเลยเราเปิด Command Line หรือ Terminal ขึ้นมา แล้วพิมพ์คำสั่ง

docker volume create my-volume

คำสั่งด้านบนเป็นคำสั่งใช้สำหรับสร้าง Volume ใช้ชื่อว่า my-volume

เราจะดูว่า volume บนเครื่องเรามีอะไรบ้าง สามารถใช้คำสั่ง

docker volume ls

จะแสดงผลดังรูปเลย

Command Line docker volume ls

เราสามารถดูรายละเอียดของ Volume ได้โดยใช้คำสั่ง

docker volume inspect my-volume

จะแสดงผลดังรูป

Command Line docker volume inspect my-volume

ในส่วนของ Mountpoint ถ้าเป็นของ Windows หรือ Mac จะมองไม่เห็น เพราะเป็นการจำลอง Environment ขึ้นมา แต่ถ้าบน Linux จะเห็น สามารถดูรายละเอียดเพิ่มเติมได้ที่นี่

ขั้นตอนการลบสามารถใช้คำสั่ง

docker volume rm my-volume

เราสามารถสร้าง Volume จากหน้า Docker Desktop ก็ได้นะ

เปิด Docker Desktop ไปที่หน้า Volume

Docker Desktop Volume

คลิกที่ New volume แล้วตั้งชื่อ Volume

Docker Desktop New Volume

จะได้ Volume เราสามารคลิกเข้าไปดูข้างใน Volume ได้

Docker Desktop my-volume in use

Docker Desktop จะไม่สามารถดูรายละเอียดของ Volume ได้ ต้องดูผ่าน Command Line เท่านั้น

เวลาลบ Volume ก็ไปคลิกปุ่มด้านขวาของ Volume ที่เป็นจุดสามจุด (ต้องเอาเมาส์ชี้ที่ Volume ก่อนนะปุ่มถึงขึ้น) จากนั้นเลือก Remove

Docker Desktop Volume Remove

จะมีหน้า Confirm ก็เลือก Remove ไปเลย

Docker Desktop Confirm Remove volume

เอาล่ะต่อไปเราจะทำการ Mount Volume กับ Container ทั้ง 2 แบบกัน คือแบบ -v กับ –mount จะเป็นอย่างไรนั้นไปดูกันเลย

ก่อนอื่นเราสร้าง Volume ก่อนนะ ขอใช้ชื่อเดิมเลย my-volume

docker volume create my-volume

เอาล่ะ ต่อไปเรามาใช้ทีละแบบกัน โดยทั้ง 2 แบบนี้จะใช้แบบ docker ธรรมดานะ

แบบ -v เริ่มต้นใช้คำสั่ง

docker run --name nginx-volume -v my-volume:/var/log/nginx -d nginx:latest

จากคำสั่งด้านบนเป็นการสร้าง Container ชื่อ nginx-volume ทำการ Mount Volume จาก my-volume ที่เราสร้างเมื่อกี้ไปยัง /var/log/nginx ภายใน Container ซึ่งเป็นที่เก็บ logs นั่นเอง ส่วน -d เป็นการรันในโหมด Background และ nginx:latest เป็น Image ที่เราใช้

เราสามารถเขียนสวย ๆ อ่านง่าย ๆ ได้ด้วยการใช้ Backslash (\) จะได้

docker run --name nginx-volume \
 -v my-volume:/var/log/nginx \
 -d \
 nginx:latest

แบบ –mount อย่าลืมลบ Container ออกก่อนนะ ไม่งั้น Volume กับชื่อ Container จะชนกัน

docker run --name nginx-volume --mount source=my-volume,target=/var/log/nginx -d nginx:latest

จากคำสั่งด้านบนเป็นการสร้าง Container เหมือนเมื่อกี้เลย แต่คำสั่ง volume เปลี่ยนไป โดยที่ source จะเป็นภายนอก Container หรือก็คือเครื่องเราเอง ส่วน target เป็นเครื่องปลายทาง ก็คือใน Container สามารถเขียนสวย ๆ ได้เหมือนกัน

docker run --name nginx-volume \
 --mount source=my-volume,target=/var/log/nginx \
 -d \
 nginx:latest

ทีนี้เรามาดูบน Docker Desktop บ้าง ไปที่แท็บ Volume แล้วเลือก my-volume กันเลย

คลิกเข้าไปจะเห็นว่าตอนนี้ Volume ตัวนี้กำลังเชื่อมต่อกับ Container nginx-volume อยู่

Docker Desktop my-volume in use

ไปที่แท็บ Data จะเห็นไฟล์ที่เรา Mount ไว้

Docker Desktop my-volume data

เอาล่ะเราหัดทำไปคร่าว ๆ แล้ว วันนี้เราจะมาสอนการ Mount Volume ในรูปแบบต่าง ๆ จะไว้ใช้สำหรับกรณีต่าง ๆ กันไป โดยวันนี้จะยกมาทั้งหมด 2 วิธีด้วยกันที่คิดว่าน่าจะมีประโยชน์และเจอบ่อย ๆ จะมีวิธีไหนบ้างเราไปดูกัน

  • วิธี Mount Volume จากภายนอกใส่เข้าไปข้างใน Container
  • วิธีเอาข้อมูลภายในมาไว้ที่ภายนอก Container

วิธี Mount Volume จากภายนอกใส่เข้าไปข้างใน Container

วิธีนี้เป็นการเอาไฟล์หรือโฟลเดอร์ที่อยู่ข้างนอกใส่เข้าไปใน Container ตาม Path ที่เรากำหนด เราจะเห็นวิธีนี้ได้จากการ Config ไฟล์จากภายนอก และเอาสิ่งที่เรา Config ไว้ ใส่เข้าไปใน Container เช่น

  • Nginx จะเป็นการเขียน Config บนไฟล์ .conf เพื่อบอกว่าเว็บเราวิ่งไป Port ไหน URL อะไร ทำอะไรได้บ้าง แล้วโยน .conf ที่ตั้งค่าเมื่อกี้โยนไปข้างใน Container แล้วเวลารัน Container ขึ้นมา Config ที่เราตั้งค่าไว้เมื่อกี้ก็จะรันไปด้วย
  • Redis จะเป็นการ Config เช่นเดียวกัน ต้องเอาไฟล์ Redis.conf โยนเข้าไปข้างใน

จากตัวอย่างข้างต้น เราจะเห็นเป็นพวก Config File ทั้งนั้น เพราะการแก้ไข Container เป็นเรื่องที่ยุ่งยากและซ้ำซ้อน ยุ่งยากในทีนี้คือ ถ้าเราสร้าง Container ใหม่แล้วไม่ได้กำหนด Volume ให้มัน เวลาจะ Config อะไรก็ไปแก้ที่ Container แล้วถ้าเกิด Container มีหลายลูก ก็ต้องนั่ง Config ทีละ Container แล้วเกิดว่า Container ไหน เรา Config ผิดอีก เป็นเรื่องเลย นั่งไล่กัน เพราะฉะนั้นการใช้ Volume จึงมีประโยชน์มาก จะทำยังไงนั้น เราไปดูกัน

ตัวอย่างของทั้ง 2 วิธีจะขอใช้เป็น Nginx เพราะสามารถเห็นการเปลี่ยนแปลงได้ และ Nginx สามารถเห็นการ Mount Volume ได้ทั้ง 2 วิธีเลย จะเป็นยังไงนั้น ไปดูวิธีการ Mount แบบแรกกันเลย

เราจะใช้ Docker Compose เพื่อจะได้เห็นภาพรวมของ Container นั้นได้ง่าย

ก่อนอื่นเราก็สร้าง docker-compose.yml แล้วเพิ่ม Code ตามด้านล่างเลย

version: "3.8"

services:
  web:
    container_name: nginx-volume
    image: nginx:latest
    ports:
      - '8080:80'
      - '8081:81'
    restart: always
    volumes:
      - './servers/test.conf:/etc/nginx/conf.d/test.conf'
      - './web/test.html:/usr/share/nginx/html/test.html'

ต่อมาเราสร้างโฟลเดอร์ชื่อ servers กับ web เลย แล้วสร้างไฟล์ โดยที่ไฟล์ test.conf จะอยู่ในโฟลเดอร์ servers และ test.html จะอยู่ในโฟลเดอร์ web ดังรูปเลย

Visual studio code path nginx-volume

ไฟล์ test.conf ใส่ Config ตามด้านล่างเลย

server {
    listen       81;
    server_name  localhost;

    access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  test.html;
    }
}

อธิบายเพิ่มเติม

  • server เป็นการประกาศว่าเราจะทำ Web Server
  • listen เป็นการใช้งาน Port ในที่นี้เลือกเป็น 81
  • server_name เป็นชื่อ Server หรือก็คือ Domain หรือ URL ที่เราต้องการ ในที่นี้ตั้งเป็น localhost หรือก็คือเครื่องเรา (ตั้งเป็น www.google.com แต่เราต้องไปตั้งค่า hosts ในเครื่องเราด้วย)
  • access_log เป็นการบันทึก log ของคนเข้าใช้งานเว็บเรา โดยถ้ามีคนเข้าใช้งาน localhost:81 จะทำการบันทึกลงในไฟล์ host.access.log
  • location เป็นการบอกเส้นทางหรือ Route ไปที่ไหน
  • root คือ โฟลเดอร์ที่เก็บไฟล์เว็บเราไว้
  • index คือ ชื่อไฟล์เว็บเรา (ถ้าในโฟล์เดอร์มีหลายเว็บ เช่น index.html test.html เราก็เพิ่มได้ โดย Nginx จะคิดตามลำดับความสำคัญ ถ้า index.html ขึ้นก่อน มันจะรันก่อน ถ้าเกิดหาไฟล์ index.html ไม่พบ มันก็จะไปเลือก test.html มารันต่อเลย

อันนี้เป็นการตั้งค่าพื้นฐานบน Nginx เท่านั้น

เอาล่ะ ต่อไปเรามาตั้งค่าไฟล์ test.html กันต่อเลย

<!DOCTYPE html>
<html> 
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Tichaky Diary</title> 
</head>

<body> 
    <h1>ดีจ้า</h1> 
</body>
</html>

ส่วนนี้เป็นไฟล์ HTML แบบง่าย ๆ จะอธิบายเฉพาะส่วนสำคัญนะ ไม่งั้นจะยาว

  • meta charset=”utf-8″ จะเป็นเรื่องของตัวอักษร ถ้าไม่ประกาศจะแสดงผลเป็นภาษาไทยไม่ได้
  • meta viewport จะเป็นเรื่องของขนาดหน้าจอเวลาเปิด Browser ใช้เป็นแบบนี้เลย
  • <title> เป็นชื่อ Tab เว็บเราด้านบนเวลาเข้า Browser ชื่ออะไรก็ได้ ในทีนี้ตั้งเป็น Tichaky Diary
  • <h1> เป็นหัวเรื่อง (Headings) แบบที่ 1 มีข้อความว่า ดีจ้า

พอตั้งค่าทั้งหมดเสร็จเรียบร้อยแล้ว มาเริ่มรันกันเลย โดยใช้คำสั่ง

docker compose -f docker-compose.yml up -d

จากนั้นไปดูบน Docker Desktop กัน

Docker Desktop Container

เปิด localhost:8080 จะได้

Open Browser localhost:8080

เปิด localhost:8081 จะได้

Open Browser localhost:8081

จะเห็นว่าแบบนี้สะดวกมากเลย โยนไฟล์ Config เข้าไปใน Container ก็ใช้งานได้เลย แต่มันก็มีข้อควรระวังนะ ไปดูกัน

เราจะเปลี่ยน Volume ใหม่กัน ให้ลบ Container ออกก่อนนะ แล้วเปลี่ยน docker-compose.yml ตามด้านล่างเลย

version: "3.8"

services:
  web:
    container_name: nginx-volume
    image: nginx:latest
    ports:
      - '8080:80'
      - '8081:81'
    restart: always
    volumes:
      - './servers/test.conf:/etc/nginx/conf.d/test.conf'
      - './web:/usr/share/nginx/html'

จากด้านบน ผู้เขียนเปลี่ยนแค่บรรทัดเดียวคือ จาก ‘./web/test.html:/usr/share/nginx/html/test.html’ เป็น ‘./web:/usr/share/nginx/html’

จากนั้นรันเหมือนเดิมเลย

docker compose -f docker-compose.yml up -d

ไปดู Docker Desktop กัน

Docker Desktop Container

เปิด Browser ไปที่ localhost:8080 (Refresh รัว ๆ นะ บางทีมัน Cache ไว้)

Open Browser localhost:8080

เปิดไปที่ localhost:8081

Open Browser localhost:8081

จะเห็นว่า 8080 เปิดแล้วขึ้น 403 ส่วน 8081 ได้ปกติ ทำไมเป็นแบบนี้ล่ะ เราไปดูผลของการกระทำของเรากัน

เราจะ Remote เข้าไปดูใน Container แบบง่าย ๆ กัน

ขั้นแรกก็พิมพ์ Command

docker ps

ให้ Copy Container ID ไว้ แล้วไปคำสั่งต่อไปเลย

docker exec -it fd7b5f054f52 /bin/bash

อธิบายเพิ่มเติม

  • docker exec เป็นการใช้ Command Line บน Docker
  • -it เป็น Argument หรือ Option สำหรับ Remote เข้าไปใน Container เราจะไม่เห็น -i เดี่ยว ๆ หรือ -t เดี่ยว ๆ แต่อาจจะเห็น -it หรือไม่ก็ -i -t แบบนี้ ใช้งานได้เหมือนกัน สามารถดูรายละเอียดเพิ่มเติมได้ที่นี่
  • fd7b5f054f52 เป็น Container ID ที่ Copy มา
  • /bin/bash เป็นการเรียกใช้ shell หรือ Command Line บน Container ถ้าเป็น Container ทั่วไปใช้ได้ 2 แบบคือ /bin/bash กับ /bin/sh แล้วแต่คนชอบเลย ส่วนตัวชอบ /bin/bash เพราะเวลาเราพิมพ์คำสั่งหรือชื่อไม่ครบ เราก็ Tab มันจะโชว์หรือแสดงผลออกมาเลย สามารถดูรายละเอียดของทั้ง 2 แบบได้ที่นี่

ถ้าเราทำบน Docker Desktop ก็คลิกตามรูปเลย

Docker Desktop Command Line (CLI)

ไปที่โฟลเดอร์ /usr/share/nginx/html ที่เรา Volume Container ไว้ โดยใช้คำสั่ง

cd /usr/share/nginx/html

การ cd คือการเข้าไปใน directory ที่กำหนด

เราสามารถดูว่าตอนนี้เราอยู่ path ไหนได้จากคำสั่ง (ถ้าเกิดเราใช้ shell อันอื่นแล้วไม่มีบอกนะ)

pwd

จะได้ตามนี้

Command Line pwd

เราจะดูว่าในโฟลเดอร์หรือ Directory นี้มีไฟล์อะไรบ้างสามารถใช้คำสั่ง

ls

จะได้ผลตามรูปเลย

Command Line ls

ตอนนี้เราเริ่มรู้ละว่าเอ๊ะทำไมมันมีไฟล์เดียว แต่ก่อนจะไปขอเอาคำสั่ง Linux สักคำสั่งหนึ่ง

ls -lah

มันจะเป็นการดูละเอียดขึ้น ผู้เขียนใช้บ่อยมาก เอาไว้ดู Permission, Owner, Group, File อะไรแบบนี้

Command Line ls -lah

เอาล่ะ มาต่อ คือทำไมเหลือไฟล์เดียว จริง ๆ แล้วมันควรมี 2 ไฟล์ เป็นไฟล์ของ Nginx ที่เป็น Default กับของเราที่เพิ่มขึ้นไป คือแบบนี้ ตัว Volume ของ Docker มันจะเอาเครื่องที่ลง Docker หรือเครื่องภายนอก Container เป็นสำคัญ ถ้า Volume จากข้างนอกมันมีไฟล์อยู่ แล้วโฟลเดอร์ข้างใน Container มีไฟล์ด้วยอีก มันจะถูกแทนที่ด้วย Volume หรือโฟลเดอร์ข้างนอกแทน

เอาล่ะ เราเปลี่ยน Config กลับไปเป็นแบบเดิม ลบ Container ออกก่อนนะ เป็นตามนี้

version: "3.8"

services:
  web:
    container_name: nginx-volume
    image: nginx:latest
    ports:
      - '8080:80'
      - '8081:81'
    restart: always
    volumes:
      - './servers/test.conf:/etc/nginx/conf.d/test.conf'
      - './web/test.html:/usr/share/nginx/html/test.html'

Docker Compose ใหม่

docker compose -f docker-compose.yml up -d

เปิดเว็บใหม่เหมือนเดิม localhost:8080

Open Browser localhost:8080

localhost:8081

Open Browser localhost:8081

เอาล่ะ ทีนี้ลอง Remote เข้าไป ทำแบบคำสั่งด้านบนเลยนะตอน Remote เข้าไป แล้วไปที่โฟลเดอร์เดิม แล้ว ls -lah ดูเลย

Command Line ls -lah

เห็นอะไรมั้ย มันมาแล้ว มีเพิ่มเป็น 3 ไฟล์เลย เพราะตอนแรกมันถูกแทนที่จากข้างนอก แต่พอเปลี่ยนเป็นส่งไฟล์เดียวเข้าไปแทน มันจะเป็นการเพิ่มไฟล์ลง Container แทน นี่แหละที่เราต้องระวัง บางทีทำไปไฟล์ข้างในหายเรียบ ต้องระวังไว้

แล้วมันมีวิธีป้องกันมั้ย แบบกลัวพลาด ต้องบอกว่า มี แต่มันไม่ค่อยสะดวกเท่าไร คือ ทำการ Mount Volume เฉพาะโฟลเดอร์ แต่โฟลเดอร์ภายนอกหรือเครื่องเราเองต้องว่างเปล่าด้วยนะ พอสร้าง Container เสร็จแล้ว พอเราไปดูโฟลเดอร์ภายนอกหรือเครื่องเรา จะเห็นไฟล์ที่เหมือนกับของ Container มาแล้ว จากนั้นเราก็ค่อยเอาไฟล์ไปใส่ แต่แบบนี้ถ้ามีหลายเครื่องจะไม่สะดวกมาก ๆ เพราะฉะนั้นเราทำแบบท่าปกตินั่นแหละดีที่สุดแล้ว

วิธีเอาข้อมูลภายในมาไว้ที่ภายนอก Container

วิธีนี้เป็นการเอาสิ่งที่มีอยู่แล้วใน Container มาแสดงผลภายนอก เช่น

  • MySQL จะเป็นการเอา Database และ Log ต่าง ๆ ออกมาไว้ภายนอกแทน เมื่อเกิดปัญหาสามารถ Monitor ได้ทัน และถ้าลบ Container ไป ตัว Database และ Log ก็ยังจะอยู่ที่เรา ถือเป็นการ Backup ไปในตัว
  • Nginx เอา Log ของคนเข้าเว็บไซต์มาไว้บน Container

จากตัวอย่างข้างต้น ส่วนใหญ่จะเป็นการดู Log จากภายในมากกว่า อยากให้เข้าใจว่า ถ้ามีอะไรที่เกิดขึ้นในระบบแล้วมีการเปลี่ยนแปลงตลอดเวลา แบบนี้จะสามารถ Mount ออกมาได้ แต่มีข้อควรระวังตรงที่ ถ้าเกิดว่า Mount แบบนี้แล้ว เราไปแก้ไฟล์จากภายนอก ตัว Volume ข้างในก็จะเปลี่ยนไปด้วย เพราะฉะนั้นต้องมีการกำหนด Permission ของไฟล์ Mount ด้วยนะ ไม่งั้นเกิดปัญหา

ทำการแก้ไข docker-compose.yml โดยการเพิ่มบรรทัด log เข้าไป

version: "3.8"

services:
  web:
    container_name: nginx-volume
    image: nginx:latest
    ports:
      - '8080:80'
      - '8081:81'
    restart: always
    volumes:
      - './servers/test.conf:/etc/nginx/conf.d/test.conf'
      - './web/test.html:/usr/share/nginx/html/test.html'
      - './logs:/var/log/nginx'

อธิบายเพิ่มเติม (อธิบายเฉพาะส่วนของ Volume นะ คิดว่าส่วนอื่นสามารถดูได้จากเก่าที่เคยอธิบายไว้แล้วได้)

  • Volumes เป็นการ Mount Volume
  • ‘./logs เป็นไฟล์หรือโฟลเดอร์ที่เราต้องการ Mount Volume ภายนอก Container
  • : เป็นตัวคั่นระหว่างการ Mount Volume จากภายนอก Container และภายใน Container
  • /var/log/nginx เป็นไฟล์หรือโฟลเดอร์ภายใน Container

ทำการเพิ่มโฟลเดอร์ logs เข้ามาเพื่อทำการ Sync File จากข้างใน Container

Visual studio code nginx-volume

เสร็จแล้วก็เริ่มรันเลย โดยใช้คำสั่ง

docker compose -f docker-compose.yml up -d

ไปดู Docker Desktop กันเลย

Docker Desktop Container

จะเห็นว่าตอนนี้ Container เราทำงานได้ปกติละ ทีนี้เราไปที่โฟลเดอร์ Logs กันเลย

Visual studio code nginx-volume logs

เราจะเห็นว่ามีไฟล์โผล่มา นี่แหละ เรา Mount โฟลเดอร์จากภายใน Container มาไว้ภายนอก ทีนี้เราไปดูไฟล์ access.log จะเห็นว่าว่างเปล่า

Visual studio code access log

ทีนี้ลองไปที่ http://localhost:8080/ เลย

Open Browser localhost:8080

จากนั้นไปดูที่ไฟล์ access.log ใหม่

Visual studio code access log

เราจะเห็นว่ามีข้อมูลเพิ่มขึ้นมา เพราะว่า logs ที่เราเพิ่มใน docker-compose.yml นั้นเป็นการ Mount Logs ของ Nginx ไว้ เวลาดูเราก็สามาถมาดูที่เครื่องเราได้เลย ไม่ต้องเข้าไปใน Container เพื่อดู Logs เป็นไงครับ สะดวกขึ้นใช่มั้ย

ข้อควรระวังกับวิธีนี้ เราต้องระวังเหมือนเดิม คือ ถ้าเราสร้างโฟลเดอร์ logs ไว้ แล้วเกิดเรา Sync หรือ Mount Volume เรียบร้อย สร้าง Container แล้ว จากนั้นเราลบ Container แล้วสร้างใหม่เหมือนเดิม มันจะเป็นการเอาไฟล์จากเครื่องเราไปทับนะ เพราะฉะนั้นระวังไว้ด้วย

จากข้อควรระวังข้างต้น เรามีวิธีแก้มั้ย คำตอบคือมี แต่เท่าที่หาข้อมูลมาจะเทสบน Windows กับ Mac ไม่ได้นะ จากบทความนี้เลย Link ถ้าเอาสั้น ๆ ก็คือ บน Windows กับ Mac เป็นการจำลอง Virtual Environment ขนาดเราเข้าไปที่ Path ของ Docker ตามที่ในบทความเขียน เรายังไม่เห็น Volume เลย แต่ถ้าเราไปเทสบน Server Linux ไรงี้เห็นนะ ผู้เขียนลองดูละ ส่วนวิธีแก้ไขเป็นยังไงนั้นเราไปดูกัน

ทำการเพิ่มและเปลี่ยน docker-compose.yml ตามด้านล่างเลย

version: "3.8"

services:
  web:
    container_name: nginx-volume
    image: nginx:latest
    ports:
      - '8080:80'
      - '8081:81'
    restart: always
    volumes:
      - './servers/test.conf:/etc/nginx/conf.d/test.conf'
      - './web/test.html:/usr/share/nginx/html/test.html'
      - 'test:/var/log/nginx'

volumes:
  test:

อธิบายในส่วนของที่เปลี่ยนนะ และขออธิบายเป็นขั้นตอนไม่ไล่บรรทัดนะ เอาแบบที่ทำเลย

  • volumes เป็นการสร้าง Volume ขึ้นมา ในที่นี้ใช้ชื่อว่า test (เป็นชื่ออะไรก็ได้นะ) ต้องมี : ไว้ต่อหลังชื่อด้วยนะ มันเป็นรูปแบบของมัน
  • เปลี่ยน ‘./logs:/var/log/nginx’ เป็น ‘test:/var/log/nginx’ เพราะรอบนี้เราจะใช้ Volume ที่สร้างจาก docker-compose.yml

เอาล่ะเสร็จแล้วไปลบ Container ออกก่อนนะ แล้วจากนั้นเริ่มรันกันเลย

docker compose -f docker-compose.yml up -d

Docker Desktop ในแท็บ Container เหมือนเดิม แต่ใน Volume จะเป็นไงนั้นไปดูกัน

Docker Desktop nginx-volume_test

มีเพิ่มมาแล้ว เป็นชื่อ nginx-volume-test เอาล่ะ ต่อไปเราคลิกไปดูข้างในเลย

Docker Desktop nginx-volume_test in use

เราจะเห็นว่า Volume นี้เชื่อมต่อหรือ Mount เข้ากับ Container ที่เรารันไว้อยู่ ไปที่แท็บ Data เลย

Docker Desktop nginx-volume_test data

เราจะเห็นไฟล์ที่เรา Mount จาก Container ข้างใน ถ้าเราจะดูเราต้องโหลดไฟล์มาดูนะ วิธีนี้คือเราไม่เผลอแน่นอน ต้องตั้งใจจริง ๆ ถึงเข้าไปทำอะไรได้ แต่วิธีนี้เท่าที่ลองมามันเข้าไปที่ /var/lib/docker/ หรือถ้า Mac ที่ ~/Library/Containers/com.docker.docker/Data/vms/0/ มันก็ไม่เห็นนะ เลยไม่รู้ว่าเราจะ Remote เข้าไปใน Volume ยังไงเพื่อดูรายละเอียด

เสร็จไปแล้วกับ Volume บน Docker เป็นยังไงกันบ้างครับ คิดว่าพอมีประโยชน์กับผู้อ่านบ้าง ซึ่งอันนี้เป็นพื้นฐานสำหรับการใช้งาน Volume โดยหลัก ๆ มันก็ประมาณนี้แหละ เดี๋ยวบทความต่อ ๆ ไปจะมีการใช้ Docker จากตัวอย่างของจริง ยังไงก็รอติดตามกันได้เลย

สำหรับบทความนี้ก็พอแค่นี้ก่อนละกันครับ หากมีคำถามหรือข้อสงสัยสามารถสอบถามได้ทาง Email หรือทาง Social ที่ทางเว็บมีให้ครับ สำหรับวันนี้ สวัสดีครับ

ช่องทางการติดต่อ

Email: [email protected]

Website: https://blog.tichaky.com/

Facebook: https://www.facebook.com/tichaky

Youtube: https://www.youtube.com/@tichaky_diary

Post navigation

มาดู Droplets ของ DigitalOcean กัน

DigitalOcean มีอะไรให้ใช้บ้าง

ทำ Line Message API บน AWS Lambda

เชื่อมต่อ Twilio SMS เข้ากับ Logto