Các kiến thức cần hiểu sâu về docker
Gồm
Image
- Image của docker gồm nhiều tập hợp các layer, có thể tưởng tượng 1 layer này là một thư mục của.
- Sau đó docker dùng một kĩ thuật “Union File System” mình cũng chẳng biết nó có phải thực sự là một file system(file system được gọi kiểu format giống như ntfs, fat32, ext2,3,4…) hay không, nên mình mạn phép gọi nó là một kĩ thuật này để gộp các layer đó thành một thể thống nhất để hiển thị ra bên ngoài.
- Như hình là những layer. Layer 0(base layer) chỉ chứa file3 và file4, layer1 chứa file2 và layer2 chứa file1 và file4.
- Như ví dụ khi container được run trên Image chứa những layer này. Thì container sẽ thấy được hết tất cả các file1,2,3,4, ngoài ra file4 có ở cả layer base và layer2 thì khi container run nó sẽ sử dụng layer ở phía trên nghĩa là file4 được get ở layer2.
- Khi có chỉnh sửa file gì ở container thì container sẽ tạo ra file đó ở chính layer container này. Ví dụ ta tạo hoặc chỉnh sửa file4 ở container thì file4 ở layer2 sẽ không còn hiệu lực ở container nữa.
- Những layer image này chỉ có thể read only.
- Bản thân container đang chạy cũng có một layer nhưng layer này có thể read and write.
- Rất nhiều driver storage(Aufs,devicemapper,overlayfs,zfs,btrfs…) trong docker nhưng bản chất của những loại storage đều base trên “Union file system” này. Các bạn có thể đọc thêm trên trang chủ của docker cho những ai muốn tìm hiễu thật kĩ những thứ này. Mình thì nghĩ tới đây cũng đủ rồi.
Container
- Bản thân container cũng là một layer nhưng runtime và rw trên layer này được.
- Hai khái niệm cgroup và namespace được kernel linux support để limit resource và cô lập resource.
- Với cgroup nó giúp container của bạn có thể set được container này sử dụng được bao nhiêu memory bao nhiêu cpu(cả 0.5 core cũng có thể), giới hạn rw của io. Hình như mới chỉ có nhiêu đây.
- Namespace giúp bạn cô lập resource. Giúp các container bên trong không thấy được network, process, directory… bên ngoài host
- Ví dụ trong container khi bạn ls / thì nó chỉ là một directory của bên ngoài host như /var/lib/docker/container1(mình ví dụ thôi chứ nó dài dòng lắm).
- Khi ps aux thì chỉ hiển thị các process mà container run mà không hiển thị process bên ngoài đang run, nhưng bên ngoài host thì có thể thấy được các process bên trong container đang run.