Docker là một nền tảng mã nguồn mở giúp chúng ta tạo một môi trưởng ảo hoá nhẹ để chạy các ứng dụng, các dịch vụ, với mục tiêu là đưa các ứng dụng dịch vụ đó cài đặt lên một máy chủ khác để triển khai cho người dùng
Tags: #docker, #dev-opsDocker là một nền tảng mã nguồn mở giúp chúng ta tạo một môi trưởng ảo hoá nhẹ để chạy các ứng dụng, các dịch vụ, với mục tiêu là đưa các ứng dụng dịch vụ đó cài đặt lên một máy chủ khác để triển khai cho người dùng.
Để mình lấy ví dụ về một app shop bán hàng viết bằng Python. Sau khi bạn viết xong mã nguồn, chương trình đã chạy được trên máy tính của bạn, tiếp đến, bạn cần đưa mã nguồn máy chủ và triển khai nó cho người dùng.
Trong quá trình triển khai, chạy mã nguồn cho người dùng sử dụng và truy cập được vào trang web, bạn cần cài đặt đúng phiển bản Python, các thư viện liên quan, chỉnh sửa các config và nhiều thứ khác.
Nhiều lúc, bạn sẽ gặp tình trạng là chương trình chạy được trên máy tính cá nhân của bạn, nhưng lại không chạy được trên máy chủ. Thậm chí, chạy được trên máy chủ này mà không chạy được trên máy chủ khác, có thể vì hệ điều hành khác nhau, môi trường thực thi khác nhau.
Lúc này Docker rất thực sự giúp ích rất nhiều. Nó giúp bạn tạo một môi trường ảo đồng nhất, bạn có thể quyết định được phiên bản Python này được cài đặt, hệ điều hành hỗ trợ là gì, và tự động cài đặt các thư viện cần thiết.
Các cài đặt này hoàn toàn độc lập với môi trường thật. Chẳng hạn, hệ điều hành của máy chủ là CentOS, cài Python 3.5, thì bạn có thể setup docker với hệ điều hành là Ubuntu và Python 3.9. Môi trường docker hoàn toàn độc lập với môi trường trên máy tính thật.
Docker gồm có ba thành phần chính: Docker Engine, Docker Registry và Docker Compose.
Trong phần thực hành này, chúng ta sẽ tạo một docker image để chạy một đứng dụng todo-list. Ứng dụng này được lập trình bằng NodeJS. Tuy nhiên nếu bạn không rành về NodeJS thì cũng không sao, vì bài viết tập trung vào công nghệ docker, không phải về lập trình.
Ứng dụng này đã được viết sẵn, bạn chỉ cần clone về máy tính của mình:
Dưới dây là danh sách nhưng file và folder trong mã nguồn mà bạn đã clone về:
Trong thư mục getting-started-app
, cùng vị trí với tệp package.json
, tạo một tệp có tên Dockerfile
. Bạn có thể sử dụng các lệnh sau để tạo một Dockerfile
dựa trên hệ điều hành Linux/Mac.
Tiếp theo, tạo một file Dockerfile
có nội dung như sau:
Chạy các lệnh sau để tạo image cho ứng dụng:
Lệnh docker build sử dụng Dockerfile
để xây dựng một image mới. Bạn có thể đã nhận thấy rằng Docker đã tải về rất nhiều “layer”. Điều này là do bạn đã hướng dẫn trình xây dựng rằng bạn muốn bắt đầu từ image node:18-alpine
. Nhưng, vì bạn không có image đó trên máy của bạn, Docker cần phải tải xuống.
Sau khi Docker tải xuống image, các hướng dẫn từ Dockerfile
đã sao chép ứng dụng của bạn và sử dụng yarn
để cài đặt các dependency của ứng dụng.
Lệnh CMD
chỉ định lệnh mặc định để chạy khi bắt đầu một container từ image này.
Cuối cùng, flag -t gắn thẻ image của bạn. Hãy nghĩ đây là một tên dễ đọc cho người của image cuối cùng. Vì bạn đã đặt tên image là getting-started
, bạn có thể tham chiếu đến image đó khi bạn chạy một container. Dấu chấm ở cuối lệnh docker build
nói với Docker rằng nó nên tìm kiếm Dockerfile
trong thư mục hiện tại.
Sau khi bạn đã có một image, bạn có thể chạy ứng dụng trong một container bằng lệnh docker run.Chạy container của bạn bằng lệnh docker run và chỉ định tên của image bạn vừa tạo:
-d
(viết tắt của --detach
) chạy container ở chế độ nền. Điều này có nghĩa là Docker khởi động container của bạn và trả lại bạn cho dấu nhắc lệnh.-p
(viết tắt của --publish
) tạo một ánh xạ cổng giữa host và container. Flag -p
nhận một giá trị chuỗi theo định dạng HOST:CONTAINER
, trong đó HOST là địa chỉ trên máy chủ, và CONTAINER là cổng trên container. Không có ánh xạ cổng, bạn sẽ không thể truy cập ứng dụng từ máy thật.Trong ví dụ này, cổng 3000 của container sẽ được ánh xạ để cổng 3000 trên máy thật. Có nghĩa là mọi kết nối để cổng 3000 trên máy thật sẽ được gửi đển cổng 3000 của container.getting-started
: Đây là tên của image Docker mà bạn muốn khởi chạy thành một container.Nếu có khó khăn hãy đặt câu hỏi cho nhóm Sydexa tại group facebook này nhé.