Docker là gì? Docker là một thuật ngữ rất cần thiết cho những ai đang và theo con đường gắn với công nghệ thông tin. Thực sự với những thuật ngữ liên quan đến công nghệ là những điều hoàn toàn rộng lớn và không ngừng biến đổi. Docker chính là một khái niệm mà còn khá xa lạ với chúng ta kể cả là với nhiều người chuyên về công nghệ cũng vậy.
Vậy docker là gì? Nó được sử dụng để làm gì? Và những điều cần biết xung quanh nó chúng tôi sẽ cung cấp cho bạn những thông tin cơ bản nhất và hy vọng nó sẽ hữu ích với bạn.
Docker là gì?
Docker là một nền tảng để cung cấp cho các developers (nhà phát triển) và sysadmin (quản trị hệ thống mạng) cách để building, deploying và running ứng dụng dễ dàng hơn bằng cách sử dụng các containers (trên nền tảng ảo hóa).
Container là các môi trường độc lập và tách biệt để khởi chạy và phát triển ứng dụng.
Khi cần triển khai lên bất kỳ server nào chỉ cần chạy container của Docker thì ứng dụng của bạn sẽ được khởi chạy ngay lập tức
Việc đóng gói thành container này giúp cho việc triển khai các ứng dụng trở nên dễ dàng hơn
Ban đầu viết bằng Python, hiện tại đã chuyển sang Golang.
Có thể hiểu đơn giản là khi bạn muốn chạy app thì bạn phải thiết lập môi trường chạy cho nó. Thay vì sẽ đi cài môi trường chạy cho nó thì bạn sẽ chạy docker.
Cấu trúc và thành phần của Docker
Cấu trúc và thành phần của Docker
Docker bao gồm:
– Docker Client: Giao diện để tương tác giữa người dùng với Docker Daemon – HOST
– Docker Daemon (HOST): Lưu trữ image local và khởi chạy container từ những image đó
– Docker Hub (registry): Nơi lưu trữ các images
Docker sử dụng kiến trúc client-server. Tức là Client là nơi bạn tạo ra các requests, có thể là terminal, powershell, cmd…; Servers là nơi tiếp nhận request, thực thi hành động và trả response lại cho client, có tên gọi là “daemon“.
Ngoài ra, trong docker còn có 1 thành phần nữa tên là “registry” đóng vai trò lưu giữ các phiên bản docker images. Nó giống hệt như git, có github/gitlab/bitbucket lưu trữ những version của code.
Docker client sẽ liên lạc với các Docker daemon, các Docker daemon sẽ thực hiện các tác vụ build, run và distribuing các Docker container.
Docker client và Docker daemon có thể chạy trên cùng 1 máy, hoặc có thể kết nối theo kiểu Docker client điều khiển các docker daemon. Docker client và daemon giao tiếp với nhau thông qua socker hoặc RESTful API.
Trong đó API là cầu nối giữa client và server. Client có thể là máy tính, điện thoại sử dụng hệ điều hành khác nhau và được viết bằng những ngôn ngữ khác nhau. Tương tự, server back-end cũng được viết bằng các ngôn ngữ khác nhau. Để 2 thành phần này có thể nói chuyện được với nhau chúng phải nói cùng 1 ngôn ngữ. Ngôn ngữ ấy chính là API.
+ Docker Daemon: Docker daemon chạy trên các máy host. Người dùng sẽ không tương tác trực tiếp với các daemon, mà thông qua Docker Client.
+ Docker Client: Là giao diện người dùng của Docker, nó cung cấp cho người dùng giao diện dòng lệnh và thực hiện phản hồi với các Docker daemon. Nó dùng để tương tác giữa người dùng và Docker Daemon, Daemon sẽ biên dịch và thực thi các câu lệnh đã tương tác qua Docker client.
+ Docker Hub hay thường được gọi là Registry, nơi lưu trữ các image được cộng đồng hoặc các nhà phát triển đóng góp và cung cấp miễn phí, chúng ta có thể tìm các bản images tại đây. Điều này vô cùng tiện lợi, chúng ta chỉ cần pull (tải xuống) các image phục vụ cho nhu cầu ở mọi lúc mọi nơi.
Docker images: Là một template chỉ cho phép đọc, ví dụ một image có thể chứa hệ điều hành Ubuntu và web app. Images được dùng để tạo Docker container. Docker cho phép chúng ta build và cập nhật các image có sẵn một cách cơ bản nhất, hoặc bạn có thể download Docker images của người khác.
Docker Container: Docker container có nét giống với các directory. Một Docker container giữ mọi thứ chúng ta cần để chạy một app. Mỗi container được tạo từ Docker image. Docker container có thể có các trạng thái run, started, stopped, moved và deleted.
Chúng ta cũng có thể dễ dàng tạo ra những bản image của riêng mình phục vụ cho việc học tập, nghiên cứu, làm việc và chia sẻ chung cho cộng đồng.
Container trong Docker là gì?
Container là các môi trường độc lập và tách biệt để khởi chạy và phát triển ứng dụng.
Containers cho phép lập trình viên đóng gói một ứng dụng với tất cả các phần cần thiết như thư viện và các phụ thuộc khác, và gói tất cả ra dưới dạng một package.
Nhờ vào container, ứng dụng sẽ chạy trên mọi máy Linux (Hệ điều hành tự do nguồn mở) khác bất kể mọi cài đặt tùy chỉnh mà máy có thể có khác với máy được sử dụng để viết code.
Lợi ích của Docker đem lại là gì?
Docker khởi động hay dừng chỉ trong vài giây không như máy ảo
Bạn có thể khởi chạy container trên hệ thống mà bạn muốn.
Container có thể xây dựng và loại bỏ nhanh hơn máy ảo.
Dễ dàng thiết lập môi trường làm việc. Chỉ cần config (cài cấu hình) 1 lần duy nhất và không bao giờ phải cài đặt lại các dependencies. Nếu bạn thay đổi máy hoặc có người mới tham gia vào project thì bạn chỉ cần lấy và đưa config đó cho họ.
Nó giữ cho word-space của bạn sạch sẽ hơn khi bạn xóa môi trường có mà ảnh hưởng đến các phần khác.
Lý do Docker được sử dụng phổ biến?
– Tính dễ ứng dụng: Docker rất dễ cho người sử dụng từ lập trình viên, sys admin,… nó tận dụng lợi thế của container để build, test nhanh chóng.
Ứng dụng Docker chạy trong vùng chứa (container) có thể được sử dụng trên bất kỳ hệ thống nào: máy tính xách tay của nhà phát triển, hệ thống trên cơ sở hoặc trong hệ thống đám mây. Và là một công cụ tạo môi trường được “đóng gói” (còn gọi là Container) trên máy tính mà không làm tác động tới môi trường hiện tại của máy, môi trường trong Docker sẽ chạy độc lập.
Docker có thể làm việc trên nhiều nền tảng như Linux, Microsoft Windows và Apple OS X
– Tốc độ: Docker container rất nhẹ và nhanh, có thể tạo và chạy docker container chỉ trong vài giây.
– Môi trường chạy và khả năng mở rộng: Có thể chia nhỏ những chức năng của ứng dụng thành các container riêng lẻ.
Ví dụ: Database chạy trên một container và Redis cache có thể chạy trên một container khác trong khi ứng dụng Node.js lại chạy trên một cái khác nữa.
– Với Docker, rất dễ để liên kết các container với nhau để tạo thành một ứng dụng, làm cho nó dễ dàng scale (chia tỉ lệ), update các thành phần độc lập với nhau.
Cách thức hoạt động của Docker
Một hệ thống Docker được thực thi với 3 bước chính:
Build => Push => Pull, Run
Bước 1: Build.
Bạn sẽ tạo một dockerfile, trong dockerfile này chính là code của bạn
Dockerfile này sẽ được Build tại một máy tính đã cài đặt Docker Engine
Sau khi build bạn sẽ thu được Container, trong Container này chứa bộ thư viện và ứng dụng của bạn.
Bước 2: Push.
Khi đã có được Container, là thực hiện push Container này lên đám mây và lưu trữ ở đó
Việc push này có thể thực hiện qua môi trường mạng Internet.
Bước 3: Pull, Run
Một máy tính muốn sử dụng Container bạn đã push lên đám mây (máy đã cài Docker Engine) thì bắt buộc máy phải thực hiện việc Pull container này về máy tiếp đó là thực hiện Run Container này.
Đó chính là quy trình 3 bước hoạt động của một hệ thống sử dụng Docker.
Docker thường được sử dụng khi nào?
Khi cần triển khai kiến trúc Mircoservices (Microservice là một kỹ thuật phát triển phần mềm, một biến thể của kiến trúc hướng dịch vụ cấu trúc một ứng dụng như một tập hợp các dịch vụ được ghép lỏng lẻo. Trong kiến trúc microservice, các dịch vụ được xử lý tốt và các giao thức rất nhẹ)
Khi ứng dụng cần scale (chia tách tỉ lệ) một cách linh hoạt.
Khi cần build 1 lần và chạy ở nhiều máy khác nhau mà không cần quan tâm đến config.
Khi cần một cách tiếp cận mới về building, shipping, running ứng dụng một cách nhanh chóng dễ dàng.
Thời điểm sử dụng Docker?
Có thể sử dụng container Docker làm khối dựng cốt lõi để tạo ra ứng dụng và nền tảng hiện đại. Docker khiến cho việc dựng và chạy các kiến trúc vi dịch vụ được phân phối, triển khai mã với quy trình tích hợp và phân phối liên tục được tiêu chuẩn hóa, xây dựng các hệ thống xử lý dữ liệu có quy mô cực kỳ linh hoạt cũng như tạo ra các nền tảng được quản lý đầy đủ dễ dàng hơn cho các nhà phát triển.
Nên sử dụng Docker vào khi nào?
Vi dịch vụ
Sử dụng container Docker để xây dựng và thay đổi quy mô các kiến trúc ứng dụng được phân phối bằng cách tận dụng đơn vị triển khai mã tiêu chuẩn hóa.
Tích hợp và phân phối liên tục
Container Docker sẽ giúp tăng tốc phân phối ứng dụng bằng cách tiêu chuẩn hóa môi trường và loại bỏ xung đột giữa các ngôn ngữ và phiên bản.
Xử lý dữ liệu
Cung cấp khả năng xử lý dữ liệu lớn dưới dạng dịch vụ, đóng gói dữ liệu và gói phân tích vào các container di động mà người dùng không biết kỹ thuật cũng có thể thực hiện được.
Container duwois dạng dịch vụ
Xây dựng và vận chuyển các ứng dụng được phân phối có nội dung và kiến trúc được quản lý về mặt công nghệ thông tin và bảo mật.
Tại sao phải dùng Docker?
Việc setup và deploy application lên một hoặc nhiều server rất khó khăn từ việc phải cài đặt các công cụ, môi trường cần cho ứng dụng đến việc chạy được ứng dụng, sự không đồng nhất giữa các môi trường trên nhiều server khác nhau. Chính vì lý do đó Docker được ra đời để giải quyết vấn đề này.
Sự tiện lợi của Docker: Một dự án mới cần cài rất nhiều thứ như: ruby, rồi rails, redis, mysql, nginx, … phải kèm theo version… muốn làm được bạn tìm kiếm cách cài đặt, config những thứ này một cách mày mò rất lâu. Bên cạnh đó có thể lại còn ảnh hưởng tới những chương trình cũ đã cài đặt trong máy rồi chọn cài lại cả hệ điều hành cho máy. Rất nhiều công đoạn khác nhau vô cùng rắc rối và docker đã xuất hiện mọi thứ trở nên đơn giản hơn nhiều, chỉ vài dòng lệnh bạn sẽ có thể nhanh chóng tạo được môi trường ảo hóa chứa đầy đủ những cài đặt cần thiết cho project rồi.
Container Docker giúp việc chạy nhiều mã trên từng máy chủ dễ dàng hơn, cải thiện khả năng tận dụng và tiết kiệm tiền bạc cho bạn.
Sự dễ dàng sử dụng: Docker rất dễ cho mọi người sử dụng từ nhà phát triển developers, systems admins – quản trị mạng, architects… nó tận dụng lợi thế của container để build, test nhanh chóng. Có thể đóng gói ứng dụng trên laptop của họ và chạy trên public cloud, private cloud….
Tốc độ của Docker container rất nhẹ và nhanh
Khả năng di động của Docker: Môi trường develop được xây dựng bằng Docker có thể chuyển từ người này sang người khác mà không làm thay đổi cấu hình ở trong.
Chia sẻ, Môi trường chạy và khả năng mở rộng của Docker là điều mà nó được sử dụng nhiều.
Docker và VPS có sự khác biệt?
VPS là máy chủ riêng người ta sẽ tạo ra nhiều máy ảo được một dịch vụ lưu trữ Internet bán dưới dạng dịch vụ.
Docker là công cụ giúp bạn tạo một môi trường ảo hóa để chứa các phần mềm như chương trình, file, images…
Đối với các máy chủ ảo hoạt động như một máy chủ vật lý, chúng chứa tổng hợp các thư mục, dữ liệu, các thư viện lên đến hàng chục GBs.
Với các Docker, các containers sắp xếp các dữ liệu thành các gói riêng biệt, tạo một mô hình lưu trữ, xử lý thông tin kiểu mới.
Sử dụng Docker có nhiều ưu điểm hơn so với VPS:
Khởi tạo container nhanh mà xóa cũng nhanh
Build sẵn configuration (cấu hình) trong image, nên khi build một container thì nó sẽ tự động tải xuống.
Quy trình triển khai ứng dụng gọn nhẹ và nhanh
Khả năng mở rộng, phục vụ cho tự động hóa
Một số khái niệm liên quan Docker
Docker Client: là cách mà bạn tương tác với docker thông qua command trong terminal. Docker Client sẽ sử dụng API gửi lệnh tới Docker Daemon.
Docker Daemon: là server Docker cho yêu cầu từ Docker API. Nó quản lý images, containers, networks và volume.
Docker Volumes: là cách tốt nhất để lưu trữ dữ liệu liên tục cho việc sử dụng và tạo apps.
Docker Registry: là nơi lưu trữ riêng của Docker Images. Images được push vào registry và client sẽ pull images từ registry. Có thể sử dụng registry của riêng bạn hoặc registry của nhà cung cấp như : AWS, Google Cloud, Microsoft Azure.
Docker Hub: là Registry lớn nhất của Docker Images ( mặc định). Có thể tìm thấy images và lưu trữ images của riêng bạn trên Docker Hub ( miễn phí).
Docker Repository: là tập hợp các Docker Images cùng tên nhưng khác tags.
Docker Networking: cho phép kết nối các container lại với nhau. Kết nối này có thể trên 1 host hoặc nhiều host.
Docker Compose: là công cụ cho phép run app với nhiều Docker containers 1 cách dễ dàng hơn. Docker Compose cho phép bạn config các command trong file docker-compose.yml để sử dụng lại. Có sẵn khi cài Docker.
Docker Swarm: để phối hợp triển khai container.
Docker Services: là các containers trong production, trong đó 1 service chỉ chạy 1 image nhưng nó mã hoá cách thức để run image – sử dụng port nào, bao nhiêu bản sao container run để service có hiệu năng cần thiết và ngay lập tức.
Dockerfile là gì?
Dockerfile là file config (file cấu hình) cho Docker để build ra image. Nó dùng một image cơ bản để xây dựng lớp image ban đầu.
Một số image cơ bản: python, unbutu and alpine. Bên cạnh đó nó còn có các lớp bổ sung được xếp chồng lên lớp cơ bản. Cuối cùng một lớp mỏng có thể được xếp chồng lên nhau trên các lớp khác trước đó.
Các config cần biết như:
FROM – chỉ định image gốc: python, unbutu, alpine…
LABEL – cung cấp metadata cho image. Có thể sử dụng để add thông tin maintainer. Để xem các label của images, dùng lệnh docker inspect
ENV – thiết lập một biến môi trường
RUN – Có thể tạo một lệnh khi build image. Được sử dụng để cài đặt các package vào container
COPY – Sao chép các file và thư mục vào container
ADD – Sao chép các file và thư mục vào container
CMD – Cung cấp một lệnh và đối số cho container thực thi. Các tham số có thể được ghi đè và chỉ có một CMD
WORKDIR – Thiết lập thư mục đang làm việc cho các chỉ thị khác như: RUN, CMD, ENTRYPOINT, COPY, ADD,…
ARG – Định nghĩa giá trị biến được dùng trong lúc build image
ENTRYPOINT – cung cấp lệnh và đối số cho một container thực thi
EXPOSE – khai báo port lắng nghe của image
VOLUME – tạo một điểm gắn thư mục để truy cập và lưu trữ data
Qua tất cả những thông tin trên có lẽ bạn cũng đã có những hình dung cụ thể hơn về Docker. Và trong thế giới công nghệ thông tin đang phát triển mạnh một cách nhanh chóng như vũ bão này thì việc tìm hiểu về những khái niệm mới như Docker là sự cần thiết, nhất là với những ai đang quan tâm và muốn đi theo công nghệ.
Chúng ta có thể tìm kiếm bất cứ thứ gì trên mạng xã hội, sẽ có hàng ngàn hàng trăm câu trả lời cho một câu hỏi, ví dụ như Docker là gì? Với chúng tôi bạn sẽ được tổng hợp một cách chi tiết cơ bản để bạn hình dung và có thể trả lời cho câu hỏi chính. Bạn có thể tham khảo thêm từ các nguồn khác để bổ sung cho mình những gì cần thiết bạn nhé.