1. Trang chủ
  2. » Luận Văn - Báo Cáo

(Đồ án hcmute) phát triển công cụ ảo hóa mạng sử dụng phần mềm

122 0 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Phát Triển Công Cụ Ảo Hóa Mạng Sử Dụng Phần Mềm
Tác giả Trần Quang Hiệp, Nguyễn Quốc Hoan, Cao Thị Mai Trâm
Người hướng dẫn ThS. Nguyễn Đăng Quang
Trường học Trường Đại Học Sư Phạm Kỹ Thuật Thành Phố Hồ Chí Minh
Chuyên ngành Công Nghệ Thông Tin
Thể loại Đồ án tốt nghiệp
Năm xuất bản 2023
Thành phố Thành phố Hồ Chí Minh
Định dạng
Số trang 122
Dung lượng 7,56 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Cấu trúc

  • 1. Lý do chọn đề tài (21)
  • 2. Đối tượng nghiên cứu (21)
  • 3. Phạm vi nghiên cứu (21)
  • 4. Mục tiêu nghiên cứu (21)
  • CHƯƠNG I. LÝ THUYẾT (23)
    • 1. Docker là gì? (23)
      • 1.1. Khái niệm về Docker (23)
      • 1.2. Lịch sử ra đời của Docker (23)
        • 1.2.1. Deploy theo cách truyền thống (23)
        • 1.2.2. Deploy bằng ảo hóa (23)
        • 1.2.3. Deploy bằng Docker Container (24)
      • 1.3. Những thành phần chính của Docker (25)
        • 1.3.1. Docker Engine (25)
        • 1.3.2. Docker Registry/Docker Hub (25)
      • 1.4. Quy trình hoạt động của một hệ thống sử dụng Docker (26)
    • 2. Lợi ích và hạn chế của Docker (27)
      • 2.1. Những giá trị mà Docker mang lại (27)
      • 2.2. Khi nào nên sử dụng Docker (28)
      • 2.3. Những hạn chế của Docker (29)
    • 3. Khái niệm trong Docker và Cấu trúc của Docker (29)
      • 3.1. Một số khái niệm thường dùng trong Docker (29)
      • 3.2. Cấu trúc của Docker (30)
    • 4. Sự khác biệt giữa Docker và Hypervisors (31)
      • 4.1. Khái niệm Hypervisors (31)
      • 4.2. So sánh Docker và Hypervisors (31)
    • 5. Docker Image và Docker Container (32)
      • 5.1. Khái niệm Docker Image (32)
      • 5.2. Thao tác lệnh với Docker Image (33)
      • 5.3. Khái niệm Docker Container (35)
      • 5.4. Thao tác lệnh với Container (36)
        • 5.4.1. Nhóm các Command liên quan đến Lifecycle của Container (36)
        • 5.4.2. Nhóm các Command quản lý trạng thái của Container (37)
        • 5.4.3. Nhóm các Command hiển thị thông tin của Container (38)
        • 5.4.4. Nhóm các Command thực thi với Container (39)
    • 6. Docker file (40)
      • 6.1. Khái niệm Docker file (40)
      • 6.2. Cú pháp của một Docker file (41)
      • 6.3. Các chỉ thị chính trong Dockerfile (41)
    • 7. Docker Compose (46)
      • 7.1. Khái niệm về Docker Compose (46)
      • 7.2. Công dụng của Docker Compose (47)
      • 7.3. Một số tính năng chính của Docker compose (47)
      • 7.4. Cách sử dụng Docker Compose (47)
      • 7.5. Một số trường hợp thường gặp khi sử dụng Compose (48)
    • 8. Docker Hub (48)
      • 8.1. Khái niệm Docker Hub (48)
      • 8.2. Tính năng của Docker Hub (49)
    • 9. Docker Network (49)
      • 9.1. Khái niệm Docker Network (49)
      • 9.2. Các loại network drivers của Docker (50)
      • 9.3. Một vài cách sử dụng docker network (51)
        • 9.3.1. Khởi tạo một docker network (51)
        • 9.3.2. Sử dụng network khi chạy một container (51)
        • 9.3.3. Sử dụng network qua docker-compose (52)
        • 9.3.4. Sử dụng network trong cụm docker swarm (53)
  • CHƯƠNG II. ỨNG DỤNG (55)
    • 1. Lên ý tưởng (55)
      • 1.1. Phần giao diện (55)
      • 1.2. Về Docker (56)
    • 2. Thực hiện ý tưởng (56)
      • 2.1. Thiết kế giao diện (56)
        • 2.1.1. Thư viện hỗ trợ (56)
        • 2.1.2. Cấu trúc chương trình (59)
        • 2.1.3. Danh mục lớp sử dụng trong chương trình (59)
        • 2.1.4. Danh mục hàm sử dụng trong chương trình (60)
        • 2.1.5. Giao diện chương trình (64)
      • 2.2. Nghiên cứu về cách viết docker và thực nghiệm (74)
        • 2.2.1. Cài đặt Docker (74)
        • 2.2.2. Tạo Docker file (77)
        • 2.2.3. Tạo Docker Compose (80)
      • 2.3. Kết hợp và kiểm tra trên chương trình người dùng (85)
        • 2.3.1. Trường hợp 1: PC kết nối thông qua Router (cùng OS) (87)
        • 2.3.2. Trường hợp 2: PC kết nối thông qua Router (khác OS) (96)
        • 2.3.3. Trường hợp 3: PC kết nối LAN thông qua Switch (100)
        • 2.3.4. Trường hợp 4: PC kết nối Switch kết nối Router (103)
        • 2.3.5. Trường hợp 5: Người dùng nhập sai thông tin IP (110)
        • 2.3.6. Trường hợp 6: Người dùng nhập thiếu thông tin IP (114)
    • 1. Kết quả đạt được (116)
      • 1.1. Về phần lý thuyết (116)
      • 1.2. Về phần ứng dụng (116)
    • 2. Thuận lợi (116)
    • 3. Khó khăn (117)
    • 4. Nhận xét và đánh giá tổng quan (117)
    • 5. Đánh giá mức độ hoàn thành của thành viên (117)
      • 5.1. Trần Quang Hiệp (117)
      • 5.2. Nguyễn Quốc Hoan (117)
      • 5.3. Cao Thị Mai Trâm (118)
  • TÀI LIỆU THAM KHẢO (119)

Nội dung

Mục tiêu nghiên cứu

Hiểu rõ về định nghĩ Docker, Docker file, Docker Compose, Docker Hub, Docker Networking, nắm được cấu trúc file và các khái niệm, câu lệnh liên quan

Hiểu được cách thức hoạt động và sự liên kết giữa Docker file, Docker Compose, Docker Hub và Docker Networking

Sau khi hoàn thành các nội dung trên cần xây dựng được hệ thống mạng được tạo ra dựa trên Docker file, Docker Compose, Docker Hub và Docker Networking

LÝ THUYẾT

Docker là gì?

Docker is a platform designed for developers and sysadmins to develop, deploy, and run applications using containers It enables the creation of isolated environments, known as containers, for launching and developing applications When deploying to any server, simply running the Docker container allows the application to start instantly.

Docker là một nền tảng hoạt động ở tầng hệ điều hành, cho phép tối ưu hóa và cung cấp khả năng ảo hóa dịch vụ và ứng dụng một cách nhanh chóng.

Trước đây, triển khai ứng dụng bằng máy ảo tốn nhiều thời gian, nhưng với Docker, thời gian triển khai ứng dụng trong container đã được rút ngắn đáng kể.

1.2 Lịch sử ra đời của Docker

1.2.1 Deploy theo cách truyền thống

Ban đầu, các ứng dụng hoạt động trên máy chủ vật lý, nhưng việc không thể xác định ranh giới tài nguyên cho các ứng dụng dẫn đến nhiều sự cố trong việc phân bổ tài nguyên.

Khi nhiều ứng dụng hoạt động trên một máy chủ vật lý, có thể xảy ra tình trạng một ứng dụng chiếm ưu thế về tài nguyên, dẫn đến hiệu suất kém cho các ứng dụng còn lại.

Một giải pháp khả thi là chạy từng ứng dụng trên các máy chủ vật lý riêng biệt Tuy nhiên, cách này không hiệu quả do tài nguyên không được sử dụng tối ưu và gây tốn kém cho các tổ chức khi phải duy trì nhiều máy chủ vật lý.

1.2.2 Deploy bằng ảo hóa Ảo hóa ra đời như một giải pháp cho phương pháp truyền thống

