1. Vì sao nên sử dụng
-
Vào một đêm đẹp trời
trăng thanh gió mát
,Bạn được phân bổ vào dự án mới, và tất nhiên là hào khí
ngút trời
, thế nhưchẻ tre
-
Hứng khởi vào đọc
README.md
một hồi, thấy dự án này sao mà cài cắm nhiều thứ thếNào là php, rồi npm, redis, mysql, elasticsearch, ...
Mỗi thứ lại phải kèm theo version bao nhiêu, một tá thư viện, vân vân và mây mây với với hàng tá thứ khác.
Định kể thêm tý nữa cho ra vẻ
nguy hiểm
nhưng mà thôi các bạn cứ hiểu là nhiều nhé -
Lẩm bẩm một hồi, giờ ngồi search google, cài cắm một tá thứ này thì hết bao lâu ta ?
Sếp ơi, em cần 1 buổi sáng để setup ạ.
- Cài chưa xong đã thấy rối tùm lum, cái nọ xung đột cái kia chẳng hạn, lại còn ảnh hưởng tới những chương trình cũ đã cài đặt trong máy nữa chứ, thôi cài lại luôn cả hệ điều hành cho máy.
Sếp ơi, em cần thêm 1 buổi nữa để setup ạ -_-
- Thôi xong, mất thời gian, mệt mỏi với nhưng thao tác phụ mà chưa tập trung được vào việc chính, hic.
- Đó chính là lúc bạn nên nghĩ tới Docker, mọi thứ sẽ đơn giản hơn nhiều.
Chỉ vài dòng lệnh thôi, cạch cạch cạch, bạn sẽ có thể nhanh chóng tạo được
môi trường ảo hóa
chứa đầy đủ nhữngcài đặt
cần thiết cho dự án rồi.
- Một ví dụ đơn giản vậy thôi nhưng
không
dừng lại ở đó, công dụng củaDocker
còn khá nhiều, chúng ta cùng tìm hiểu dần nhé !
2. Quá trình hình thành
Trước hết, cùng đọc lịch sử một chút đã:
2.1 Containerlization là gì ?
-
Ngày lâu lâu rồi, mô hình máy chủ thường là:
Máy chủ vật lý (physical server)
+hệ điều hành(operating system)
+ứng dụng (application)
.
- Vấn đề gặp phải ở đây là lãng phí tài nguyên
- Một máy chủ chỉ cài được một OS
- Cho dù có ổ cứng khủng, ram khủng thì cũng không tận dụng hết lợi thế.
-
Sau đó ra đời công nghệ ảo hóa
virtualization
.-
Có thể bạn đã nghe tới cái tên
Virtualbox
hayVMware
rồi đúng không, đó đó chính nó đó. -
Với công nghệ này, trên
một máy chủ vật lý
mình có thể cài đặt đượcnhiều OS
, tận dụng tài nguyên đã tốt hơn. -
Ví dụ:
- Bạn đang cài đặt
Ubuntu
trênmáy tính
để lập trình, sau đó càiVirtualBox
để có thể- Cài thêm
Windows 10
- thi thoảng nhớ mùi còn vàolàm trận game
. - Cài thêm
CenOS
- thử trải nghiệm nhánhRedHat
của họ nhàLinux
xem sao doUbuntu
thuộc nhánhDebian
. - Đó, vầy là trên một máy tính, bạn đã cài nhiều hệ điều hành để phục vụ cho những mục đích khác nhau.
- Cài thêm
- Bạn đang cài đặt
-
Nhưng lại nảy sinh vấn đề tiếp.
-
Về tài nguyên
:- Khi bạn bật máy ảo trên
VitualBox
chẳng hạn, bạn cần cấu hình để cung cấp ngay từ đầu tài nguyênổ cứng
vàram
từ máy thật cho máy ảo. - Bật máy ảo lên rồi để đó không làm gì thì máy thật cũng không thể tái sử dụng tài nguyên đã cho đi.
- Ví dụ khi tạo một
máy ảo ram 2GB
trênmáy thật ram 6GB
, lúc này máy thật sẽ chỉ còntối đa
6 - 2 = 4 GB ram, kể cả khi máy ảo không dùng hết 2GB ram được cấp, đó là một sựlãng phí
.
- Khi bạn bật máy ảo trên
-
Về thời gian
: Việc khởi động, tắt máy ảo khá lâu, có thể lên tới hàng phút.
-
-
-
Ở bước
tiến hóa
tiếp theo, người ta sinh ra công nghệcontainerlization
- Với công nghệ này, trên một máy chủ vật lý, ta sẽ cài đặt được nhiều máy ảo (giống với công nghệ ảo hóa
virtualization
), nhưng tốt hơn ở chỗ là các máy con này (Guess OS) đềudùng chung
phần nhân của máy mẹ (Host OS) và chia sẻ với nhau tài nguyên máy mẹ.
- Có thể nói là khi nào cần tài nguyên thì được cấp, cần bao nhiêu thì cấp bấy nhiêu, như vậy việc tận dụng tài nguyên đã tối ưu hơn. Điểm nổi bật nhất của
containerlization
là nó sử dụng cáccontainer
, và một kĩ sư của Google đã phát biểu rằng:
- Với công nghệ này, trên một máy chủ vật lý, ta sẽ cài đặt được nhiều máy ảo (giống với công nghệ ảo hóa
Một công ty hàng đầu
về công nghệ đã áp dụng nó, chứng tỏ lợi ích, độ tin cậy của công nghệ này rồi nhé ! Chúng ta cùng áp dụng
nó thôi.
2.2 Container là gì ?
Các phần mềm, chương trình sẽ được Container Engine
( là một công cụ ảo hóa tinh gọn được cài đặt trên host OS) đóng gói thành các container
.
Thế Container
là gì, nó là một giải pháp để chuyển giao
phần mềm một cách đáng tin cậy giữa các môi trường
máy tính khác nhau bằng cách:
- Tạo ra một môi trường chứa
mọi thứ
mà phần mềm cần để có thể chạy được. - Không bị các yếu tố liên quan đến môi trường
hệ thống
làm ảnh hưởng tới. - Cũng như không làm ảnh hưởng tới các phần còn lại của
hệ thống
.
Bạn có thể hiểu là ruby, rails, mysql ... kia được bỏ gọn vào một hoặc nhiều cái thùng (container), ứng dụng của bạn chạy trong những chiếc thùng đó, đã có sẵn mọi thứ cần thiết để hoạt động, không bị ảnh hưởng từ bên ngoài và cũng không gây ảnh hưởng ra ngoài.
Các tiến trình (process) trong một container
bị cô lập với các tiến trình của các container khác trong cùng hệ thống tuy nhiên tất cả các container
này đều chia sẻ kernel của host OS (dùng chung host OS).
Đây một nền tảng mở dành cho các lập trình viên, quản trị hệ thống dùng để xây dựng, chuyển giao và chạy các ứng dụng dễ dàng
hơn. Ví dụ, bạn có một app java, bạn sẽ không cần
cài đặt JDK vào máy thật để chạy app đó, chỉ cần kiếm
container đã được setting tương ứng cho app về, bật
nó lên, cho app chạy
bên trong môi trường container đó, vậy là ok. Khi không sài nữa thì tắt hoặc xóa bỏ
container đó đi, không ảnh hưởng gì tới máy thật của bạn.
Ưu điểm:
Linh động
: Triển khai ở bất kỳ nơi đâu do sự phụ thuộc của ứng dụng vào tầng OS cũng như cơ sở hạ tầng được loại bỏ.Nhanh
: Do chia sẻ host OS nên container có thể được tạo gần như một cách tức thì. Điều này khác với vagrant - tạo môi trường ảo ở level phần cứng, nên khi khởi động mất nhiều thời gian hơn.Nhẹ
: Container cũng sử dụng chung các images nên cũng không tốn nhiều disks.Đồng nhất
:Khi nhiều người cùng phát triển trong cùng một dự án sẽ không bị sự sai khác về mặt môi trường.Đóng gói
: Có thể ẩn môi trường bao gồm cả app vào trong một gói được gọi là container. Có thể test được các container. Việc bỏ hay tạo lại container rất dễ dàng.
Nhược điểm:
Xét về tính an toàn
:
- Do dùng chung OS nên nếu có lỗ hổng nào đấy ở kernel của host OS thì nó sẽ ảnh hưởng tới toàn bộ container có trong host OS đấy.
- Ngoài ra hãy thử tưởng tượng với host OS là Linux, nếu trong trường hợp ai đấy hoặc một ứng dụng nào đấy có trong container chiếm được quyền superuser, điều gì sẽ xảy ra? Về lý thuyết thì tầng OS sẽ bị crack và ảnh hưởng trực tiếp tới máy host bị hack cũng như các container khác trong máy đó (hacker sử dụng quyền chiếm được để lấy dữ liệu từ máy host cũng như từ các container khác trong cùng máy host bị hack chẳng hạn).
2.3 Docker ra đời
Công nghệ ảo hóa (virtualization
) thì ta có thể dùng công cụ Virtualbox hay VMware thế còn đối với containerlization
thì dùng gì đây ? Google họ dùng gì ?
Oh mình không biết được, mỗi một ông lớn có một cách để áp dụng công nghệ này và họ private
source code.
Gần đây, mà cũng lâu rồi Có một công ty tiến hành public
source code của họ về công nghệ này, họ tung ra sản phẩm mang tên là Docker và nhận được nhiều sự chú ý.
Sau đó công ty cũng đổi tên thành Docker luôn. Công ty này cung cấp công cụ Docker free nhưng họ kiếm được rất nhiều tiền từ những dịch vụ khác đi kèm với nó.
Với sự bùng nổ của việc sử dụng container
cùng với những lợi ích lớn mà nó mang lại, gã khổng lồ phần mềm Microsoft
không muốn bỏ qua cơ hội màu mỡ này với việc cho ra mắt tính năng mới có tên Windows Container
.
- Các bạn có thể tham khảo, áp dụng công cụ Windows Container của công ty Microsoft cho Windows tại đây.
- Còn phạm vi bài viết này xin giới hạn lại áp dụng sản phẩm Docker của công ty Docker cho Linux.
Đó, dân ta phải biết sử Tây là thế đó, chứ cứ lao vào học Docker luôn rồi cũng chẳng biết nó sinh đẻ thế nào, từ đâu mà ra, có anh em họ hàng gì không ?
3. Cài đặt ra sao ?
-
Docker
hỗ trợ nhiều nền tảng hệ điều hành khác nhau bao gồmLinux
,Windows
và cảMac
. Ngoài ra, Docker còn hỗ trợ nhiềudịch vụ
điện toán đám mây nổi tiếng như Microsoft Azure hay Amazon Web Services. -
Lưu ý là
ban đầu
nó được xây dựng trên nền tảng Linux. Vì Docker cần can thiệp vàophần lõi
, nhân Kernel trong khí đó Linux làmã nguồn mở
, gọi là cần gì có nấy. -
Đến khi thấy Docker
hay quá
, bác Windowsngỏ lời
, thế là công tyDocker
và công tyMicrosoft
hợp tác với nhau nhưng nghe chừngchưa khả quan
lắm bởi vì nhân Windows có nhưng thứkhông
public được ( bản quyền mà ).Cho tới hiện tại khi
cài
Docker trên Windows hay Mac thì Docker sẽ cài mộtmáy ảo
Linux trên máy thật và Docker hoạt độngdựa trên
máy ảo Linux đó. Còntương lai
về sau thì ai biết được. -
Docker có 2 phiên bản, CE( dành cho nhà phát triển, nhóm nhỏ,
coder
như chúng ta) và EE (dành chodoanh nghiệp
).Dưới đây mình sẽ giới thiệu cài đặt đối với bản
CE
trênUbuntu
thông quarepository
như sau:
I. Chuẩn bị một chút: # Update the apt package index:
$ sudo apt-get update # Install packages to allow apt to use a repository over HTTPS:
$ sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ software-properties-common # Add Docker’s official GPG key:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - # Verify that you now have the key with the fingerprint 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88, by searching for the last 8 characters of the fingerprint.
$ sudo apt-key fingerprint 0EBFCD88 pub 4096R/0EBFCD88 2017-02-22 Key fingerprint = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid Docker Release (CE deb) <_@.com>
sub 4096R/F273FCD8 2017-02-22 # Use the following command to set up the stable repository
$ sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"
II. Cài đặt docker CE: ## Update the apt package index:
$ sudo apt-get update ## Install the latest version of Docker CE, or go to the next step to install a specific version. Any existing installation of Docker is replaced.
$ sudo apt-get install docker-ce ## Verify that Docker CE is installed correctly by running the hello-world image.
$ sudo docker run hello-world
- Nếu câu lệnh cuối cùng của bạn ra kết quả như sau thì bạn đã cài đặt Docker thành công:
Ngoài ra bạn có thể tham khảo cài đặt tại trang chủ.
4. Hoạt động như thế nào ?
Docker image
là nền tảng củacontainer
, có thể hiểu Docker image nhưkhung xương
giúp định hình cho container, nó sẽ tạo ra container khi thực hiệncâu lệnh chạy
image đó. Nếu nói với phong cáchlập trình hướng đối tượng
, Docker image làclass
, còn container làthực thể
(instance, thể hiện) của class đó.
Docker có hai khái niệm
chính cần hiểu, đó là image
và container
:
-
Container
: Tương tự như mộtmáy ảo
, xuất hiện khi mìnhkhởi chạy
image.Tốc độ
khởi chạy containernhanh hơn
tốc độ khởi chạymáy ảo
rất nhiều và bạn có thểthoải mái
chạy 4,5 container mà không sợ treo máy.Các
files
vàsettings
được sử dụng trong container được lưu, sử dụng lại, gọi chung làimages
của docker. -
Image
: Tương tự như file.gho
để ghost win mà mấy ông cài win dạo hay dùng.Image
này không phải là một file vật lý mà nó chỉ được chứa trong Docker.Một image bao gồm
hệ điều hành
(Windows, CentOS, Ubuntu, …) và cácmôi trường
lập trình được cài sẵn (httpd, mysqld, nginx, python, git, …).Docker hub là nơi lưu giữ và chia sẻ các file images này (hiện có khoảng 300.000 images)
Bạn có thể tìm tải các image mọi người chia sẻ sẵn trên mạng hoặc có thể tự tạo cho mình một cái image như ý.
5. Các câu lệnh trong Docker
- Chuẩn chỉnh & đầy đủ nhất thì bạn cứ tham khảo trên trang chủ của docker docs. Còn ở bài viết này sẽ trích dẫn những câu lệnh cơ bản nhất giúp các bạn nhanh chóng nắm bắt:
- Pull một image từ Docker Hub
sudo docker pull image_name
- Tạo mới container bằng cách chạy image, kèm theo các tùy chọn:
sudo docker run -v <forder_in_computer>:<forder_in_container> -p <port_in_computer>:<port_in_container> -it <image_name> /bin/bash
Ví dụ:
sudo docker pull ubuntu:16.04
sudo docker run -it ubuntu:16.04 /bin/bash
- Bây giờ bạn đã dựng thành công một môi trường ubuntu ảo rồi đó.
Câu lệnh
uname -a
sẽ hiển thị thông tin của Kernel ubuntu, cùng so sánh nhé:
Kết quả của dòng uname-a
thứ nhất là thông tin Kernel của máy ảo (tức là của container)
Linux 5ed7d9f282fe 4.15.0-36-generic #39~16.04.1-Ubuntu SMP Tue Sep 25 08:59:23 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
Kết quả của dòng uname-a
thứ hai là thông tin Kernel của máy "thật" (Linux) bạn đang dùng.
Linux hoanki-Nitro-AN515-51 4.15.0-36-generic #39~16.04.1-Ubuntu SMP Tue Sep 25 08:59:23 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
-> Thông tin nhân Kernel như nhau nhé ! Do container sử dụng chung tài nguyên với host OS mà.
- Một vài câu lệnh khác:
docker images:
Liệt kê các images hiện có
docker rmi {image_id/name}:
Xóa một image
docker ps:
Liệt kê các container đang chạy
docker ps -a:
Liệt kê các container đã tắt
docker rm -f {container_id/name}:
Xóa một container
docker start {new_container_name}:
Khởi động một container
docker exec -it {new_container_name} /bin/bash:
Truy cập vào container đang chạy
6. Updating ...
Phần 1
này chủ yếu giới thiệu về lý thuyết
, để mình cùng nhau hiểu
Docker là gì và bản chất của Docker đã.
Trong quá trình viết bài mình cần tìm hiểu thêm nhiều và cũng nhận ra
nhiều điều mới.
Nếu có ý kiến đóng góp gì, bạn vui lòng comment
bên dưới nhé !
Trong phần 2 mình sẽ:
- Giải thích chi tiết hơn các câu lệnh (-it nghĩa là gì, /bin/bash nghĩa là gì,..)
- Cách tạo Dockerfile
- Cách tạo Docker Conpose, cấu hình,... Mời các bạn đón đọc.
###############################################
Thank for your attention
Mình đã viết Docker: Chưa biết gì đến biết dùng (Phần 2), mời các bạn đọc tiếp.
Tài liệu tham khảo: