Những kiến thức cơ bản về Docker
NỘI DUNG BÀI VIẾT
1. Docker là gì?
Theo nguồn wikipedia: “Docker là một dự án mã nguồn mở giúp tự động triển khai các ứng dụng Linux và Windows vào trong các container ảo hóa.”
Docker là nền tảng phần mềm cho phép bạn dựng, kiểm thử và triển khai ứng dụng một cách nhanh chóng. Docker đóng gói phần mềm vào các đơn vị tiêu chuẩn hóa được gọi là container có mọi thứ mà phần mềm cần để chạy, trong đó có thư viện, công cụ hệ thống, mã và thời gian chạy. Bằng cách sử dụng Docker, bạn có thể nhanh chóng triển khai và thay đổi quy mô ứng dụng vào bất kỳ môi trường nào và biết chắc rằng mã của bạn sẽ chạy được.
Cách thức hoạt động của Docker
Docker hoạt động bằng cách cung cấp phương thức tiêu chuẩn để chạy mã của bạn. Docker là hệ điều hành dành cho container. Cũng tương tự như cách máy ảo ảo hóa (loại bỏ nhu cầu quản lý trực tiếp) phần cứng máy chủ, các container sẽ ảo hóa hệ điều hành của máy chủ. Docker được cài đặt trên từng máy chủ và cung cấp các lệnh đơn giản mà bạn có thể sử dụng để dựng, khởi động hoặc dừng container.
Docker bao gồm các thành phần chính:
Docker Engine:
dùng để tạo ra Docker image và chạy Docker container.Docker Hub:
dịch vụ lưu trữ giúp chứa các Docker image.
Một số khái niệm khác:
Docker Machine:
tạo ra các Docker engine trên máy chủ.Docker Compose:
chạy ứng dụng bằng cách định nghĩa cấu hình các Docker container thông qua tệp cấu hìnhDocker image:
một dạng tập hợp các tệp của ứng dụng, được tạo ra bởi Docker engine. Nội dung của các Docker image sẽ không bị thay đổi khi di chuyển. Docker image được dùng để chạy các Docker container.Docker Container:
một dạng runtime của các Docker image, dùng để làm môi trường chạy ứng dụng.
Docker mang lại những giá trị gì
- Với Docker, chúng ta có thể đóng gói mọi ứng dụng vd như webapp, backend, MySQL, BigData…thành các containers và có thể chạy ở “hầu hết” các môi trường vd như Linux, Mac, Window…
- Docker Containers có một API cho phép quản trị các container từ bên ngoài. Giúp cho chúng ta có thể dễ dàng quản lí, thay đổi, chỉnh sửa các container.
- Hầu hết các ứng dụng Linux có thể chạy với Docker Containers.
- Docker Containers có tốc độ chạy nhanh hơn hẳn các VMs truyền thống (theo kiểu Hypervisor). Điều này là một ưu điểm nổi bật nhất của Docker
2. Sự khác biệt giữa Docker và Hypervisors
Hypervisors là gì?
Hypervisor
là ảo hỏa nằm ở tầng Hardware (phần cứng), tức là mô phỏng phần cứng và chạy những OS con trên phần cứng đó (Các công cụ Hypervisor như Virtual Box, VMware..)
Sự khác biệt giữa Docker và Hypervisors
Docker:
Dùng chung kernel, chạy độc lập trên Host Operating System và có thể chạy trên bất kì hệ điều hành nào cũng như cloud. Khởi động và làm cho ứng dụng sẵn sàng chạy trong 500ms, mang lại tính khả thi cao cho những dự án cần sự mở rộng nhanh.
Virtual Machine(Hypervisors):
Cần thêm một Guest OS cho nên sẽ tốn tài nguyên hơn và làm chậm máy thật khi sử dụng. Thời gian khởi động trung bình là 20s có thể lên đến hàng phút, thay đổi phụ thuộc vào tốc độ của ổ đĩa
3. Sự khác biệt giữa Docker Image và Docker Container
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.
4. Làm thế nào để tạo ra một Docker Image bằng Dockerfile
Dockerfile là gì?
Dockerfile
là một tập tin dạng text chứa một tập các câu lệnh để tạo mới một Image trong Docker.
Một số lệnh trong Dockerfile:
- FROM <base_image>:<phiên_bản>: đây là câu lệnh bắt buộc phải có trong bất kỳ Dockerfile nào. Nó dùng để khai báo base Image mà chúng ta sẽ build mới Image của chúng ta.
- MAINTAINER <tên_tác_giả>: câu lệnh này dùng để khai báo trên tác giả tạo ra Image, chúng ta có thể khai báo nó hoặc không.
- RUN <câu_lệnh>: chúng ta sử dụng lệnh này để chạy một command cho việc cài đặt các công cụ cần thiết cho Image của chúng ta.
- CMD <câu_lệnh>: trong một Dockerfile thì chúng ta chỉ có duy nhất một câu lệnh CMD, câu lệnh này dùng để xác định quyền thực thi của các câu lệnh khi chúng ta tạo mới Image.
- ADD <src> <dest>: câu lệnh này dùng để copy một tập tin local hoặc remote nào đó (khai báo bằng <src>) vào một vị trí nào đó trên Container (khai báo bằng dest).
- ENV <tên_biến>: định nghĩa biến môi trường trong Container.
- ENTRYPOINT <câu_lệnh>: định nghĩa những command mặc định, cái mà sẽ được chạy khi container running.
- VOLUME <tên_thư_mục>: dùng để truy cập hoặc liên kết một thư mục nào đó trong Container.
Ví dụ về Dockerfile
- Cài đặt docker: Tham khảo chi tiết tại đây: https://docs.docker.com/install/
$ sudo apt-get update
$ sudo apt-get install docker.io
Code language: JavaScript (javascript)
Kiểm tra để chắc chắn đã cài thành công docker
$ docker -v
Docker version 17.12.0-ce, build c97c6d6
- Tạo một folder bằng lệnh như bên dưới
$ mkdir docker-image
$ cd docker-image
$ touch Dockerfile
$ touch script.sh
- Trong file Dockerfile
FROM alpine
MAINTAINER QUY
COPY script.sh /script.sh
CMD ["/script.sh"]
Code language: JavaScript (javascript)
- Trong file script.sh
#! bin/sh
echo hello world, from a script file!
Code language: JavaScript (javascript)
Sau khi đã tạo cái file xong, chạy lệnh sau:
$ docker build .
Sending build context to Docker daemon 3.072kB
Step 1/4 : FROM alpine
---> 3fd9065eaf02
Step 2/4 : MAINTAINER QUY
---> Using cache
---> 4759e0f7f56d
Step 3/4 : COPY script.sh /script.sh
---> 420fa86d8721
Step 4/4 : CMD ["/script.sh"]
---> Running in f03416259b47
Removing intermediate container f03416259b47
---> 73dfa9b63cd8
Successfully built 73dfa9b63cd8
```markdown
Sau khi build thành công, thực hiện run image:
Code language: JavaScript (javascript)
$ docker run --name test 73dfa9b63cd8.
hello world, from a script file!
Code language: JavaScript (javascript)
Ngoài ra, bạn có thể kiểm tra các container đã build từ image
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a3bdcee1a850 73dfa9b63cd8 "/script.sh" 7 minutes ago Exited (0) 7 minutes ago quy
4c4d6861c295 6eb882774c34 "/script.sh" 8 minutes ago Up 8 minutes test
9fefbc7c63b3 ubuntu "/bin/bash" 9 days ago Exited (0) 9 days ago stupefied_ramanujan
Code language: JavaScript (javascript)
Vậy là chúng ta đã xây dựng xong 1 Dockerfile build và run một Docker Image đơn giản, tuy nhiên cần tìm hiểu kỹ hơn để áp dụng cho các dự án.
Happy learning!!!
Leave a Reply