Ảo hóa cho phép chạy nhiều máy ảo (VM) trên một CPU của máy chủ vật lý, giúp cô lập các ứng dụng giữa các VM và nâng cao mức độ bảo mật, vì thông tin của một ứng dụng không thể bị truy cập tự do bởi ứng dụng khác Công nghệ này tối ưu hóa việc sử dụng tài nguyên của máy chủ vật lý và cung cấp khả năng mở rộng tốt hơn, cho phép dễ dàng thêm hoặc cập nhật ứng dụng, từ đó giảm chi phí phần cứng và mang lại nhiều lợi ích khác.

Với ảo hóa, chúng ta có thể có một tập hợp các tài nguyên vật lý dưới dạng một cụm các máy ảo sẵn dùng

Mỗi VM là một máy tính chạy tất cả các thành phần, bao gồm cả hệ điều hành riêng của nó, bên trên phần cứng được ảo hóa

Container tương tự như máy ảo (VM) nhưng có tính cô lập cao hơn, cho phép chia sẻ hệ điều hành giữa các ứng dụng, khiến chúng trở nên nhẹ (lightweight) Mỗi container bao gồm hệ thống tệp, CPU, bộ nhớ và không gian tiến trình Khi tách rời khỏi cơ sở hạ tầng bên dưới, container có thể dễ dàng di chuyển (portable) giữa các dịch vụ đám mây hoặc các bản phân phối hệ điều hành khác nhau.

Docker là công cụ hữu ích cho mọi đối tượng, từ lập trình viên đến quản trị hệ thống, giúp tận dụng công nghệ container để xây dựng và kiểm tra ứng dụng nhanh chóng Nó cho phép người dùng đóng gói ứng dụng của mình và triển khai trên các nền tảng đám mây công cộng hoặc riêng tư một cách dễ dàng.

Tốc độ của Docker vô cùng nhẹ, nhanh chóng nên có thể tạo ra docker container chỉ trong vài giây

Docker cung cấp môi trường chạy và khả năng mở rộng tuyệt vời, cho phép chia nhỏ các chức năng của ứng dụng thành nhiều container độc lập Nhờ vào khả năng liên kết dễ dàng giữa các container, Docker giúp việc mở rộng và cập nhật các thành phần của ứng dụng trở nên linh hoạt và hiệu quả hơn.

Docker cung cấp tính bảo mật cho các ứng dụng chạy trong môi trường dùng chung Tuy nhiên, container không phải là giải pháp chuyên biệt để thực hiện các biện pháp bảo mật cần thiết.

Với xu hướng chuyển dịch dần sang microservices trong các hệ thống lớn, Docker đã trở thành một thành phần quan trọng trong nhiều công cụ DevOps.

1.3 Những thành phần chính của Docker

Docker Engine là thành phần chính của Docker, hoạt động như một công cụ để đóng gói ứng dụng Nó được xây dựng theo kiến trúc client-server và được cài đặt trên máy chủ (Host).

Docker Engine có 3 thành phần:

• Server: Docker Daemon dùng để tạo và quản lý các images, containers, networks, volumes

• Rest API: controller cho docker daemon, chỉ ra những gì docker daemon sẽ làm

Docker Client là công cụ cho phép người dùng giao tiếp với Docker host, tương tác thông qua các lệnh trong terminal (CLI) Nó sử dụng API để gửi lệnh đến Docker Daemon.

Có 5 đối tượng lớn trong thế giới của Docker Engine:

Docker Registry là dịch vụ máy chủ cho phép lưu trữ các docker image cho cá nhân, công ty hoặc nhóm Dịch vụ này có thể được cung cấp bởi tổ chức bên thứ ba hoặc được xây dựng nội bộ tùy thuộc vào nhu cầu của người sử dụng.

Một số dịch vụ Docker Registry phổ biến như:

1.4 Quy trình hoạt động của một hệ thống sử dụng Docker

Lợi ích và hạn chế của Docker

2.1 Những giá trị mà Docker mang lại

Tốc độ: Docker Containers tương đối nhẹ và có tốc độ rất nhanh Hoàn toàn có thể tạo và khởi chạy chỉ trong vài giây ngắn ngủi

Môi trường chạy và khả năng mở rộng của ứng dụng được cải thiện nhờ việc chia nhỏ các chức năng thành các container riêng lẻ Chẳng hạn, cơ sở dữ liệu có thể chạy trên một container, trong khi Redis cache hoạt động trên một container khác, và ứng dụng Node.js thì chạy trên một container riêng Với Docker, việc liên kết các container để hình thành một ứng dụng trở nên đơn giản, giúp dễ dàng mở rộng và cập nhật các thành phần một cách độc lập.

Container cho phép xây dựng và loại bỏ nhanh chóng hơn so với máy ảo, giúp duy trì không gian làm việc gọn gàng hơn bằng cách xóa các môi trường không còn ảnh hưởng đến các phần khác.

Thiết lập môi trường làm việc trở nên dễ dàng với chỉ một lần cấu hình duy nhất, giúp bạn không phải cài đặt lại các dependencies Khi có sự thay đổi máy tính hoặc khi có thành viên mới tham gia vào dự án, chỉ cần chia sẻ cấu hình đó để họ có thể nhanh chóng bắt đầu làm việc.

Dễ dàng áp dụng cho mọi đối tượng, từ lập trình viên đến quản trị hệ thống, công nghệ này tận dụng tối đa lợi ích của containers để xây dựng và kiểm tra ứng dụng nhanh chóng Người dùng có thể đóng gói ứng dụng trên laptop và triển khai trên cả đám mây công cộng lẫn đám mây riêng Một câu thần chú quan trọng là “Build once, run anywhere”.

2.2 Khi nào nên sử dụng Docker

Phát triển các ứng dụng, dịch vụ yêu cầu cài đặt quá nhiều thứ liên quan, hoặc có version không tương thích với máy chủ hiện tại

Khi có nhu cầu scale, mở rộng linh hoạt để đáp ứng nhanh Ví dụ như bật/tắt nhanh các container để hỗ trợ tăng tải cho hệ thống

Rất phù hợp với Microservices Chắc chắn rằng chúng ta sẽ không muốn chạy từng service nhỏ lên và cấu hình chúng bằng tay

Tăng tốc, hỗ trợ CI/CD tốt hơn Vì lúc này automation server chỉ cần quan tâm Docker thay vì lại phải cài đặt đủ thứ vào

Docker cho phép dễ dàng thay đổi và di chuyển ứng dụng nhờ vào việc mọi thứ được đóng gói trong container Bên cạnh đó, Docker còn hỗ trợ version control cho các Image, giúp người dùng dễ dàng nâng cấp hoặc hạ cấp phiên bản ứng dụng một cách thuận tiện.

An toàn hơn vì mỗi container là một môi trường hoàn toàn độc lập với bên ngoài

2.3 Những hạn chế của Docker

Docker không phải là một giải pháp hoàn hảo, vì nó chỉ hoạt động trên nền tảng Linux 64bit và phụ thuộc vào các tính năng như cgroup và namespaces Do đó, Docker không thể chạy trên hệ điều hành Linux 32bit hoặc Windows, đặc biệt là với phiên bản CE.

Sử dụng container đồng nghĩa với việc chia sẻ kernel của hệ điều hành Nếu chúng ta tải về một image có sẵn chứa các công cụ kiểm soát kernel, server có thể rơi vào tình trạng mất kiểm soát hoàn toàn.

Khi tiến trình chạy container bị dừng, dữ liệu sẽ bị mất hoàn toàn trừ khi được mount hoặc sao lưu, điều này có thể gây ra những bất tiện không nhỏ.

Tuy nhiên Docker nói riêng hay Containerization nói chung vẫn sẽ là tương lai và là xu hướng chung của hầu hết các doanh nghiệp trên toàn thế giới.

Khái niệm trong Docker và Cấu trúc của Docker

3.1 Một số khái niệm thường dùng trong Docker

Docker Client: là cách mà chúng ta 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

A Docker Registry is a private storage solution for Docker Images, where users can push images to the registry and clients can pull them as needed Users have the option to utilize a private registry or choose from public registries provided by major cloud providers such as AWS, Google Cloud, and 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 mình 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 Ví dụ: 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

Docker Compose là công cụ giúp chạy ứng dụng với nhiều Docker containers một cách dễ dàng Nó cho phép cấu hình các lệnh trong file docker-compose.yml để sử dụng lại, và đã có sẵn khi cài đặt Docker.

