Docker là gì?! Docker Image, Docker Container và Dockerfile
Docker là máy ảo siêu gọn nhẹ sử dụng tài nguyên chia sẻ với OS. Khái niệm Docker trong công nghệ không còn là mới. Nếu bạn chưa biết Docker là gì thì bạn đang lỗi thời đấy?!
Docker là gì?
Docker là máy ảo siêu gọn nhẹ sử dụng tài nguyên chia sẻ với hệ điều hành (OS).
Cách giải thích nhanh nhất và dễ hiểu nhất cho Docker đó là Docker gần giống với các máy ảo như VirtualBox hay VMware, nhưng gọn nhẹ hơn nhiều.
Lợi ích của dùng Docker:
- Khởi tạo môi trường phát triển phần mềm cực dễ dàng
- Đồng bộ giữa các môi trường: dev, staging, production
- Chi phí overhead nhỏ khi dùng Docker so với việc cài đặt trực tiếp trên máy
- Docker có trên cả Linux và Windows
Trình tự các bước thường làm để dựng môi trường phát triển bằng Docker:
Tìm docker image có sẵn trên cộng đồng (docker hub) hoặc từ viết Dockerfile. Các giải thích về docker image và Dockerfile sẽ có trong các mục tới.
Kéo docker image về máy hoặc build docker image từ Dockerfile.
Start docker container từ docker image
Vậy là xong, ta đã set up xong môi trường cho phát triển phần mềm với Docker cực kỳ đơn giản, dễ dàng và nhanh chóng.
Docker image
Docker image là một ảnh của một môi trường phát triển (có thể hiểu là snapshot). Nói ngắn gọn là chúng ta có thể gói các cài đặt môi trường (OS, package, phần mềm của chúng ta đã viết, …) lại thành 1 cục duy nhất, đó chính là docker image. Khi đã có docker image, ta có thể khởi tạo các docker container từ docker image.
Nếu liên tưởng đến OOP, thì ta có thể xem docker image là class, còn docker container là object / instance của class đó!
Vì vậy nếu ta có 1 docker image trên máy, ta có thể tạo một hoặc nhiều container có môi trường bên trong chúng giống hệt nhau.
Ok, vậy làm sao để tạo ra 1 docker image? Câu trả lời đó chính là viết Dockerfile. Ta build Dockerfile để tạo ra docker image (docker image thường có dung lượng nhỏ từ vài MB đến lớn vài GB).
Dockerfile
Dockerfile là file chứa các đặc tả về môi trường thực thi phần mềm. Dễ hiểu nó chỉ là file text thôi, và có các câu lệnh cài đặt quen thuộc. Dĩ nhiên cũng sẽ có 1 số câu lệnh hỗ trợ bởi docker.
Hãy cùng xem 1 Dockerfile đơn giản nào:
Dockerfile
FROM python:alpine3.7
RUN apk add git \
wget \
nano
COPY ./main.py /home
CMD ["python" "/home/main.py"]
- FROM: môi trường của mình sẽ được dựng trên môi trường đặc tả sau lệnh FROM, ở đây mình dùng môi trường python 3.7, hệ điều hành alpine 3.7 (link docker image ở đây). Có rất nhiều môi trường bạn có thể bắt đầu như ubuntu, centos, …
- python:alpine3.7: tên của 1 docker image có cấu trúc như sau: tên_image:version. Cho cùng 1 image python, ta có thể có nhiều phiên bản khác nhau.
- Các câu lệnh tiếp theo trong file lần lượt mô tả các package sẽ được cài đặt vào môi trường (hệ điều hành alpine, ta phải dùng lệnh "apk" thay vì "apt" như trên Ubuntu), copy source code file main.py từ máy thật vào trong image có đường dẫn /home. Cuối cùng là câu lệnh thực thi khi container được dựng lệnh / khởi động.
Docker container
Docker container là máy ảo chứa môi trường phần mềm.
Ví dụ, 1 container có thể chứa môi trường:
- OS: Ubuntu 16.04
- Đã cài sẵn 1 số package như: git, curl, wget, nano, … (hoặc package nào bạn mong muốn tùy nhu cầu mà bạn chọn image hoặc viết Dockerfile tương ứng)
- Đã cài web app bạn viết
- Web app đang chạy ở port 8080 trên môi trường ảo đó
Vì môi trường ảo trong container là cô lập, nên có 2 thành phần sau bạn thường mapping môi trường ảo với máy thật để dễ access và kiểm soát tài nguyên:
- cổng kết nối: port. Ví dụ web bạn bên trong container chạy ở port 8080, nhưng bạn mong muốn có thể access web của bạn tại port 9090 trên máy thật chẳng hạn. Nếu bằng cách nào đó bạn quên mapping port lúc start container lên thì bạn sẽ không access được web app đó.
- đường dẫn thư mục: volume. Quá trình container chạy có thể sản sinh ra 1 số file (ví dụ: file log chương trình), nếu không "mount" volume giữa thư mục máy thật và đường dẫn thư mục bên trong container (nơi sẽ chứa file sẽ được sản sinh) thì các file được sinh ra trong quá trình chạy ứng dụng của bạn sẽ nằm bên trong container mà bạn không thấy / xem được trên máy thật. Sau khi mount volume đường dẫn thành công thì các file sẽ được ghi ra đường dẫn máy thật bạn đã đặc tả.