Docker: Chưa biết gì đến biết dùng (Phần 1)

2052
05-03-2018
Docker: Chưa biết gì đến biết dùng (Phần 1)

1. Vì sao nên sử dụng docker

TheoBizfly Cloud chia sẻ - Vào một ngày đẹp trời "trăng thanh gió mát", sếp vui tính gửi cho bạn một vài bộ source code và bảo:

"Chú deploy những app này lên xem người ta làm thế nào nhé ! Có nhiều cái hay ho cho chú học hỏi đấy !"

Bạn hứng hở nhảy vào, đọc README.md một hồi, thấy một app thì code với Java, một app với Rails, một đồng chí nữa thì với Python. Lẩm bẩm, giờ ngồi search google, cài cắm, setup một tá môi trường này để deploy thì hết bao lâu ta ?

"Sếp ơi, em cần 1 buổi sáng để setup ạ."

"Ok chú, nhanh nhé !"

Cài chưa xong đã conflic tùm lum, cái nọ xung đột cái kia chẳng hạn, 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 học được thứ mình cần gấp từ app kia.

Ảnh 1.

Đó 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 để có thể deploy app lên để học hỏi rồi.

Một ví dụ đơn giản vậy thôi, không dừng lại ở đó, ưu điểm của Docker 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 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ýhệ điều hành(OS)application
    Ảnh 2.

Vấn đề gặp phải ở đây là lãng phí tài nguyên, một máy chủ chỉ cài được 1 OS, cho dù có ổ cứng 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 vitualization.

    Ảnh 3.

    Bạn có thể đã nghe tới cái tên Vitualbox hay VMware rồi đúng không, đó đó chính nó đó.

    Với công nghệ này, trên 1 máy chủ vật lý mình có thể tạo được nhiều OS, tận dụng tài nguyên đã tốt hơn nhưng lại nảy sinh vấn đề tiếp.

Tài nguyên: Khi bạn dùng 1 con máy ảo, bạn phải cấp cứng dung lượng ổ cứng cũng như RAM cho nó, bật lên để đó không làm gì thì máy thật cũng phải phân phát tài nguyên.

Ví dụ khi tạo một máy ảo ram 2GB trên máy thật ram 4GB, lúc này máy thật sẽ mất 2GB ram cho máy ảo, kể cả khi máy ảo không dùng hết 2GB ram, đó là một sự lãng phí.

Thời gian: Khá lâu, khởi động, shutdown có thể hàng phút
    Ở bước tiến hóa tiếp theo, người ta sinh ra công nghệ containerlization

    Ảnh 4.

Với công nghệ này, trên 1 máy chủ vật lý, ta sẽ sinh ra được nhiều máy con (giống với công nghệ ảo hóa), nhưng tốt hơn ở chỗ là các máy con này (Guess OS) đều dù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ẹ. 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 là containerlization sử dụng các container.

Một kĩ sư của Google đã phát biểu rằng:

Ảnh 5.

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 áp dụng nó thôi.

2.2 Container là gì ?

Các phần mềm sẽ được Container Engine (một công cụ ảo hóa tinh gọn, được cài đặt trên host OS) cô lập bằng cách đóng gói chúng thành các container.

Container là giải pháp để chuyển giao phần mềm một cách đáng tin cậy (không phát sinh lỗi) 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 bị cô lập 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.

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).

Container là 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, vận chuyển và chạy các ứng dụng dễ dàng hơn.

VD: Bạn sẽ có thể chạy một ứng dụng Java mà không cần cài JDK vào máy local bạn đang sử dụng.

Ô, nghe hay ho thiệt ha.

Ư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ỏ. Scale-up & scale-down: Do chia sẻ host OS nên container có thể được tạo gần như một cách tức thì. Nhanh: Tạo OS ảo nên thời gian khởi động là rất nhanh. Điều này khác với vagrant, 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. Tính đồ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.2 Docker ra đời

Công nghệ ảo hóa (vitualization) thì ta có thể dùng công cụ Vitualbox 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 :D 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ú ý.

Ảnh 6.

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ể tìm hiểu, tham khảo áp dụng công cụ này 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ồm Linux, Windows và cả Mac. Ngoài ra, Docker còn hỗ trợ nhiều dị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ào phầ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 Windows hóng sang, thế là Docker với Windows bắt tay nhau nhưng nghe chừng không khả quan lắm bởi vì nhân Windows có nhưng thứ không public được.

Cho tới hiện tại khi cài Docker trên Windows hay Mac thì Docker sẽ cài một máy ảo Linux trên máy thật và Docker hoạt động dựa trên máy ảo Linux đó. Còn tươ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ỏ, tham khảo cài đặt tại đây EE: Dành cho doanh nghiệp, tham khảo cài đặt tại đây 4. Hoạt động như thế nào ?

Docker image là nền tảng của container, có thể hiểu Docker image như là một template của container, nó sẽ tạo ra container khi thực hiện câu lệnh chạy image đó. Nếu nói với ngôn ngữ lập trình hướng đối tượng, Docker image là class, còn container là thực thể (instance) 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ột máy ảo, xuất hiện khi mình khởi chạy một image. Tốc độ khởi chạy container nhanh hơn tốc độ khởi chạy một máy ảo rất nhiều, và bạn có thể thoải mái chạy 4,5 container mà không sợ nặng máy.

Các files và settings được sử dụng trong container được lưu và sử dụng lại, gọi chung là images của docker. Docker hub là nơi chia sẻ và lưu giữ các file images này (hiện có khoảng 300.000 images)

Image: Tương tự như file .gho để ghost win mà mấy ông cài win dạo hay dùng, ở Docker thì nó gọi là image, 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ác môi trường lập trình được cài sẵn (httpd, mysqld, nginx, python, git, …). 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ư ý.

3. 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 mình trích dẫn nhanh để các bạn nhanh nắm bắt.

docker pull {image_name}: Pull một image từ Docker Hub

docker run --name {container_name} -p {host_port}:{container_port} -v {/host_path}:{/container_path} -it {image_name} /bin/bash: Tạo mới một container, đồng thời khởi động với tùy chọn cổng và volume

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.

uname -a, sẽ hiển thị thông tin của Kernel ubuntu ảo đó.

Nếu bạn đang dùng ubuntu, exit ra ngoài, gõ lại uname -a và so sánh.

Thông tin nhân Kernel như nhau nhé !

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 {nezw_container_name} /bin/bash: Truy cập vào container đang chạy

4. Update

Phần 1 khá thiên 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,..

Và có repo demo, dự là khá nhiều code. Mời các bạn đón đọc.

Theo Bizfly Cloud chia sẻ

>> Tham khảo thêm: Sử dụng "ausearch" để thực hiện truy vấn các audit logs

TAGS: docker
SHARE