Docker Swarm là công cụ clustering gốc cho Docker, cho phép kết hợp nhiều Docker host thành một cụm (cluster) và hoạt động như một máy chủ Docker ảo duy nhất Nó hỗ trợ việc tạo và quản lý các container cũng như các hệ thống Container Orchestration.

Docker Services are essential components in production, managing containers effectively Each service runs a single image but encodes the execution parameters, such as the ports used and the number of container replicas required to ensure optimal performance and immediate responsiveness.

Docker sử dụng kiến trúc client-server:

• Docker server (hay còn gọi là daemon) sẽ chịu trách nhiệm build, run, distribute Docker container

The Docker client and Docker server can reside on the same server or on different servers, communicating through a REST API utilizing UNIX sockets or network interfaces.

Docker daemon (dockerd) là thành phần cốt lõi, chịu trách nhiệm lắng nghe các yêu cầu API và quản lý các đối tượng Docker Nó cũng có khả năng giao tiếp với Docker daemon trên các máy chủ khác.

Docker client (docker) là công cụ chính để người dùng tương tác với Docker Khi người dùng thực hiện lệnh “docker run image ABC”, họ đang sử dụng giao diện dòng lệnh (CLI) để gửi yêu cầu đến Docker thông qua API, và sau đó Docker daemon sẽ tiếp tục xử lý yêu cầu đó.

• Docker client: có thể giao tiếp và gửi request đến nhiều Docker daemon

• Docker registry: là một kho chứa các Image Nổi tiếng nhất chính là Docker Hub, ngoài ra có thể tự xây dựng một Docker registry cho riêng mình

• Docker object: Các object này chính là các đối tượng mà chúng ta thường xuyên gặp phải khi sử dụng Docker gồm có:

- Images là một template read-only sử dụng để chạy container

Một image có thể được xây dựng dựa trên một image khác Chẳng hạn, khi muốn tạo một image cho nginx, cần phải có hệ điều hành Linux Ubuntu chạy trước Do đó, image nginx sẽ phải dựa trên image của Ubuntu.

- Hoàn toàn có thể tự build image cho riêng mình hoặc tải các image có sẵn của người khác trên Docker registry

A container runs based on a specific image, allowing users to create, start, stop, move, and delete containers Additionally, containers can be interconnected, storage can be attached, and it is possible to create a new image from the current state of a container.

- Container cô lập tài nguyên với host và các container khác.

Sự khác biệt giữa Docker và Hypervisors

Hypervisor là phần mềm giám sát máy ảo, quản lý một hoặc nhiều máy ảo (VM) bằng cách tạo, khởi động, dừng và reset chúng Nó cho phép mỗi VM, hay còn gọi là "guest", truy cập vào tài nguyên phần cứng vật lý như CPU, RAM và lưu trữ.

4.2 So sánh Docker và Hypervisors

Bảng 4.1 So sánh Docker và Hypervisor

Kích thước (dung lượng) lớn Kích thước (dung lượng) nhỏ

Hiệu suất hạn chế Hiệu suất gốc (native)

Mỗi máy ảo sẽ có một hệ điều hành riêng

Container sẽ sử dụng hệ điều hành của host Ảo hóa về mặt phần cứng Ảo hóa về mặt hệ điều hành

Thời gian khởi động được đo bằng phút và mili giây, cho thấy sự khác biệt rõ rệt trong tốc độ khởi động Hệ thống cũng phân bổ bộ nhớ theo nhu cầu cần thiết, giúp tối ưu hóa hiệu suất và yêu cầu ít dung lượng bộ nhớ hơn.

Hoàn toàn bị cô lập và an toàn hơn Cô lập ở mức tiến trình, có thể kém an toàn hơn

Docker Image và Docker Container

Docker image là một file bất biến - không thay đổi, chứa các source code, libraries, dependencies, tools và các files khác cần thiết cho một ứng dụng để chạy

Do tính chất read-only, các images thường được gọi là snapshots, đại diện cho một ứng dụng và môi trường ảo tại một thời điểm cụ thể Tính nhất quán này là một trong những tính năng nổi bật của Docker, giúp các developers kiểm tra và thử nghiệm phần mềm trong điều kiện ổn định và đồng nhất.

Hình ảnh chỉ là các mẫu không thể khởi động hoặc chạy trực tiếp; thay vào đó, chúng ta sử dụng chúng làm cơ sở để xây dựng một container Container thực chất là một hình ảnh đang hoạt động, và khi tạo container, một lớp có thể ghi sẽ được thêm vào, cho phép chúng ta sửa đổi hình ảnh bất biến ban đầu.

Docker image bao gồm nhiều layer khác nhau, mỗi layer đều có nguồn gốc từ layer trước đó Các image layer này đại diện cho các file chỉ đọc, và khi khởi động một môi trường ảo, chúng sẽ chứa thêm các container layer.

5.2 Thao tác lệnh với Docker Image

- Hiển thị list images đang có Để hiển thị list các Image đang có, ta sử dụng lệnh với cấu trúc sau: docker images [OPTIONS] docker image ls [OPTIONS]

Khi chạy một trong hai command trên sẽ hiển thị list các image có trong Docker host

REPOSITORY TAG IMAGE ID CREATED SIZE huytm/httpd 1.0 aea3873b1da1 7 minutes ago 458MB huytm/httpd 2.0 aea3873b1da1 7 minutes ago 458MB

REPOSITORY: là kho chứa của một Image Image này có thể có nhiều TAG

TAG: TAG có thể hiểu là version của Image cũng được

IMAGE ID: ID của Image

CREATED: Thời gian tạo Image

SIZE: Dung lượng của Image

- Tải một image về từ Registry

Tải một image về từ Registry (Mặc định là DockerHub) docker image pull [OPTIONS] NAME[:TAG|@DIGEST]

Ví dụ: “docker image pull centos”

- Đẩy một image lên Registry Đẩy một image về lên Registry (Mặc định là DockerHub) docker image push [OPTIONS] NAME[:TAG]

Ví dụ đẩy một image lên DockerHub

Trước hết chúng ta phải tạo một tài khoản của DockerHub Tiếp theo là tên Image phải bắt đầu bởi tên tài khoản DockerHub (Chẳng hạn huytm/centost_httpd )

“docker image push huytm/centos_httpd:1.0”

Nhập username / password của DockerHub và đợi một chút để image được đẩy lên Kết quả như sau:

Hình 5.2 Push Image lên Docker Hub

To display the details of an image, use the command with the following syntax: `docker inspect [OPTIONS] IMAGE` or `docker image inspect [OPTIONS] IMAGE`.

Ví dụ: “docker inspect my_image”

- Hiển thị lịch sử của image

Hiển thị lịch sử của image, ta dùng câu lệnh với cú pháp sau: docker image history [OPTIONS] IMAGE

Ví dụ: docker image history my_image docker image history my_image:

- Tạo một Image TAG mới

Tạo một Image có TAG mới từ một Image đang có

15 docker image tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

Ví dụ: “docker image tag my-image:TAG1 my-image:TAG2”

- Save một image thành môt file tar

To save an image as a tar file, use the command `docker image save [OPTIONS] IMAGE [IMAGE ]` This file will contain the layers used to create the image, along with data files in json format.

Ví dụ: “docker image save -o /opt/my_image_file.tar my_image”

- Tạo lại image bằng việc load lại file tar

Sử dụng file tar vừa save được ở câu lệnh docker save để tạo lại một image docker image load [OPTIONS]

Ví dụ: “docker image load -i my_image_file.tar “

Xóa một hoặc nhiều image docker rmi [OPTIONS] IMAGE [IMAGE ] docker image rm [OPTIONS] IMAGE [IMAGE ]

Ví dụ: “docker image rm my_image “

Docker container là môi trường thực thi cho phép người dùng chạy các ứng dụng độc lập Những container này rất nhẹ, giúp việc triển khai và vận hành ứng dụng trở nên nhanh chóng và dễ dàng.

Một trong những tính năng quan trọng của container là khả năng đảm bảo tính chính xác khi chạy ứng dụng Tính năng này không chỉ giúp ứng dụng hoạt động nhất quán trong các môi trường tương tự mà còn đơn giản hóa quy trình cài đặt và chia sẻ cấu hình giữa các thành viên trong đội ngũ.

Container hoạt động độc lập, đảm bảo không gây ảnh hưởng xấu đến các container khác và server mà nó đang chạy Docker được xem là công cụ tạo ra sự độc lập cho các ứng dụng.

16 tuyệt vời" Vì vậy, sẽ không cần lo lắng việc máy tính bị xung đột do ứng dụng đang được phát triển được chạy trong container

