Khi các website kết nối với database và nhập data, data đó được lưu trữ ở đâu? Nó nằm trong một tệp bên trong container? Điều gì xảy ra với data đó khi bạn stop container hoặc delete container đó? Bạn sẽ lưu trữ dữ liệu của mình như thế nào nếu muốn nâng cấp database?…

Thường khi nhắc tới “type of mount” mình thấy người ta thường để ý các loại chính là bind, volume, tmpfs. Tuy nhiên nội dung bài viết hôm nay không để giới thiệu mà là note lại một số lưu ý về một trong hai type này là volume. Trong các bài viết khác mình sẽ note về các loại còn lại sau
Trong trường hợp bạn khai báo VOLUME trong dockerfile nó sẽ tự random ra một volume name và mount đường dẫn data bạn chỉ định vô đó, như kiểu trong dockerfile dưới đây mình sẽ mount đường dẫn /home/app/sm/eSIM

Kết quả sẽ được như sau

Một volume với random name đã được sinh ra khi run container.

Chúng ta có thể để ý data trong container sẽ được lưu ở server ở Mount path. Tuy nhiên, giả sử trong trường hợp bạn build lại một image mới và start nó lên. Thì volume cũng sẽ bị delete, một volume mới với random name mới sẽ được hình thành và đương nhiên Mount path lúc này data sẽ null.
Chính vì thế hiện tại có nhiều cách khác như bạn có thể tạo ra sẵn một volume mới
docker create volume /volume_name/
docker volume ls

Như hình mình đã tạo một volume name mới sm-test-eSIM giành cho môi trường test, môi trường preprod hay prod thì tương tự là sm-preprod-eSIM hay sm-prod-eSIM. Lúc này trong dockerfile mình sẽ xóa cái dòng VOLUME /home/app/sm/eSIM gì đó đi vì nó không cần thiết nữa. Tuy nhiên khi run container mình sẽ thêm một số tham số để nó mount với volume mình vừa tạo
Mẫu câu lệnh như dưới đây, ${env} có thể là test, preprod hay prod gì đó nhé
docker run -d -p ${port}:8080 --name ${image_name}-${env} --restart=always -v sm-${env}-eSIM:/home/app/sm/eSIM ${image_name}-${env}:v${BUILD_NUMBER}

Kiểm tra kết quả ta sẽ được như hình trên. Lúc này dù có build 1 image mới và run container thì data luôn luôn được lưu trữ ở volume vừa tạo thay vì bạn xài một volume random.
Trên đây là một lưu ý nhỏ của mình trong việc triển khai một container lên nhiều môi trường cũng như sử dụng volume. Bạn nào có ý tưởng, giải pháp khác thì cho mình xin nhé. Hẹn gặp các bạn trong những loại docker storage tiếp theo.
Chúc các bạn thành công!!!