Trang chủ Program Docker thật đơn giản – Pt.1

Docker thật đơn giản – Pt.1

bởi root

Sau một thời gian trải nghiệm Docker, mình cảm thấy đây là một công cụ rất hữu ích cho đối tượng là lập trình viên hoặc nhân viên vận hành hệ thống. Mình sẽ thực hiện một series về Docker để giới thiệu công cụ này với mọi người.

Docker đang xuất hiện khắp nơi và được rất nhiều người sử dụng

Container là gì?

Container là một giải pháp cho vấn đề: “Làm thế nào để một phần mềm chạy một cách ổn định khi chuyển từ mộ trường này sang môi trường khác?”. Ví dụ như từ laptop của một lập trình viên lên server production, hay thậm chí là chuyển lên nền tảng cloud.

Các vấn đề phát sinh mà ta thường gặp như máy bạn dùng Python 2.7, nhưng trên server lại cài đặt Python 3.6, hoặc không có một phiên bản Python nào được cài đặt. Hay đôi khi bạn đang làm việc và phát triển phần mềm trên windows, và các server bạn có trong tay toàn dùng Linux. Đó là lúc Container giúp ta giải quyết vấn đề.

Một cách nôm na, thì container đóng gói tất cả những gì bạn cần (các thư viện, các tập thực thi, các tập tin cấu hình, …) để chạy ứng dụng của bạn, không phân biệt môi trường, phần cứng, hệ điều hành. Bạn có thể dùng container trên windows y hệt như trên Ubuntu.

Container vs Ảo hoá

Với các công nghệ ảo hoá (thường thấy như các máy ảo VMWare, Virtualbox), một máy ảo gồm hệ điều hành. Một máy vật lý mà chạy 5 máy ảo, thì máy vật lý đó sẽ chạy một trình ảo hoá và thêm 5 hệ điều hành riêng biệt.

Đối với container thì lại khác, với kết quả tương tự như trên, nhưng ta chỉ có một hệ điều hành duy nhất của máy vật lý, và các container lại chia sẻ chung một nhân hệ điều hành. Tất nhiên các phần chia sẻ chỉ cho phép được đọc (Read Only), và mỗi container lại có phân vùng riêng của mình để ghi dữ liệu. Tóm lại, container nhẹ hơn và sử dụng tài nguyên hợp lý hơn rất nhiều so với ảo hoá truyền thống.

Lợi ích của Container

  • Kích thước nhỏ: một máy ảo cho một hệ điều hành phải có kích thước lên đến vài GB, nay chỉ gói gọi lại vài chục MB
  • Khởi động nhanh: rất nhanh so với khởi động một máy ảo. Vì vậy người ta chỉ khởi chạy một container khi cần, và tắt hoặc xoá luôn nếu nó không cần thiết nữa.
  • Dễ dàng module hoá: ứng dụng có thể chia thành các module khác nhau, gói trong các container, chỉ chạy khi cần thiết và tiết kiệm được chi phí rất nhiều

Docker là gì

Docker là một công cụ giúp tạo và triển khai các container một cách dễ dàng.

Image trong docker

Có một khái niệm quan trọng cần biết đến là image. Image đóng vai trò như tập tin định nghĩa (tương tự như image trong các hệ thống ảo hoá), docker sẽ dùng các images này để sinh ra các containers.

Để kéo một image đã được tạo sẵn về, ta sử dụng lệnh sau trong terminal:

1
$ docker pull <tên image:tag>

Ví dụ:

1
$ docker pull ubuntu:18.04

Trong ví dụ này, ta đã kéo image của hệ điều hành Ubuntu 18.04 về máy. Ta sử dụng lệnh sau để in ra danh sách các images đang có trong máy:

1
2
3
$ docker images
REPOSITORY            TAG              IMAGE ID         CREATED          SIZE
ubuntu                18.04            8e4ce0a6ce69     7 weeks ago      64.2MB

Kết quả trả về ta có ảnh của ubuntu phiên bản 18.04, với kích cỡ chỉ 64.2MB, nhỏ hơn rất nhiều so với hệ điều hành được tải về từ trang chủ của Ubuntu (2GB).

Để chạy container từ image này, ta sử dụng lệnh:

1
2
$ docker run -it ubuntu:18.04
root@b17df7128c78:/#

Tham số -it có để khi chạy container, ta có terminal làm việc ngay với Ubuntu. Kết quả là ta đang ở trong Ubuntu và có thể thực hiện chạy ngay câu lệnh mình cần, với tốc độ khởi tạo chỉ tính bằng giây.

Dockerfile

Docker file là một file mô tả để tạo ra image. Ta có thể viết Dockerfile của riêng mình để tạo image, kế thừa từ một image đã có sẵn, mọi thiết lập đều khá dễ, nhưng khối lượng khá lớn, mình sẽ trình bày cách tạo Dockerfile ở các bài viết lần sau.

Docker-compose

Đúng như cách gọi, từ compose nghĩa là biên soạn. Đây là một công cụ đi kèm docker giúp ta tạo một môi trường bằng cách đặt các config trong file docker-compose.yml mà không cần phải chạy nhiều dòng lệnh trong terminal nữa.

Mình sẽ lấy một ví dụ xây dựng môi trường phát triển một website với những thành phần như sau:

  • MySQL cho database
  • Apache PHP cho webserver

Ta biên soạn một file tên docker-compose.yml với nội dung sau:

#docker-compose.yml
version: "3"

services:
  myweb:
    image: tutum/apache-php
    links:
      - mysql
    ports:
      - "3000:80"
    networks:
      - my-network
    volumes:
      - .:/var/www/html/myweb
    environment:
      - ALLOW_OVERRIDE=true
  mysql:
    image: mysql
    ports:
        - "3307:3306"
    networks:
        - my-network
    volumes:
        - ./mysql-data/:/var/lib/mysql/
    environment:
        - MYSQL_ROOT_PASSWORD=root
        - MYSQL_DATABASE=myweb

networks:
  my-network:

Ở trong file trên, ta có các thông tin cơ bản cần phải biết là: ta có 2 services (tương ứng với 2 container) cùng chạy trong môi trường.

Container đầu tiên là myweb, với nhiệm vụ tạo webserver. Nó mở một cổng trên máy thật(port 3000) và kết nối cổng đó với container(port 80). Tương tự với volumes, ta bind thư mục hiện tại với thư mục /var/www/html/myweb của container. Về sau khi thay đổi mã nguồn ở máy thật, thì các file này cũng xuất hiện ngay ở trong container một cách tức thời. Kết quả đạt được là ta có một môi trường phát triển đồng nhất.

Container thứ 2 là mysql, với nhiệm vụ tạo database phục vụ cho container myweb. Phần volumes đã bind thư mục ./mysql-data với thư mục /var/lib/mysql. Kết quả là ta có toàn bộ dữ liệu ở trên máy thật, đồng bộ với dữ liệu trong container.

Để khởi chạy các container này, ta chỉ cần chạy terminal:

1
$ docker-compose up

Docker sẽ kéo (pull) các images cần thiết về, sau đó tạo các container, setup các môi trường và chúng ta chỉ cần thay đổi các config phía trong file docker-compose.yml để áp dụng thay đổi mới.

Kết quả sau khi chạy terminal như sau:

 

Webserver đang chạy, ta có thể truy cập từ localhost:3000.

Còn rất nhiều thứ hay ho với Docker, mình sẽ trình bày tiếp ở các phần tiếp theo. Thân ái và quyết thắng!!!

Nhấn để đánh giá bài viết!
[Số đánh giá: 0 Trung bình: 0]

Có thể bạn quan tâm

Để lại bình luận