Container khác với máy ảo (VM) ở chỗ nó chỉ ảo hóa tại lớp ứng dụng (app level), trong khi máy ảo thực hiện ảo hóa ở tầng phần cứng (hardware level).

1 máy, chia sẻ kernel và giả môi trường để chạy process độc lập Điều này làm cho container cực kỳ nhẹ, không chiếm nhiều tài nguyên của máy

5.4 Thao tác lệnh với Container

5.4.1 Nhóm các Command liên quan đến Lifecycle của Container

- Hiển thị list các container

Hiển thị list danh sách các container đang được Docker quản lý docker ps [OPTIONS] docker container ls [OPTIONS]

Ví dụ list các container đang chạy (Up): “docker ps”

Ví dụ list tất cả các container: “docker ps -a”

Tạo mới một container nhưng không start docker create [OPTIONS] IMAGE [COMMAND] [ARG ] docker container create [OPTIONS] IMAGE [COMMAND] [ARG ]

Ví dụ: “docker create -itd centos”

Tạo mới một container và start container đó luôn docker run [OPTIONS] IMAGE [COMMAND] [ARG ] docker container run [OPTIONS] IMAGE [COMMAND] [ARG ]

Ví dụ: “docker run -itd centos”

- Xóa container docker rm [OPTIONS] CONTAINER [CONTAINER ] docker container rm [OPTIONS] CONTAINER [CONTAINER ]

Ví dụ xóa một container đã stop: “docker rm my-container”

Ví dụ xóa một container chưa stop: “docker rm -f my-container”

Ví dụ xóa tất cả các container: “docker rm -f $(docker ps -aq)”

5.4.2 Nhóm các Command quản lý trạng thái của Container

- Start container docker start [OPTIONS] CONTAINER [CONTAINER ] docker container start [OPTIONS] CONTAINER [CONTAINER ]

Ví dụ: “docker start my-container”

- Stop container docker stop [OPTIONS] CONTAINER [CONTAINER ] docker container stop [OPTIONS] CONTAINER [CONTAINER ]

Ví dụ: “docker stop my-container”

- Restart container docker restart [OPTIONS] CONTAINER [CONTAINER ] docker container restart [OPTIONS] CONTAINER [CONTAINER ]

Ví dụ: “docker restart my-container”

- Pause container docker pause CONTAINER [CONTAINER ] docker container pause CONTAINER [CONTAINER ]

Ví dụ: “docker pause my-container”

Tiếp tục lại một container đang tạm dừng docker unpause CONTAINER [CONTAINER ] docker container unpause CONTAINER [CONTAINER ]

Ví dụ: “docker unpause my-container”

Kill một hoặc nhiều container (Kill ở đây giống như stop, container chỉ bị stop chứ không mất đi) docker kill [OPTIONS] CONTAINER [CONTAINER ] docker container kill [OPTIONS] CONTAINER [CONTAINER ]

Ví dụ: “docker kill my-container”

5.4.3 Nhóm các Command hiển thị thông tin của Container

Hiển thị log của container docker logs [OPTIONS] CONTAINER docker container logs [OPTIONS] CONTAINER

Ví dụ: “docker logs my-container”

- Hiển thị thông tin container

Hiển thị thông tin chi tiết của container docker inspect [OPTIONS] CONTAINER [CONTAINER ] docker container inspect [OPTIONS] CONTAINER [CONTAINER ]

Ví dụ: “docker inspect my-container”

- Hiển thị tài nguyên của contaier

Hiển thị tài nguyên đang sử dụng của contaier docker stats [OPTIONS] [CONTAINER ] docker container stats [OPTIONS] [CONTAINER ]

Ví dụ: “docker stats my-container”

- Hiển thị các tiến trình đang chạy trong container

Hiển thị các tiến trình đang chạy trong container docker top CONTAINER [ps OPTIONS] docker container top CONTAINER [ps OPTIONS]

Ví dụ: “docker top my-container”

- Hiển thị các port được map

Hiển thị các port mapping hoặc một port mapping cụ thể docker port CONTAINER [PRIVATE_PORT[/PROTO]] docker container port CONTAINER [PRIVATE_PORT[/PROTO]]

Ví dụ: “docker port my-container”

- Hiển thị các thay đổi về filesystem trong container

Hiển thị các thay đổi về filesystem trong container từ lúc create container docker diff CONTAINER docker container diff CONTAINER

Ví dụ: “docker diff my-container”

5.4.4 Nhóm các Command thực thi với Container

Attach một màn hình cho phép nhập input và hiển thị output đối với một container đang chạy docker attach [OPTIONS] CONTAINER docker container attach [OPTIONS] CONTAINER

Ví dụ: “docker attach my-container”

- Thực thi một câu lệnh trong container

Thực thi một câu lệnh trong container đang chạy docker exec [OPTIONS] CONTAINER COMMAND [ARG ] docker container exec [OPTIONS] CONTAINER COMMAND [ARG ]

Ví dụ: “docker exec my-container free -m”

Update resource cho container, mở rộng, limit tài nguyên cho container docker update [OPTIONS] CONTAINER [CONTAINER ]

Ví dụ: “docker update -m 512M memory-swap 1024M my-container”

- Copy file giữa host và container

Copy file giữa Docker host và container docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH docker container cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH

• docker cp my-container:/opt/myfile /opt/

• docker cp myfile1.txt my-container:/opt/

- Đổi tên container docker rename CONTAINER NEW_NAME docker container rename CONTAINER NEW_NAME

Ví dụ: “docker rename my-container my-container1”

- Export toàn bộ filesystem trong container

Export toàn bộ filesysystem trong container thành một file tar docker export [OPTIONS] CONTAINER docker container export [OPTIONS] CONTAINER

Ví dụ: “docker export -o huytm.tar my-container”

- Tạo một image từ container đang chạy docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

Ví dụ: “docker container commit my-container my_new_image”

Docker file

Nó định nghĩa chi tiết image bao gồm những gì để từ đó Docker có thể xác định build image đó như thế nào

Dockerfile là một tệp văn bản không có phần mở rộng, mang tên Dockerfile, chứa các lệnh cần thiết được sắp xếp theo thứ tự để xây dựng một image Các lệnh trong Dockerfile sẽ được thực thi từ trên xuống dưới.

6.2 Cú pháp của một Docker file

Cú pháp chung của một Dockerfile có dạng: INSTRUCTION arguments

Các chỉ thị trong Dockerfile được gọi là INSTRUCTION, mỗi chỉ thị thực hiện một nhiệm vụ cụ thể theo quy định của Docker Khi khai báo các chỉ thị này, cần phải viết bằng chữ IN HOA.

• Một Dockerfile bắt buộc phải bắt đầu bằng chỉ thị FROM để khai báo đâu là image sẽ được sử dụng làm nền để xây dựng nên image

• Arguments là phần nội dung của các chỉ thị, quyết định chỉ thị sẽ làm gì

6.3 Các chỉ thị chính trong Dockerfile

Specify which image will serve as the base image for executing subsequent build commands These base images can be downloaded from either a Public Repository or an individual's Private Repository, depending on the setup.

FROM [:] [AS ]

FROM [@] [AS ]

Chỉ thị FROM là bắt buộc và phải được để lên phía trên cùng của Dockerfile

Chỉ thị LABEL trong Docker được sử dụng để thêm thông tin meta vào hình ảnh Docker trong quá trình xây dựng, với định dạng các cặp key - value được lưu trữ dưới dạng chuỗi.

Docker Image cho phép chỉ định nhiều label, với mỗi cặp key - value phải là duy nhất Nếu một key được khai báo với nhiều giá trị, giá trị gần nhất sẽ ghi đè lên giá trị trước đó.

LABEL = = = =

Chúng ta có thể khai báo metadata cho Image theo từng dòng chỉ thị hoặc có thể tách ra khai báo thành từng dòng riêng biệt

LABEL com.example.some-label="lorem"

LABEL version="2.0" description="Lorem ipsum dolor sit amet, consectetur adipiscing elit."

Chỉ thị MAINTAINER dùng để khai báo thông tin tác giả người viết ra file Dockerfile

MAINTAINER HoanNQ

Hiện nay, tài liệu chính thức từ Docker cho thấy việc sử dụng MAINTAINER đang dần được thay thế bằng LABEL maintainer LABEL maintainer mang lại tính linh hoạt hơn, cho phép không chỉ thông tin về tên và email của tác giả mà còn có thể thêm nhiều thông tin tùy chọn khác thông qua các thẻ metadata Thông tin này cũng dễ dàng được truy xuất bằng câu lệnh docker inspect.

