12/08/2018, 18:13

[DOCKER] Những điểm cần lưu ý khi sử dụng docker

Mình cũng chưa làm việc với Docker thực sự lâu và chủ yếu là ở môi trường development nhưng cũng đã gặp khá nhiều vấn đề cần giải quyết với thằng này. Nên hôm nay mình sẽ tổng hợp lại một số chú ý rút ra từ kinh nghiệm của bản thân cũng như sau khi tổng hợp được chia sẻ qua một số blog mà mình tìm ...

Mình cũng chưa làm việc với Docker thực sự lâu và chủ yếu là ở môi trường development nhưng cũng đã gặp khá nhiều vấn đề cần giải quyết với thằng này. Nên hôm nay mình sẽ tổng hợp lại một số chú ý rút ra từ kinh nghiệm của bản thân cũng như sau khi tổng hợp được chia sẻ qua một số blog mà mình tìm thấy.

Nên biết về Docker storage drivers

Có lẽ bạn đã và đang sử dụng docker nhưng chưa để ý hay tìm hiểu về việc các images, containers được lưu trữ như thế nào? Hay là việc images đã được container sử dụng như thế nào?

  • Thì storage drivers cho phép mình create data trong một layer có thể ghi của container. Các files sẽ không được lưu lại sau khi mà container stops, và cả đọc và ghi là thấp.

Images và layers

Mỗi Docker images được tạo thành từ một loạt các layers. Mỗi layers sẽ đại diện cho một chỉ thị trong dockerfile. Ví dụ một Dockerfile như dưới:

FROM ubuntu:15.04
COPY . /app
RUN make /app
CMD python /app/app.py

Docker file bên trên bao gồm 4 commands và mỗi command này sẽ tạo ra một layer. Mỗi một layer chỉ là một phần khác biệt so với layer phía trước nó. Mỗi layer sẽ được xếp lên trên layer trước nó, bạn tưởng tượng những viên gạch đặt chồng lên nhau vậy. Điều quan trong ở đây bạn cần nhớ đó là khi mà bạn tạo một container mới thì bạn đã tạo ra một writeable layer on top of the underlying layers - một layer có thể ghi được đặt trên cùng so với những layer thuộc images mà container này được tạo ra. Hãy nhìn vào hình bên dưới để trực quan nhất

Nguồn: https://docs.docker.com/storage/storagedriver

Container và layers

Bạn có để ý là các layer bên dưới được nhóm lại với nhau và có chiếc khóa không? Điểm khác biệt lớn giữa một container và image đó chính là writeable layer ở trên cùng này. Tất cả những thay đổi mà bạn thực bên trong container sẽ được lưu lại và layer có thể ghi này. Khi container bị xóa chúng cũng bị xóa theo và quay trở lại trạng thái unchanged (chính là bản mới sau khi vừa được build ra từ image). Nhiều container có thể truy cập vào cùng một image nếu chúng được tạo ra từ image này và tất nhiên mỗi container sẽ có một layer để lưu trạng thái của riêng nó.

Nguồn: https://docs.docker.com/storage/storagedriver/#container-and-layers

Khi nào sử dụng copy/add và volumne

  • Bạn có thể sử dụng COPY hoặc ADD trực tiếp vào Dockerfile. Việc này hữu ích khi mà bạn muốn di chuyển source code vào docker image, ví dụ khi mà bạn muốn send code tới một environment khác (production, CI, ...)
  • Bạn nên sử dụng volume khi mà bạn thay đổi code và nhìn thấy sự thay đổi đó ngay lập tức. Hiểu đơn giản là source code bên ngoài máy host và trong container đã "thông" với nhau, bạn thay thay đổi bên ngoài nó sẽ thay đổi tương ứng trong container và tất nhiên kết quả bạn nhận được là những gì bạn đã thay đổi.
  • Bạn sẽ thường sử dụng volume khi mà muốn share thư mục giữa các container hay việc ghi một số lượng lớn dữ liệu vào thư mục, ví dụ như database.
  • Vài trường hợp mà bạn lại muốn dùng cả 2, đơn giản team của bạn cần maintain một project cũ, bạn share một image với các thành viên khác khi đó image bạn tạo ra có thể sử dụng COPY để gắn code cũ với iamge. Sau đó mỗi người khi build container thì sử dụng volume để nhận được sự thay đổi kết quả code trong suốt quá trình phát triển sản phẩm. Chú ý là volume này sẽ ghi đè nội dung thư mục tương ứng của image. (Phần này lưu trong wriable layer nha).

Không (tránh) lưu trữ dữ liệu trong containers

  • Bạn cần lưu ý rằng container của mình có thể bị xóa đi hoặc bị thay thế, khi đó những dữ liệu bạn đang tương tác bên trong container mà không có ở trạng thái khi mà container này unchanged thì cũng sẽ bị xóa. Đó chính là điều mà chúng ta vừa tìm hiểu về container wriable layer. Thử nghĩ xem thao tác lưu trữ một lượng lớn dữ liệu trong database và rồi nó biến mất ngoài ý muốn sau khi bạn xóa container đi (rip)             </div>
            
            <div class=

0