Nếu bạn đang đọc bài viết này chắc hẳn là bạn đang tìm hiểu coi Docker là gì, nó có công dụng gì, cũng như cách dùng nó như thế nào. Nếu đúng như vậy thì mình sẽ không để bạn thất vọng đâu. Bài viết này Lập Trình Không Khó sẽ hướng dẫn những kiến thức cơ bản nhất Docker. Mình sẽ cố gắng trình bày sao cho chi tiết và mạch lạc nhất có thể. Chắc chắn nó sẽ giúp bạn có một cái nhìn sâu sắc nhất về cái thứ đang làm bạn mông lung này.
Docker là gì?
Docker là một dự án mã nguồn mở (open source) giúp quá trình triển khai (deploy) các ứng dụng, phần mềm trên các hệ điều hành Windows hoặc Linux trở nên đơn giản “giống như copy – paste”. Nói một cách dễ hơn hơn, docker mô phỏng một hệ điều hành Linux nơi nó chứa tất cả các môi trường dành cho dự án của bạn, hơn hết là nó đủ nhỏ bé để bạn có thể chia sẻ và nhân bản một cách dễ dàng.
Tại sao nên sử dụng Docker
Lấy ví dụ team bạn được giao một dự án mới hay ho, dự án này cần sử dụng một thư viện mã nguồn mở X trên Github.
Ồ, bạn biết ngay việc đầu tiên sẽ phải làm là gì rồi đúng không? Giờ mình sẽ cần cài đặt cái thư viện mã nguồn mở X kia lên máy để sử dụng cho dự án mới hay ho của mình.
Nào, mở README.md lên và xem cách cài đặt cái thư viện nguồn mở X ra làm sao. Nhưng không, đập vào mắt bạn là cả tá các dependencies cần cài. Nào là cmake, g++, cuda, glog, intel mkl,… Bạn cứ hình dùng là một tá (rất nhiều) các thư viện khác cần cài.
Khi đó bạn chắc mẩm, chắc phải mất buổi sáng để cài được cái thư viện X này quá. Bạn loay hoay đi cài từng thằng một và khi chỉ còn 2 thư viện nữa là xong thì terminal xuất hiện một màu đỏ lòm báo lỗi không tương thích phiên bản 🙁
Ngồi google không ra lỗi tại sao, bởi vì chúng toàn là các thư viện C++. Bạn nào từng cài các mã nguồn mở lớn dùng C++ chắc sẽ hiểu. Loay hoay đến cả ngày trời rồi vẫn không thể tìm ra cách khắc phục.
Giờ nên làm gì nhỉ, thôi thử lại lần nữa biết đâu hên thì sao !!!…
Và phần kết của câu chuyện mình muốn nhắc tới Docker. Lấy ví dụ một thư viện mã nguồn mở xử lý tiếng nói của ông trùm Facebook wave2letter được viết bằng mã nguồn C++. Bạn sẽ có 2 lựa chọn: (1) hoặc là tự cài hết mọi thứ, hoặc (2) kéo docker của họ đã chia sẻ trên DockerHub về là sử dụng được luôn.
Có thể bạn quan tâm: 20+ linux command hữu ích dành cho Data Scientist
Trước khi có Containerization
Vì Docker là một nền tảng container ảo hóa, nên trước khi đi tìm hiểu nó, chúng ta cùng tìm hiểu lịch sử phát triển một chút nhé.
Thời kỳ đầu, cách triển khai các ứng dụng của chúng ta hết sức đơn giản. Cho một máy tính chạy hệ điều hành phù hợp, cài đặt các dependencies lên và sau đó cho ứng dụng chạy trên đó. Nó chính là cách mà chúng ta vẫn xây dựng các mini project trên trường học đó.
Sang giai đoạn tiến bộ hơn, trước khi có xuất hiện của Containerization, phương pháp phổ biến nhất để cô lập, tổ chức các ứng dụng và dependencies của ứng dụng là ném chúng nó vào một con máy ảo (virtual machine). Những cái máy ảo này sẽ chạy rất nhiều ứng dụng trên cùng một phần cứng vật lý. Đại diện cho giai đoạn rực rỡ này có thể kể tên 2 phần mềm mà có lẽ nhiều bạn đã dùng, đó là VMWave và Virtualbox. Nó được gọi là công nghệ ảo hóa (virtualization).
Nhưng công nghệ ảo hóa có một số nhược điểm như là:
- Máy ảo có kích thước khá lớn, cài đặt cồng kềnh hơn.
- Khi đã bật máy ảo, nó sẽ chiếm đoạt 1 lượng tài nguyên của máy chủ, ngay cả khi nó không dùng được hết. Chẳng hạn như bạn tạo con máy ảo dùng 2GB ram, trong suốt quá trình hoạt động của máy ảo, dù nó chỉ dùng 1GB ram thì máy vật lý của bạn vẫn sẽ mất 2GB ram rồi.
- Quá trình khởi động máy ảo khá lâu.
Từ những hạn chế và yếu điểm của Virtualization dẫn đến sự ra đời của Containerization.
Với sự ra đời của Containerization, trên một máy chủ vật lý ta có thể cài đặt nhiều container tương tự như các máy ảo của công nghệ Virtualization. Nhưng điểm khác biệt ở đây là (xem ảnh phía trên):
- Các container không có hệ điều hành khách (Guest OS) như máy ảo. Tất cả các container sẽ sử dụng OS của máy mẹ. Do đó, chúng sẽ chia sẻ các thư viện và tài nguyên có liên quan khi cần thiết.
- Thời gian xử lý và thực thi các ứng dụng nhanh, do các tài nguyên của các máy ảo này đều được chạy trên nhân hệ điều hành của máy mẹ.
- Thời gian khởi động container nhanh, cỡ mili giây. Kích thước các container này cũng nhỏ hơn rất nhiều so với máy ảo của Virtualization.
Tìm hiểu chi tiết về Docker
Trong phần này, chúng ta sẽ cùng nhau tìm hiểu các khái niệm cơ bản nhất về Docker. Bao gồm các khái niệm về Dockerfile, Image và Container,…
Dockerfile, Images và Containers
Dockerfile, Images và Containers là 3 thuật ngữ quan trọng mà bạn cần phải hiểu rõ khi sử dụng Docker.
Như bạn có thể thấy trong bức hình trên. Khi dockerfile được build thì nó sẽ trở thành Docker image. Và khi bạn chạy file Docker image -> nó sẽ trở thành một Container.
Dockerfile là gì?
Dockerfile là một tài liệu nơi chưa tất cả những câu lệnh mà người dùng có thể gọi từ Command line để build ra một Docker image. Do đó, Docker có thể tự động build ra image dựa theo chỉ dẫn của Dockerfile. Câu lệnh docker build
cho phép bạn thực hiện việc tự động build 1 Docker image từ Dockerfile cho trước.
Docker image là gì?
Docker image có thể coi như là các template của các Docker container. Từ template này, chúng ta có thể tạo ra các Docker container giống nhau. Chúng là các file chỉ đọc, từ các file này bạn có thể tạo ra các Docker container bằng cách thực thi câu lệnh docker run
.
Docker image có thể được chia sẻ lên công khai trên Docker Hub (Nơi chia sẻ docker image) để mọi người có thể cùng phát triển và sử dụng.
Docker container là gì?
Nó là một phiên bản thực thi của Docker Image khi nó giữ toàn bộ các gói (package) cần thiết để chạy ứng dụng. Vì vậy, về cơ bản, có thể coi đây là các ứng dụng đã sẵn sàng được tạo từ Docker Images.
Đây chính là một ưu điểm vượt trội của Docker mà bạn đang mong chờ đúng không? Giờ thì chúng ta đi vào thực hành nhé.
Có thể bạn quan tâm:Tự xây dựng hệ thống chặn bình luận rác đơn giản
Tạo docker image của riêng bạn
Trước tiên, mình sẽ cài đặt Docker CE (Community Edition) trên con máy Ubuntu 18.04 của mình. Do đó, chúng ta sẽ cài theo hướng dẫn chi tiết đã có ở đây. Bạn có thể xem hướng dẫn cho OS của bạn nhé.
Và đây là kết quả sau khi cài thành công! Check luôn xem nó cài version mới nhất là version bao nhiêu.
lap60313@lap60313:~$ sudo docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 0e03bdcc26d7: Pull complete Digest: sha256:49a1c8800c94df04e9658809b006fd8a686cab8028d33cfba2cc049724254202 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/ lap60313@lap60313:~$ docker -v Docker version 19.03.12, build 48a66213fe
Bây giờ chúng ta sẽ cùng nhau đi tạo 1 cái Docker image nhé. Mình sẽ tạo một Docker image cho source code trang demo crawler website tin tức. Nếu bạn chưa biết nó là gì thì có thể trải nghiệm trước ở đây trước khi vào việc nhé.
1. Đầu tiên, mình sẽ tạo một thư mục news-crawler
để làm việc cho tiện
lap60313@lap60313:~/Desktop$ mkdir news-crawler lap60313@lap60313:~/Desktop$ cd news-crawler/
Do con news-crawler (Github repo) này của mình là một service chạy bằng Python 3, và yêu cầu một số package thì mình đã để trong file requirements.txt
rồi. Nên mình sẽ vào việc luôn nhé.
2. Tạo file Dockerfile chứa các chỉ dẫn cho Docker image, bạn có thể sử dụng editor bất kỳ để sửa đổi nội dung này nhé, vim editor chẳng hạn:
FROM ubuntu:18.04 MAINTAINER laptrinhkhongkho # Cài đặt git và python==3.6 RUN apt-get update && apt-get install -y software-properties-common && add-apt-repository ppa:deadsnakes/ppa && apt-get update && apt-get install -y python3.6 python3.6-dev python3-pip && apt-get install -y git RUN ln -sfn /usr/bin/python3.6 /usr/bin/python3 && ln -sfn /usr/bin/python3 /usr/bin/python && ln -sfn /usr/bin/pip3 /usr/bin/pip # Clone git repo RUN git clone https://github.com/nguyenvanhieuvn/news-crawler.git app WORKDIR /app RUN pip install -r requirements.txt EXPOSE 5001 ENTRYPOINT [ "python" ] CMD [ "app.py" ]
Mình sẽ giải thích một xíu các dòng có trong cái file Dockerfile
này:
- FROM: Mình sẽ lấy file Docker image ubuntu bản 18.04 trên Docker Hub về dùng.
- MAINTAINER: Thông tin chủ sở hữu 🙂
- RUN: phía sau nó là một command, chỉ dẫn cho quá trình build biết nó phải chạy câu lệnh gì. Ở đây mình cài python3.6 và git để phục vụ việc clone code từ Github về và chạy code thôi.
- WORKDIR: Khai báo thư mục làm việc. Do code của mình ở trong thư mục app sau khi clone về nên mình cần khai báo.
- EXPOSE: Flask app của mình chạy ở port 5001 (Xem trong app.py của repo), do đó mình báo cho Container nó biết để sau này nó mở port này ra, sau đó ta có thể ánh xạ nó với một port nào đó của máy vật lý.
- ENTRYPOINT và CMD: Chỉ định thực thi một câu lệnh executable. Ở đây là
python app.py
Tóm tắt: Dockerfile trên dựa trên một Docker image ubuntu 18.04, sau đó mình bảo nó cần cài thêm python==3.6 và git. Tiếp theo, clone git repo về, chạy vào thư mục source code và cài đặt các package python cần thiết. Cuối cùng là chạy chương trình.
3. Build dockerfile để tạo Docker image thì chúng ta dùng command docker build
thôi. Cái tham số tag bạn có thể thay đổi nhé. Sau khi thành công thì chúng ta có 2 dòng log như 2 dòng cuối cùng.
lap60313@lap60313:~/Desktop/news-crawler$ sudo docker build --tag news-crawler . ... ... Successfully built 4745c845fb52 Successfully tagged news-crawler:latest
4. Tạo container từ Docker image đã build
Thử xem Docker image mình build có hoạt động không chứ nhỉ 🙂 Dùng docker run
để tạo container thôi.
lap60313@lap60313:~/Desktop/news-crawler$ sudo docker run --name news-crawler -p 9000:5001 news-crawler * Serving Flask app "app" (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: off * Running on http://0.0.0.0:5001/ (Press CTRL+C to quit)
Command phía trên có tham số --name
chỉ định tên của container mà chúng ta sẽ run (tên không được trùng với các container đã có). -p
báo cho máy của mình biết là sẽ map port 5001 của container sang port 9000 của laptop của mình. Còn news-crawler
ở cuối câu lệnh là tên của image mà bạn sẽ run.
Và giờ thì mình có thể vào từ trình duyệt qua địa chỉ http://localhost:9000/ để sử dụng ứng dụng rồi.
Lưu ý: Trong hướng dẫn này, ứng dụng Flask này vẫn đang chạy ở chế độ nhà phát triển (Development). Nếu bản sử dụng cho mục đích triển khai (Production), bạn nên làm theo hướng dẫn kèm theo của Flask tại đây.
5. Kiểm tra docker image đã có trong danh sách. Và khi bạn đã có docker image rồi thì bạn cũng có thể chia sẻ nó lên Docker hub như ai đó luôn rồi nha.
lap60313@lap60313:~/Desktop/news-crawler$ sudo docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE news-crawler latest 4745c845fb52 28 minutes ago 656MB <none> <none> f681c1072c25 31 minutes ago 656MB <none> <none> 2ec9b9e5b45a 33 minutes ago 656MB <none> <none> 5611f759390f 38 minutes ago 491MB <none> <none> 4035a036fa5e 44 minutes ago 206MB <none> <none> 25e5fc64871d 52 minutes ago 133MB <none> <none> 63ffa760d8ef 55 minutes ago 261MB ubuntu latest adafef2e596e 11 days ago 73.9MB ubuntu 18.04 d27b9ffc5667 11 days ago 64.2MB hello-world latest bf756fb1ae65 6 months ago 13.3kB
Và đây là Docker image của mình sau khi chia sẻ lên Docker hub: https://hub.docker.com/r/hieunv1996/news-crawler
Bài viết của mình dài quá, hi vọng nó giúp ích được cho các bạn nhiều! Tuy nhiên đó vẫn chưa phải tất cả về Docker đâu, mong rằng bài viết sẽ cho bạn 1 cái nhìn cơ bản nhất về Docker và tiếp tục đào sâu về nó.
Dưới đây là một số tài liệu mình tham khảo trong quá trình viết bài. Đó cũng là những tài liệu bổ ích phục vụ cho việc tìm hiểu về docker của bạn luôn!
Tài liệu tham khảo:
Để lại một bình luận