LABEL maintainer="namduong3699@gmail.com"

Chỉ thị RUN trong Dockerfile được sử dụng để thực hiện các lệnh trong quá trình xây dựng image, thường là các lệnh Linux Các lệnh này phụ thuộc vào image gốc được chỉ định trong phần FROM; ví dụ, để cập nhật hệ thống trên Ubuntu, ta sử dụng RUN apt-get update -y, trong khi trên CentOS, lệnh sẽ là RUN yum update -y Kết quả của các lệnh này sẽ được commit lại và được sử dụng trong các bước tiếp theo của Dockerfile.

RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'

RUN ["/bin/bash", "-c", "echo hello"] Ở cách thức shell form chúng ta có thể thực hiện nhiều câu lệnh cùng một lúc với dấu \: FROM ubuntu

RUN apt-get install curl -y hoặc

RUN apt-get update; / apt-get install curl -y

The ADD directive allows for the copying of files and directories from the build machine or remote file URLs specified in the source, integrating them into the filesystem of the destination image.

ADD [ chown=:]

ADD [ chown=:] ["", ""]

Trong đó: src có thể khai báo nhiều file, thư mục, dest phải là đường dẫn tuyệt đối hoặc có quan hệ chỉ thị đối với WORKDIR

Chúng ta cũng có thể phân quyền vào các file/thư mục mới được copy:

ADD chownU:mygroup files* /somedir/

ADD chown=bin files* /somedir/

Chỉ thị COPY cũng giống với ADD là copy file, thư mục từ và thêm chúng vào

của container Khác với ADD, nó không hỗ trợ thêm các file remote file URLs từ các nguồn trên mạng

COPY [ chown=:]

COPY [ chown=:] ["", ""]

Chỉ thị ENV trong Dockerfile được sử dụng để khai báo các biến môi trường dưới dạng cặp key - value Các giá trị này sẽ có sẵn cho các chỉ thị tiếp theo trong Dockerfile, giúp quản lý và cấu hình môi trường một cách hiệu quả.

ENV USERNAME="namdh" PASSWORD="secret"

Ngoài ra cũng có thể thay đổi giá trị của biến môi trường bằng câu lệnh khởi động container: docker run env =

ENV chỉ được sử dụng trong các command sau:

Chỉ thị CMD xác định các lệnh sẽ thực thi sau khi container khởi động từ image đã được xây dựng Mặc dù có thể khai báo nhiều lệnh, nhưng chỉ lệnh CMD cuối cùng sẽ được thực hiện.

Có tác dụng set username hoặc UID để sử dụng khi chạy image và khi chạy các lệnh có trong RUN, CMD, ENTRYPOINT sau nó

RUN useradd -ms /bin/bash namdh

Docker Compose

7.1 Khái niệm về Docker Compose

Quản lý Docker trong một hệ thống lớn với nhiều container khác nhau có thể rất phức tạp và dễ phát sinh lỗi trong quá trình vận hành Để giải quyết những vấn đề này, Docker Compose đã được phát triển.

Docker Compose là công cụ giúp định nghĩa và quản lý các ứng dụng Docker với nhiều container Bằng cách sử dụng file YAML, người dùng có thể thiết lập các dịch vụ cần thiết cho ứng dụng Chỉ với một lệnh, người dùng có thể tạo và khởi động tất cả các dịch vụ từ các cấu hình đã định nghĩa.

Docker Compose đơn giản hóa quá trình thiết lập các ứng dụng yêu cầu kết nối giữa nhiều Docker Container Chỉ cần tạo một tệp cấu hình YAML và sử dụng một câu lệnh duy nhất để khởi động container, kết nối với các dịch vụ trong các container khác nhau.

Không giống như Dockerfile (build các image) Docker compose dùng để build và run các container Các thao tác của docker-compose tương tự như lệnh: docker run

Docker compose cho phép tạo nhiều service(container) giống nhau bằng lệnh:

$ docker-compose scale =

7.2 Công dụng của Docker Compose

Compose cho phép tạo ra nhiều môi trường độc lập trong một host, giúp cô lập các project để tránh xung đột và dễ dàng tạo bản sao của bất kỳ môi trường nào.

Chỉ tạo lại các container đã thay đổi, Compose sẽ nhận diện các service không thay đổi và tái sử dụng các container tương ứng Ngoài ra, cần điều chỉnh các biến sử dụng cho các môi trường, giúp Compose hoạt động hiệu quả hơn.

Tệp Compose cho phép tùy chỉnh các biến cho các môi trường và người dùng khác nhau, giúp thiết lập các dịch vụ một cách linh hoạt khi sử dụng Compose.

7.3 Một số tính năng chính của Docker compose

Thiết lập, cấu hình nhiều môi trường hoàn toàn độc lập với nhau trên 1 máy chủ

Bảo lưu các phân vùng bộ nhớ khi container được tạo ra

Chỉ nên tạo lại container khi có sự thay đổi trong cấu hình, đồng thời giữ lại dữ liệu của container Để tùy chỉnh cho các môi trường khác nhau như dev và production, cần định nghĩa các biến Variable trong file YAML.

7.4 Cách sử dụng Docker Compose

Sử dụng Compose thường có ba bước sau:

Bước 1: Khai báo các môi trường của chương trình trong Dockerfile

Bước 2: Khai báo các service cần thiết cho chương trình trong file docker-compose.yml để các service có thể chạy cùng với nhau trong một môi trường

Bước 3: Chạy câu lệnh docker-compose up để start Compose và chạy chương trình Compose có những câu lệnh cho phép quản lí lifecycle của chương trình:

• Start, Stop và Build lại service

• Xem status của các service đang chạy

• Xem log output của service đang chạy

• Chạy câu lệnh một lần (one-off command) trong một service

7.5 Một số trường hợp thường gặp khi sử dụng Compose

Compose có thể được sử dụng cho nhiều trường hợp Dưới đây sẽ là hai trường hợp sử dụng Compose trong việc phát triển chương trình

Khi phát triển chương trình, việc chạy trong môi trường cô lập và tương tác là rất quan trọng Compose hỗ trợ thiết lập và khởi động tất cả các dịch vụ cần thiết cho chương trình Chỉ với một câu lệnh "docker-compose up", các dịch vụ sẽ được khởi động cùng với các container tương ứng.

Môi trường cho automated test

Với việc sử dụng automated test, việc thiết lập môi trường cho các gói test trở nên dễ dàng nhờ vào Compose Chỉ cần một dòng lệnh để tạo, chạy các gói test và hủy bỏ môi trường.

$ /run_tests (Chạy gói automated test)

Docker Hub

Docker Hub là một dịch vụ do Docker cung cấp, cho phép tìm kiếm và chia sẻ các container images

8.2 Tính năng của Docker Hub

Các tính năng chính của Docker Hub là:

• Repositories: Push và pull container images

• Teams & Organizations: Quản lý quyền truy cập vào private repositories của container images

• Official Images: Pull sử dụng container images chất lượng cao của Docker

• Publisher Images: Pull và sử dụng container images được cung cấp bởi vendors khác

• Builds: Tự động tạo container images từ GitHub và Bitbucket Push chúng lên Docker Hub

• Webhooks: Kích hoạt các actions sau khi push thành công một repository lên Docker Hub với các dịch vụ khác.

Docker Network

Docker network đóng vai trò quan trọng trong việc kết nối các container với nhau, kết nối giữa container và bên ngoài, cũng như kết nối giữa các cụm (swarm) của các container Docker.

9.2 Các loại network drivers của Docker

Hệ thống mạng Docker là một hệ thống có khả năng mở rộng và sử dụng các driver để kết nối Đa số các driver được cung cấp sẵn, đảm bảo các chức năng cơ bản cho các tác vụ mạng thông thường.

Docker network có thể cung cấp hầu hết các chức năng mà một hệ thống mạng bình thường cần có

• BRIDGE Đây là driver mạng default của Docker Nếu không chỉ định driver thì bridge sẽ là driver mạng mặc định khi khởi tạo

Khi chúng ta cài đặt Docker, virtual bridge docker0 sẽ được tạo ra, docker tìm một subnet chưa được dùng trên host và gán một địa chỉ cho docker0

Mạng Bridge thường được sử dụng để chạy các ứng dụng dưới dạng container độc lập cần giao tiếp với nhau Các container trong cùng một mạng có thể giao tiếp qua địa chỉ IP Do Docker không nhận diện host trong mạng này, việc kết nối giữa các service cần sử dụng tùy chọn links để Docker hiểu địa chỉ của chúng.

Bridge là driver tốt nhất cho việc giao tiếp multiple containers ở một host đơn

Container sử dụng mạng của máy chủ để giao tiếp trực tiếp với host, giúp loại bỏ lớp mạng giữa container và Docker Host Điều này phù hợp khi cần kết nối từ container ra ngoài host một cách hiệu quả.

Mạng lớp phủ (Overlay network) tạo ra một mạng phân tán giữa nhiều máy chủ Docker, kết nối các Docker daemons và cho phép các cụm dịch vụ giao tiếp hiệu quả Nó hỗ trợ việc giao tiếp giữa các cụm dịch vụ với một container độc lập hoặc giữa hai container trên các máy chủ Docker khác nhau.

Overlay network giúp loại bỏ nhu cầu thiết lập routing giữa các container thông qua hệ điều hành, tạo ra một lớp phủ trên mạng của máy chủ.

Docker cho phép các container kết nối với nhau một cách bảo mật, bao gồm cả các cụm containers Nó đảm bảo rằng các gói tin được định tuyến chính xác đến và đi từ container đích.

Mạng Macvlan cho phép gán địa chỉ MAC cho container, khiến mỗi container hoạt động như một thiết bị vật lý trong mạng Docker daemon định tuyến truy cập đến container thông qua địa chỉ MAC Việc sử dụng driver macvlan là lựa chọn tối ưu khi các ứng dụng khác cần kết nối theo địa chỉ vật lý thay vì thông qua các lớp mạng của máy chủ.

Khi sử dụng container mà không cần kết nối mạng hoặc muốn vô hiệu hóa tất cả các kết nối mạng, chúng ta sẽ chọn driver này Driver này thường được áp dụng cho mạng tùy chỉnh và không thể sử dụng trong cụm swarm.

9.3 Một vài cách sử dụng docker network

9.3.1 Khởi tạo một docker network

$ docker network create [OPTIONS] NETWORK

$ docker network create -d bridge my-bridge-network

The options -d specify the driver, and to create an overlay network, you can use -d overlay Additionally, there are many options available that can be added based on the level of customization required.

gateway: Địa chỉ Ip của Gateway (IPv4 hay IPv6) cho mạng con

ip-range: Xác định một dải IPs sử dụng trong mạng

internal: Hạn chế access từ bên ngoài vào mạng

9.3.2 Sử dụng network khi chạy một container

Sử dụng option network để chạy một container trên network bridge đó docker run network=bridge -itd name=container1 normal-app:dev

9.3.3 Sử dụng network qua docker-compose

Khi dùng docker-compose thì nếu không khai báo network, docker sẽ tự động khởi tạo một mạng dành cho app và driver sẽ là bridge

Creating network "api_default" with the default driver

Lúc này kiểm tra danh sách network sẽ có network mà docker-compose vừa tạo

NETWORK ID NAME DRIVER SCOPE

4bdb10fc8926 api_default bridge local

125591bf59af none null local bd9d957fec97 normalapp_default bridge local

Và khi dừng app thì docker sẽ xóa mạng này

Stopping api_redis-api_1 done

Removing api_redis-api_1 done

Nếu muốn khai báo mạng cho từng containers trong một cụm chúng ta có thể dùng 2 cách sau:

• Khai báo driver host cho container app qua network_mode, cách khai báo này có thể thay đổi driver cho container

Trường hợp chúng ta muốn app sử dụng luôn mạng của host mà không dùng mạng docker, hãy khai báo như sau: services: app: network_mode: host

• Khai báo qua networks trong docker-compose.yml

networks: api-net: driver: host

9.3.4 Sử dụng network trong cụm docker swarm

Docker Swarm commonly utilizes the docker-compose.yml file for deployment, where it is essential to select the overlay network to enable Docker to connect multiple host networks seamlessly.

networks: api-net: driver: overlay

$ docker network rm my-bridge-network

ỨNG DỤNG

Lên ý tưởng

Docker cho phép đóng gói và chạy ứng dụng trong môi trường cô lập gọi là Container, giúp đảm bảo sự cô lập và bảo mật Điều này cho phép nhiều Container có thể hoạt động đồng thời trên một máy chủ nhất định.

Container nhẹ và hoạt động trực tiếp từ nhân máy chủ, cho phép chạy nhiều Container hơn trên cùng một hệ thống phần cứng so với máy ảo (VM) Ngoài ra, Docker Container cũng có thể được triển khai trong môi trường máy ảo.

Docker là giải pháp lý tưởng cho môi trường có mật độ triển khai vừa và nhỏ, giúp tối ưu hóa việc sử dụng tài nguyên Nó cũng mang đến một lựa chọn tiết kiệm chi phí và hiệu quả hơn so với các máy ảo dựa trên hypervisor.

Nhóm chúng em đã phát triển một giao diện thân thiện với người dùng, cho phép người dùng vẽ hệ thống mạng cơ bản theo nhu cầu của mình Với sự gọn nhẹ và tiện lợi của Docker, hệ thống sẽ tự động xuất ra các file cần thiết, giúp người dùng chỉ cần chạy file docker compose dưới dạng yaml để thiết lập mạng mà không cần cài đặt nhiều VM Để thực hiện ý tưởng này, nhóm chia thành hai giai đoạn chính.

Giao diện FE sẽ được thiết kế đơn giản nhưng vẫn đảm bảo đầy đủ các thiết bị và chức năng cần thiết Nó sử dụng công nghệ web với mã nguồn được viết bằng ngôn ngữ JavaScript.

Giao diện hiển thị trên màn hình sẽ chia làm 2 phần chính:

- Sidebar: là menu chứa các chức năng chính của màn hình

New Object: Thêm thiết bị bao gồm Router, End-device

Delete all object: Xóa tất cả các thiết bị đã thêm vào màn hình

Export: Xác nhận mô hình xuất tập tin nén và tự động download về máy

- ScreenCanvas: là khung hiển thị sơ đồ mô hình mạng

Khung hiển thị được thiết kế theo kiểu grid layout, giúp người dùng dễ dàng căn chỉnh vị trí của thiết bị trên sơ đồ

Dưới góc phải màn hình có khung điều chỉnh zoom in, zoom out, cố định màn hình và quay về trung tâm vị trí thiết bị

Mini map ở góc trái màn hình giúp người dùng xác định vị trí của các thiết bị ngoài màn hình hiển thị, ngăn chặn tình trạng thiết bị bị ẩn trong khu vực điểm mù dưới Sidebar, từ đó đảm bảo người dùng dễ dàng tìm thấy thiết bị cần thiết.

Nghiên cứu về cách viết và cơ chế hoạt động của docker file và docker compose

Xây dựng các trường hợp với từng loại mô hình, xây dựng các lệnh đối với từng hệ điều hành trên end-device và kiểm thử hệ thống.

Thực hiện ý tưởng

Giao diện web được phát triển bằng ReactJS, một thư viện mã nguồn mở do Facebook xây dựng ReactJS giúp tạo ra các ứng dụng web hấp dẫn, với hiệu suất cao, tốc độ tải nhanh và mã nguồn tối thiểu Các website sử dụng ReactJS đảm bảo hoạt động mượt mà, nhanh chóng và có khả năng mở rộng tốt, đồng thời dễ dàng trong thao tác thực hiện.

Ngoài ra còn sử dụng một số thư viện sau để hỗ trợ cho chương trình:

Trong phần giao diện, chúng ta sẽ sử dụng thư viện Ant Design để thiết kế UI cho chương trình

Ant is a collection of React components designed according to the Ant UED Team's design standards Similar to Material Design, Ant offers a wide range of commonly used components for modern web applications, including Layout, Button, Icon, and DatePicker.

37 v.v…Bên cạnh đó Ant cũng có những component riêng thú vị, như LocaleProvider cho phép bạn thay đổi ngôn ngữ trên toàn ứng dụng

Ant Design cho React là một bộ thư viện toàn diện, đáp ứng hầu hết các yêu cầu của dự án mà không cần cài thêm thư viện nào khác Để cài đặt Ant Design, bạn chỉ cần sử dụng lệnh npm install trong cửa sổ Terminal để tải xuống tất cả các gói cần thiết.

Hình 2.1 Cài đặt package cho chương trình Quản lý Global state

Redux là một thư viện JavaScript giúp quản lý trạng thái của ứng dụng một cách hiệu quả Nó được biết đến như một công cụ quản lý trạng thái có thể dự đoán, phù hợp cho các ứng dụng viết bằng JavaScript, thường được gọi là Redux js.

