Docker là gì? Tại sao phải dùng Docker trong dự án phần mèm?
Bạn đã biết Docker là gì chưa? Và có biết tại sao nên sử dụng Docker hay không? Hãy cùng mình trải nghiệm qua bài viết này nhé.
Khi bắt đầu vào một dự án mới, bạn thường làm gì đầu tiên? Tất nhiên rồi phải cài cắm một đống thứ như PHP, MySQL, Redis, Elasticsearch… Lại kèm theo bao nhiêu là version, một tá thư viện vân vân và mây mây. Bùm, Docker sinh ra có thể giúp bạn tiết kiệm khá nhiều thời gian cho việc đó.
1. Docker là gì?
Docker là một nền tảng cho developers và sysadmin để develop, deploy và run application với container. Nó cho phép tạo 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 và môi trường này được gọi là container. Khi cần deploy lên bất kỳ server nào chỉ cần run container của Docker thì application của bạn sẽ được khởi chạy ngay lập tức.
2. Tại sao phải dùng Docker?
Một chút lan lan về mô hình máy chủ thông thường
Bài viết này được đăng tại [free tuts .net]
Như hình ta có thể thấy một mô hình máy chủ thông thường bao gồm máy chủ vật lý + hệ điều hành + ứng dụng.
Chúng ta có thể nhận ra được ngay những khuyết điểm trước mắt của hệ thống cũ như nà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ế.
Để khắc phục được 1 vài vấn đề từ hệ thống cũ thì đã ra đời công nghệ ảo hóa virtualization. Có thể bạn đã nghe tới cái tên Virtualbox hay VMware 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 được nhiều OS, tận dụng tài nguyên đã tốt hơn.
Hình minh hoạ
Nhưng lại nảy sinh thêm hai 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ên máy thật ram 6GB, lúc này máy thật sẽ chỉ còn tố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í.
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) đề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ẹ.
Hình minh hoạ.
Và có những công ty cực kỳ lớn đã từng áp dụng và thành công đó chính là GOOGLE. Và Google dùng rất nhiều, mình đã từng được nghe 1 kỹ sư ở đó nói rằng:
Và công ty lớn như Google đã từng dùng thì tại sao ta không nên học để kiểm nghiệm đó là thứ magical nào nhỉ.
Tổng kết lại: Việc setup và deploy application lên một hoặc nhiều server rất vất vả từ việc phải cài đặt các công cụ, môi trường cần cho application đến việc chạy được ứng dụng chưa kể việc 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.
3. Lợi ích của Docker là gì?
Không như máy ảo, Docker start và stop chỉ trong vài giây.
Bạn có thể khởi chạy container trên mỗi hệ thống mà bạn muốn.
Container có thể build 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 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 config đó và đưa 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 mà ảnh hưởng đến các phần khác.
4. Cài đặt Docker trên Linux
Chọn bản cài đặt tương ứng với hệ điều hành của bạn và tiến hành cài đặt theo hướng dẫn đối với Linux còn Windows và MacOS thì bạn chỉ cần tải bản cài về và cài đặt như mọi application khác.
Mình quen thuộc dùng linux nên mình sẽ hướng dẫn cài đặt bằng linux
Bước 1: mở terminal nên
Bước 2: copy curl -sSL https://get.docker.com/ | sh và ấn enter.
Sau khi cài đặt xong thì để kiểm tra xem cài đặt thành công hay không thì ta làm như sau.
Mở command line và gõ lệnh:
$ docker version
$ docker info
5. Một số khái niệm khác của Docker
Dưới là hình ảnh mô hình hoạt động của 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. VD: golang:1.11-alpine.
- 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. 1 service chỉ run 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.
6. Thử chạy một app React bằng Docker
Sau bao nhiêu lý thuyết rời rạc, cũng đã đến lúc bắt tay vào thực hành thôi nhỉ. Bài này mình cũng nói về lý thuyết khá nhiều nên mình thử chạy 1 app react của mình đã từng build nhỉ.
Command:
docker run -d –p 80:80 antienhp/react:v69
Mình lấy ip và kết quả là:
7. Các câu lệnh trong Docker thường dùng
Chuẩn chỉnh & đầy đủ nhất thì bạn cứ tham khảo trên docker docs. Còn ở bài viết này mình 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
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:
Sử dụng lệnh Run để khởi chạy một image.
docker run -it <image_name> /bin/bash
Ta hãy làm một ví dụ nhé, hãy chạy lệnh sau:
docker run -it ubuntu:16.04 /bin/bash
Lệnh này sẽ tự động pull image ubuntu 16.04 về nếu máy tình của bạn chưa có.
Sau khi bạn chạy lệnh này thì bạn đã tạo thành công một con ubuntu 16.04 bằng docker rồi đấy.
Như bài trước mình đã nói, docker cực kỳ nhẹ bởi vì nó dùng nhân kernel của máy chính, nên bây giờ mình thử kiểm tra xem nó có thực sự đúng hay không bằng câu lệnh sau:
uname -a
Khi bạn chạy lệnh này ở máy ảo (container mà bạn vừa tạo ở trên) thì thu được kết quả như sau:
Linux 9c786d7d4900 5.4.0-1025-aws #25-Ubuntu SMP Fri Sep 11 09:37:24 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
Đây là thông tin Kernel của máy ảo (tức là của container)
Khi bạn chạy ở máy chính (máy thật mà bạn đang sử dụng để tạo container) thì thu được kết quả như sau.
Linux ip-10-0-0-119 5.4.0-1025-aws #25-Ubuntu SMP Fri Sep 11 09:37:24 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
Cả hai kết quả đều có thông tin nhân Kernel như nhau nhé, do container sử dụng chung tài nguyên với host OS mà.
Liệt kê các images hiện có:
docker images
Xóa một image:
docker rmi {image_id/name}
Liệt kê các container đang chạy:
docker ps
Liệt kê tất cả các container:
docker ps -a
Xóa một container:
docker rm -f {container_id/name}
Khởi động một container:
docker start {new_container_name}:
Truy cập vào container đang chạy:
docker exec -it {new_container_name} sh
Vì bài này khá dài mình không đề cập build 1 app bằng docker step by step được. Nhưng mình hứa những bài sau sẽ giải thích kỹ hơn. Mong các bạn đón đọc kỳ sau.
Qua bài này, mình đã giới thiệu đến các bạn về docker cũng như cách cài đặt trên hệ điều hành Linux.