1. Cài đặt môi trường - Vấn đề muôn thuở của lập trình viên
Tôi đã sử dụng hệ điều hành Ubuntu 13.04 được 3 năm, từ đó đến giờ để lập trình thì tôi đã phải cài đủ thứ:
- LAMP stack dành cho lập trình web.
- Python cho xử lý ngôn ngữ và crawl dữ liệu.
- Java để lầp trình PC game.
- …
Kết quả là sau một thời gian, khi cài một số thư viện, ngôn ngữ mới thì gặp những lỗi build conflict giữa các thư viện, không biết giải quyết thế nào.
2. Docker xuất hiện
Docker giống như một loại máy ảo, có thể cô lập được môi trường bên trong và bên ngoài nên nếu tối có thể cài đặt nó lên và vào trong để cài môi trường phát triển thì sẽ giải quyết được vấn đề conflict bên trên.
3. Vậy thực chất Docker là gì?
Để nói về docker tôi nghĩ có thể mô tả nó thông qua 3 thứ sau:
- VM (Virtual Machine)
- Java
- Git
Docker vs Virtual Machine
Về cơ bản docker giống như một VM, nhưng kiến trúc bên dưới của nó hơi khác một chút. Nếu như với VM bạn sẽ phải xác định rõ tài nguyên RAM, ổ cứng cho nó và tất cả những gì VM sử dụng sẽ bị hạn chế theo cấu hình đó. Nhưng với docker thì không bị hạn chế như vậy.
Thêm 1 điểm khác biệt nữa là tiến trình của VM thì là của VM, còn tiến trình của docker thì là tiến trình của cả hệ thống. Vì vậy nếu bạn chạy apache trong 1 container thì ra bên ngoài liệt kê vẫn thấy có tiến trình tên apache. Trong khi điều này với VM là không thể. Nhìn vào hình minh họa bên dưới bạn sẽ thấy điều đó.
Docker giống Java?
Nếu bạn đã từng lập trình thì hẳn sẽ thích Java ở điểm là bạn chỉ cần viết chương trình một lần và chạy ở mọi nơi, mọi môi trường. Và với docker bạn cũng có thể làm điều tương tự: cài môi trường một, deploy mọi nơi!
Docker Engine nằm bên dưới cũng đóng vai trò tương tự Java Virtual Machine để tạo nên điều kì diệu đó.
Còn git?
Git là một loại chương trình dùng để quản lý source code rất phổ dụng trong giới lập trình. Docker coi môi trường lập trình cũng giống như một loại souce code có thể quản lý thông qua các commit. Với mỗi thay đổi của môi trường lập trình bạn đều có thể commit ghi lại sự thay đổi đó.
Và sau cùng bạn cũng có thể push những thay đổi đó lên một nơi gọi là docker hub, tương tự như github vậy. Và ngược lại bạn cũng có thể pull một image (môi trường lập trình bao gồm hệ điều hành và phần mềm bên trong, ở dạng nén) từ đâu đó về. Ví dụ:
docker pull deplop/lamp
Lệnh này sẽ pull một image tên là lamp (bên trong đã cài sẵn LAMP stack) từ một registry tên deplop (tên tài khoản của tôi trên dockerhub) về.
Nhờ sự tiện dụng này mà người ta có thể chia sẻ cho nhau các docker image đóng gói sẵn mà người dùng lại sẽ chẳng cần phải biết cách tạo ra nó như thế nào. (Thật ra cũng dễ thôi)
Hiện nay các opensource, hoặc các nhà phát triển ngôn ngữ lập trình đều có công bố các docker image chính thức cho các phiên bản ở trên trang Docker Hub.
4. Cho người bắt đầu sử dụng Docker
Có một khái niệm rất quan trọng mà tôi chưa nhắc đến ở phần trên. Đó là docker container. Nếu như docker image là file nén của HĐH mà bạn muốn cài thì docker container chính là một thực thể sống của HĐH ấy. (Giống class và instance)
Việc đầu tiên để bạn làm quen với docker là hãy thử dùng nó. Sẽ rất khó để bạn tự build một môi trường theo đúng ý ở thời điểm này. Vậy hãy tập cách dùng đồ của người khác đã. Hãy pull thử một image nào đó trên docker hub, ví dụ như:
docker pull mysql/mysql-server
(hãy chắc chắn là bạn đang dùng quyền root, nếu không thì phải thêm sudo ở đầu câu lệnh).
Bật console lên và gõ:
docker images
bạn sẽ thấy danh sách các docker image trên máy của mình, trong đó có mysql/mysql-server
Để tạo được docker container từ image này thì bạn cần dùng lệnh docker run như sau:
docker run -it mysql/mysql-server /bin/bash
Bạn sẽ thấy mình được chuyển vào trong container, bằng chứng là tại prompt của terminal bạn đã thấy mình đang đăng nhập là root trên một host khác rồi.
Gõ mysql bạn sẽ có thể sử dụng được mysql ngay trong container đó.
Gõ exit bạn sẽ trở lại với terminal ở host bên ngoài (hệ điều hành bạn đang dùng).
Bây giờ hãy gõ lệnh docker ps -a
bạn sẽ thấy danh sách các container mình đã tạo ra. Trạng thái của nó có thể là Up hoặc Exited hoặc Created. Để vào lại container lúc nãy bạn cần gõ lệnh:
docker exec -it [container_id] bash
Trong trường hợp container của bạn chưa ở trạng thái Up thì bạn cần start container lên trước:
docker start [container_id]
5. Kết luận
Dựa vào nội dung bên trên bạn đã hiểu docker là gì và cách sử dụng cơ bản của docker rồi chứ?
Docker thật tuyệt vời để tách biệt các môi trường lập trình và deploy môi trường cũng thật dễ dàng. Hãy thử tưởng tượng khi bạn tham gia vào 1 dự án, đáng ra bạn sẽ phải cài rất nhiều thứ để có thể chạy được môi trường lập trình trên máy mình thì bạn chỉ cần đơn giản là pull docker image của môi trường lập trình ấy về và start nó lên là xong!
Tuy nhiên nếu chỉ để dùng với mục đích ấy thì chắc hẳn người ta chỉ cần viết 1 cái script cài đặt chứ chẳng nhọc công tạo ra một thứ như docker. Trong bài sau, tôi sẽ giới thiệu với bạn ý nghĩa thực sự của docker khi áp dụng trong các hệ thống lớn, cần scale liên tục.
Nguồn Blog Dép lốp.