Cách hoạt động của Redux khá đơn giản, dựa trên 3 thành phần chính là: Actions, Store, Reducers

Actions are essentially events that facilitate the transmission of data from an application to the Redux store This data can originate from user interactions, API calls, or form submissions within the app.

Reducers là các hàm nguyên thủy nhận trạng thái hiện tại của ứng dụng, thực hiện một hành động và trả về trạng thái mới Những trạng thái này được lưu trữ dưới dạng đối tượng, xác định cách mà trạng thái của ứng dụng thay đổi để phản hồi hành động gửi đến kho lưu trữ.

The store in a Redux application uniquely holds the application's state, allowing access to stored states, updating of states, and the registration or unregistration of listeners through helper methods.

Object và Connection Để xây dựng một sơ đồ hệ thống mạng trên màn hình, chúng ta sẽ sử dụng thư viện React Flow

React Flow là một công cụ mạnh mẽ giúp phát triển các ứng dụng sơ đồ từ đơn giản đến phức tạp, cho phép người dùng tạo ra các trình chỉnh sửa tương tác Với React Flow, bạn có thể tùy chỉnh các loại node và edge, đồng thời sử dụng các thành phần bổ trợ như minimap và graph control để nâng cao trải nghiệm người dùng.

React Flow là một công cụ dễ sử dụng, cung cấp các tính năng như phóng to, thu nhỏ và cố định màn hình Ngoài ra, nó còn cho phép người dùng tùy chỉnh hiển thị các nodes và edges một cách linh hoạt.

Hình 2.2 Thư viện ReactFlow Notification

SweetAlert cung cấp hộp thoại hiển thị thông báo thân thiện, chuyên nghiệp và đẹp mắt hơn đối với người dùng

Một số tham số cấu hình hay dùng khi sử dụng SweetAlert2

Tiêu đề của modal có thể được thêm vào đối tượng dưới dạng từ khóa "title" hoặc được truyền vào như tham số đầu tiên của hàm.

- Text: Mô tả cho modal Nó có thể được thêm vào object dưới dạng từ khóa text hoặc được truyền như là tham số thứ hai của function

SweetAlert2 offers five types of modals: warning, error, success, info, and question You can include these types in an array using the keyword "type" or pass them as the third parameter of the function.

JSZip là một thư viện JavaScript hữu ích cho việc tạo, đọc và chỉnh sửa các tệp tin nén zip, cung cấp một API đơn giản giúp người dùng dễ dàng xuất và tải về các tệp tin nén.

Về mặt cấu trúc chương trình gồm các folder như sau: assets, components, containers, layout, redux, utils

• assets: gồm img để chứa hình ảnh, styles: để chứa các styles chung

• components: để chứa các components (ví dụ: như button để tái sử dụng lại) chung để tái sử dụng

• containers: chứa các containers chung (Sidebar và Phần canvas để kéo thả trên đó)

• layout: là layout giao diện ngoài

• redux: để chứa các slice của redux

• utils: để chứa các hàm để tái sử dụng lại

2.1.3 Danh mục lớp sử dụng trong chương trình

Bảng 2.1 Danh mục lớp sử dụng trong chương trình

TT Tên Lớp Mục đích

Dùng để trừu tượng cho các object có các thuộc tính vị trí và phương thức kéo thả kết nối cho các lớp con kế thừa

Kế thừa từ lớp Node mô tả về các đặc điểm chung như id, name, type của các đối tượng

Kế thừa từ lớp NetObject mô tả các đối tượng thuộc lớp này là các cấu hình OS, IP, Subnet, Service

Kế thừa từ lớp NetObject mô tả các đối tượng thuộc lớp này là các cấu hình IP và Subnet cho 2 bên trái phải kết nối

5 Connection Dùng để mô tả thông tin điểm bắt đầu và điểm đến của các kết nối giữa các đối tượng

2.1.4 Danh mục hàm sử dụng trong chương trình

Bảng 2.2 Danh mục hàm sử dụng trong chương trình

TT Phương thức Mục đích

Nhận vào giá trị là 1 loại của đối tượng vd như là router hoặc end-device để tạo ra đối tượng thuộc Router/EndDevice tương ứng

2 ObjectItem Với dữ liệu đầu vào là data, trong đó có tất cả các trạng thái của object

3 addContent Hiển thị danh mục những loại object được hỗ trợ trong chương trình

Hàm hiển object ra ngoài màn hình Một object sẽ có id và data, trong đó data sẽ bao gồm như type, name, status, configure, position

The function manages the connection points of devices, with the default configuration allowing routers to have 2 connection points, end-devices to have 4 connection points, and switches to also have 4 connection points.

6 handleNodes Kiểm tra xem đối tượng đã được liên kết chưa, nếu rồi thì giới hạn điểm liên kết trên đối tượng lại

7 HandleDoubleClick Set lại trạng thái cho Object thành loading để tiến hành sửa tên

Hàm để xử lý hành động kéo thả Khi hành động kéo thả dừng lại thì nó sẽ update trên Store lại vị trí

9 onEdgesChange Hàm xử lý khi thay đổi connection

10 onEdgeUpdateStart Hàm xử lý khi hành động kéo thả bắt đầu

11 onEdgeUpdateEnd Hàm xử lý khi hành động kéo thả kết thúc

12 renderMenuObject Lấy danh sách các thiết bị đã được thấy ra màn hình canvas và hiển thị lên SideBar

13 handleDelete Dữ liệu đầu vào là id của object, gọi đến hàm deleteObjectThunk

14 deleteObjectThunk Xóa một object trên màn hình canvas

15 deleteAllObjectThunk Xóa tất cả các object trên màn hình canvas

16 handleRightMouse Xử lý hành động click chuột phải vào object, hiển thị pop là khung tùy chọn Configure và Delete

17 renderConfigureModal Tùy thuộc vào object mà sẽ hiển thị ra màn hình cấu hình phù hợp với từng loại

Set trạng thái của pop cấu hình bằng True và hiển thị ra màn hình cho người dùng thiết lập các thông số ban đầu

Khi người dùng thay đổi tên của đối tượng và nhấn Enter hoặc nhấp chuột ra ngoài, tên của đối tượng sẽ được cập nhật và trạng thái của nó sẽ trở về trạng thái idle.

Cập nhật lại thông tin của object nhất định thông qua thông số đầu vào là id, dữ liệu sẽ được cập nhật lại trên Store

21 updateEdgesThunk Cập nhật lại thông tin connection của các object

Khi một kết nối được tạo giữa các thiết bị, End-device chỉ có thể duy trì một kết nối do chỉ có một card mạng Điều này có nghĩa là khi một kết nối được thiết lập, ba điểm kết nối còn lại sẽ tự động mất đi, khác với biểu tượng ban đầu là bốn chấm kết nối.

23 handleOSChange Hàm xử lý khi giá trị OS của end-device thay đổi

24 handleSubChange Hàm xử lý khi giá trị Subnetmask của end- device/router thay đổi

25 handleIPChange Hàm xử lý khi giá trị IP của end-device/router thay đổi

26 handleSave Hàm xử lý khi người dùng chọn Save để xác nhận lưu dữ liệu

27 handleCancel Hàm xử lý khi người dùng chọn Cancel để hủy bỏ thao tác không lưu dữ liệu

Kết quả đạt được

Sau khi nghiên cứu về Docker, chúng tôi đã khám phá được bản chất và những ưu điểm nổi bật của công nghệ này Docker mang lại nhiều lợi ích đáng kể, giải thích tại sao nó trở nên phổ biến trong cộng đồng Developer, System Admin và Networker Sự phát triển của Docker đã khẳng định vị thế của nó như một xu hướng công nghệ quan trọng trong ngành công nghệ thông tin hiện nay.

Docker là một công nghệ mới giúp mở rộng kiến thức về ảo hóa và các thành phần liên quan Bài viết cung cấp cái nhìn tổng quan về các khái niệm, đặc điểm và câu lệnh của Docker, giúp người đọc hiểu rõ Docker là gì và ứng dụng của nó Ngoài ra, bài viết cũng giải thích cơ chế hoạt động của Docker, cách viết Dockerfile và Docker Compose, cùng với mối quan hệ giữa các thành phần trong Docker Từ đó, người đọc có thể phác họa một mô hình tổng quát về Docker và ứng dụng nó trong việc xây dựng chương trình ảo hóa cho hệ thống mạng.

1.2 Về phần ứng dụng Đã xây dựng được giao diện thân thiện với người dùng tuy đơn giản nhưng gọn gàng và đầy đủ các chức năng cần có Hình ảnh trực quan, nổi bật, dễ dàng sử dụng, thao tác nhanh gọn

Docker đã tạo ra Dockerfile phù hợp với từng loại thiết bị, trong khi Docker Compose đã thành công trong việc thiết lập các dịch vụ và mạng Điều này đảm bảo rằng mọi thông số được người dùng thiết lập ban đầu đều được tuân thủ chính xác.

Mặc dù đã có nhiều tính năng được lên kế hoạch, vẫn còn một số tính năng chưa được triển khai, bao gồm khả năng mở file để người dùng có thể tải lên chương trình, thêm hệ điều hành và dịch vụ ban đầu cho thiết bị End-device, cùng với chức năng swap địa chỉ.

IP giữa hai cổng của router.

Thuận lợi

Chúng em đều có nền tảng từ CCNA, CCNP nên cũng không có quá nhiều trở ngại trong phần triển khai mô hình mạng

Có được sự đóng góp ý kiến cũng như gợi ý từ Thầy giúp chúng em xác định đúng mục tiêu cần nghiên cứu

Có được sự giúp đỡ, góp ý và chỉ dẫn của các bạn để có thể xây dựng được giao diện người dùng.

Khó khăn

Dựa trên kiến thức lý thuyết về Docker, chúng tôi đã phát triển một chương trình ảo hóa mô hình hệ thống mạng Tuy nhiên, chỉ sử dụng Docker là không đủ; để tạo giao diện web cho người dùng, chúng tôi cần xây dựng trên nền tảng React Sau một thời gian không lập trình thường xuyên, việc ôn lại kiến thức về HTML, CSS, JS và tìm hiểu các thư viện hỗ trợ đã tiêu tốn khá nhiều thời gian của chúng tôi.

Nhận xét và đánh giá tổng quan

Chúng em đã hoàn thành các mục tiêu ban đầu, với phần lý thuyết được hoàn thiện đầy đủ Hiện tại, chúng em đang tiếp tục phát triển phần ứng dụng nhằm tối ưu hóa chương trình và triển khai các mô hình phức tạp hơn cùng nhiều dịch vụ mới.

Đánh giá mức độ hoàn thành của thành viên

- Thành viên chính trong nhóm chịu trách nhiệm tìm hiểu lý thuyết về Docker

- Đóng góp ý tưởng xây dựng phần ứng dụng, xác định các đối tượng cần thực hiện

- Nghiên cứu tìm hiểu về cách viết Dockerfile và Docker-compose

- Lên ý tưởng về các mô hình có thể kết nối

- Thiết kế giao diện người dùng

- Thành viên chính trong nhóm chịu trách nhiệm tìm hiểu lý thuyết về Docker

- Đóng góp ý tưởng xây dựng phần ứng dụng, liệt kê các thuộc tính của đối tượng

- Nghiên cứu tìm hiểu về cách viết Dockerfile và Docker-compose

- Thực nghiệm, vẽ mô hình và kiểm tra các trường hợp có thể kết nối

- Thành viên chính trong nhóm chịu trách nhiệm tìm hiểu lý thuyết về Docker

- Đóng góp ý tưởng xây dựng phần ứng dụng, phác thảo sơ bộ giao diện người dùng

- Nghiên cứu tìm hiểu về cách viết Dockerfile và Docker-compose

- Lên ý tưởng về các mô hình có thể kết nối

- Thiết kế giao diện người dùng

- Viết báo cáo, thiết kế powerpoint

Tất cả các thành viên đã hoàn thành nhiệm vụ được giao và tích cực đóng góp ý kiến xây dựng nội dung Mặc dù có một số lần trễ hạn so với lộ trình và bất đồng quan điểm, nhóm đã vượt qua những khó khăn này để tiếp tục thực hiện công việc một cách hiệu quả.

Ngày đăng: 06/10/2023, 10:37

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
[1] Nguyễn Văn Quy (2018), Docker - những kiến thức cơ bản phần 1 Sách, tạp chí
Tiêu đề: Docker - những kiến thức cơ bản phần 1
Tác giả: Nguyễn Văn Quy
Năm: 2018
[3] Dương Hoài Nam (2020), Tìm hiểu về Dockerfile và tạo Docker Image https://viblo.asia/p/tim-hieu-ve-dockerfile-va-tao-docker-image-V3m5WWag5O Sách, tạp chí
Tiêu đề: Tìm hiểu về Dockerfile và tạo Docker Image
Tác giả: Dương Hoài Nam
Năm: 2020
[7] Nguyễn Văn Minh (2020), Xây dựng docker-compose.yml file cho project của bạn https://viblo.asia/p/docker-xay-dung-docker-composeyml-file-cho-project-cua-ban-Az45bznz5xY Sách, tạp chí
Tiêu đề: Xây dựng docker-compose.yml file cho project của bạn
Tác giả: Nguyễn Văn Minh
Năm: 2020
[8] Giang (2020), Những điều phải biết về docker compose, cách sử dụng và các lưu ý https://bizflycloud.vn/tin-tuc/nhung-dieu-phai-biet-ve-docker-compose-cach-su-dung-va-cac-luu-y-20200821120351358.htm Sách, tạp chí
Tiêu đề: Những điều phải biết về docker compose, cách sử dụng và các lưu ý
Tác giả: Giang
Năm: 2020
[11] Uy Trần (2020), Docker Networking - Những khái niệm và cách sử dụng cơ bản https://viblo.asia/p/docker-networking-nhung-khai-niem-va-cach-su-dung-co-ban-gGJ59P2JlX2 Sách, tạp chí
Tiêu đề: Docker Networking - Những khái niệm và cách sử dụng cơ bản
Tác giả: Uy Trần
Năm: 2020
[14] Hân Thị Kim Ngọc (2020), How To Install Docker on Ubuntu https://viblo.asia/p/how-to-install-docker-on-ubuntu-RnB5pmJ7KPG Sách, tạp chí
Tiêu đề: How To Install Docker on Ubuntu
Tác giả: Hân Thị Kim Ngọc
Năm: 2020
[15] W3school, React Tutorial https://www.w3schools.com/REACT/DEFAULT.ASP Sách, tạp chí
Tiêu đề: React Tutorial
Tác giả: W3school
[16] Ant Design , Ant Design Components https://ant.design/components/overview/ Sách, tạp chí
Tiêu đề: Ant Design Components
Tác giả: Ant Design
[17] React Flow, Uncontrolled Flow https://reactflow.dev/docs/guides/uncontrolled-flow/ Sách, tạp chí
Tiêu đề: Uncontrolled Flow
Tác giả: React Flow
[22] Phạm Tín (2019), Tìm hiểu về Redux Thunk https://viblo.asia/p/tim-hieu-ve-redux-thunk-Qbq5Qkm4ZD8 Sách, tạp chí
Tiêu đề: Tìm hiểu về Redux Thunk
Tác giả: Phạm Tín
Năm: 2019
[4] Nguyễn Tâm (2020), Phân biệt Docker image vs Container https://viblo.asia/p/phan-biet-docker-image-vs-container-bJzKmz4wZ9N Link
[5] Sử dụng Dockerfile để tự động tạo các image trong Docker https://xuanthulab.net/su-dung-dockerfile-de-tu-dong-tao-cac-image-trong-docker.html Link
[6] Hoàng Đinh (2021), Tổng hợp kiến thức cần biết về Docker và Docker Swarm https://viblo.asia/p/tong-hop-kien-thuc-can-biet-ve-docker-va-docker-swarm-phan-3-thanh-phan-tinh-nang-docker-RnB5pO6GlPG Link
[9] Quách Chí Cường, Docker: Tìm hiểu về Docker Hub là gì? https://cuongquach.com/tim-hieu-ve-docker-hub-la-gi.html Link
[13] Docker docs, Install Docker Engine on Ubuntu https://docs.docker.com/engine/install/ubuntu/ Link
[18] Redux Toolkit, Redux Toolkit Quick Start https://redux-toolkit.js.org/tutorials/quick-start[19] SweetAlert2https://sweetalert2.github.io/ Link
[20] Nguyễn Như Hải Triều (2019), Tìm hiểu về Ant-design trong React https://viblo.asia/p/tim-hieu-ve-ant-design-trong-react-maGK7VQx5j2 Link
[23] Nguyễn Thị Quỳnh (2018), Giới thiệu về JSZip https://viblo.asia/p/gioi-thieu-ve-jszip-3Q75w2XMlWb Link

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w