Docker - những kiến thức cơ bản phần 1

Giới thiệu

Nếu bạn đang làm ở một công ty công nghệ thông tin, chắc rằng bạn đã được nghe nói về Docker. Thậm chí trong số các công nghệ "hot" nhất hiện nay như PostgreSQL, MongoDB, Apache Spark, Bash shell, AWS, Kafka, Jenkins, thì Docker vẫn nổi bật nhất. Các doanh nghiệp đều muốn Docker. Docker ngày càng trở nên gần gũi với các start-ups cũng như với những tập đoàn kinh tế lớn cho dù nó chỉ đang là một công cụ rất mới.

Mục lục

  1. Docker là gì?
  2. Sự khác biệt giữa Docker và Hypervisors
  3. Sự khác biệt giữa Docker Image và Docker Container
  4. Làm thế nào để tạo ra một Docker Image bằng Dockerfile

Nội dung

1. Docker là gì?

Docker là gi?

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

Theo các trang mạng: "Docker là một open platform cung cấp cho người sử dụng những công cụ và service để người sử dụng có thể đóng gói và chạy chương trình của mình trên các môi trường khác nhau một cách nhanh nhất."

Lại có định nghĩa rằng: "Docker là một phương thức để đóng gói và sắp xếp phần mềm."

Chúng ta sẽ thiết lập cho app của mình các môi trường cần thiết với docker. Khi ai đó muốn chạy app đó thì chỉ cần chạy docker mà không cần phải cài môi trường cho app nữa vì docker đã giúp ta rồi. Bạn không cần phải biết về laravel, ruby on rails hay thậm chí là java cũng như các môi trường của nó mà vẫn chạy được app, thật là đơn giản đúng không nào!

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ình
  • Docker 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

$ sudo apt-get update
$ sudo apt-get install docker.io

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"]

#! bin/sh

echo hello world, from a script file!

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

Sau khi build thành công, thực hiện run image:

$ docker run --name test  73dfa9b63cd8.

hello world, from a script file!

Ngoài ra, bạn có thể kiểm tra các images đã build

$ 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

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.

Lời kết

Trong phần 1 này cơ bản chúng ta đã hiểu về docker cùng một số khái niệm quan trọng như Dockerfile, Docker Images, Docker Container...Mong được sự góp ý từ mọi người, hãy quan tâm và theo dõi phần sau cũng như series 2018 - Cùng nhau học Docker nhé 😜😜😜

Nguồn: