



















Preview text:
BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC VĂN LANG
KHOA KỸ THUẬT CƠ – ĐIỆN VÀ MÁY TÍNH
TIỂU LUẬN CUỐI KỲ
Nhập môn mạng máy tính và điện toán đám mây
TRIỂN KHAI DOCKER XÂY DỰNG ỨNG DỤNG WEBSITE MẠNG XÃ HỘI DÀNH CHO NHỮNG NGƯỜI ĐỌC SÁCH
Giảng viên hướng dẫn: TS. Nguyễn Quốc Dũng Sinh viên thực hiện:
Cao Ngọc Quỳnh Mai – 2374801030044
Lưu Thúy Anh – 2374801030003
Quách Mỹ Tân – 2374801030460 JULY 31, 2024 MỤC LỤC
I. Introduction..........................................................................................................................................1
1. Docker Overview.............................................................................................................................2
2. Advantages of Docker......................................................................................................................3
II. Detailed task list and member assignment..........................................................................................3
1. Detailed Task List.............................................................................................................................3
2. Member Assignment.......................................................................................................................4
III. Architecture........................................................................................................................................6
1. Client................................................................................................................................................7
2. DOCKER_HOST.................................................................................................................................7
3. Registry (Docker Hub)......................................................................................................................7
IV. Components.......................................................................................................................................7
1. Docker Image...................................................................................................................................7
2. Docker Container.............................................................................................................................7
3. Docker Volume................................................................................................................................7
4. Docker Networking..........................................................................................................................8
5. Docker Commands...........................................................................................................................8
V. Instal ation / Configuration / Application............................................................................................9
1. Container Instal ation......................................................................................................................9
2. Configuration.................................................................................................................................10
3. Hands-on Application Demo..........................................................................................................12
VI. Conclusions......................................................................................................................................19
VII. References.......................................................................................................................................20 I. Introduction
Trong thời đại công nghệ thông tin phát triển nhanh chóng mặt, việc ứng
dụng các công nghệ mới để triển khai và quản lý các ứng dụng web đang trở
thành một xu hướng phổ biến. Một trong những công nghệ nổi bật trong lĩnh vực
này là Docker - một nền tảng để xây dựng, triển khai và chạy các ứng dụng trong
các môi trường được gọi là container.
Đồ án của chúng tôi tập trung vào việc xây dựng một website mạng xã hội
dành cho những người yêu thích đọc sách, sử dụng Docker để quản lý và triển
khai các thành phần của hệ thống một cách dễ dàng và linh hoạt. Mục tiêu chính
là tận dụng các ưu điểm của Docker như tính đóng gói, tính di động và tính nhất
quán để xây dựng một nền tảng mạng xã hội cho những người đọc sách.
Cụ thể, chúng tôi sẽ sử dụng Docker để containerize các thành phần chính của
hệ thống, bao gồm backend, frontend và cơ sở dữ liệu. Điều này giúp đảm bảo
tính nhất quán và linh hoạt trong việc triển khai và quản lý hệ thống. Ngoài ra,
chúng tôi cũng sẽ sử dụng Docker Compose để quản lý và điều phối các
container, giúp dễ dàng triển khai toàn bộ hệ thống chỉ với một vài dòng lệnh.
Về chức năng của ứng dụng, nó sẽ cung cấp một không gian trực tuyến nơi
mọi người có thể chia sẻ, đánh giá và thảo luận về các cuốn sách họ đã đọc.
Người dùng có thể tạo tài khoản, chia sẻ đánh giá, tham gia vào các nhóm thảo
luận, và tương tác với những người đam mê đọc sách khác.
Với việc áp dụng Docker vào triển khai hệ thống và xây dựng một nền tảng
mạng xã hội cho những người đọc sách, chúng tôi hy vọng có thể mang lại một
giải pháp hiệu quả và tiện lợi cho cộng đồng yêu thích đọc sách. Mục tiêu của đồ án:
Ứng dụng Docker trong triển khai hệ thống:
- Sử dụng Docker để container hóa các thành phần của hệ thống, bao gồm
backend, frontend, và cơ sở dữ liệu. Điều này giúp đảm bảo tính nhất quán và
linh hoạt trong việc triển khai và quản lý hệ thống. Trang 1
- Docker Compose được sử dụng để quản lý và điều phối các container, giúp dễ
dàng triển khai toàn bộ hệ thống chỉ với một vài dòng lệnh.
Xây dựng nền tảng mạng xã hội cho người đọc sách:
- Tạo ra một không gian trực tuyến nơi mọi người có thể chia sẻ, đánh giá và thảo
luận về các cuốn sách mà họ yêu thích.
- Cung cấp các tính năng tương tác phong phú như bình luận, đánh giá, đề xuất
sách, và tạo ra các câu lạc bộ sách trực tuyến. 1. Docker Overview
Docker là một nền tảng mã nguồn mở cho phép tự động hóa việc triển khai, mở rộng
và quản lý ứng dụng bằng cách sử dụng Containerization. Nhưng chính xác thì
Containerization là gì, và Docker đóng vai trò gì trong bức tranh này?
Containerization là một công nghệ ảo hóa cho phép cô lập các ứng dụng và các phụ
thuộc của chúng thành các đơn vị tự chứa gọi là container. Không giống như các máy ảo
truyền thống yêu cầu một hệ điều hành riêng cho mỗi phiên bản, các container chia sẻ
hệ điều hành chủ, làm cho chúng nhẹ hơn (lightweight) và hiệu quả hơn. Docker cung
cấp một giao diện mạnh mẽ và thân thiện với người dùng để tận dụng container hóa một cách hiệu quả.
Trung tâm của Docker là Docker Engine, chịu trách nhiệm xây dựng, chạy và quản lý
các container. Docker Engine bao gồm một số thành phần, bao gồm Docker daemon,
Docker CLI (Giao diện dòng lệnh) và Docker API. Docker daemon chạy nền và quản lý các
container, trong khi Docker CLI cung cấp giao diện dòng lệnh để tương tác với Docker
Engine. Docker API cho phép điều khiển bằng lập trình và tích hợp với các công cụ và dịch vụ khác.
Các đối tượng mà ta thường xuyên gặp khi sử dụng Docker: Docker image và Docker container.
Để tạo điều kiện thuận lợi cho việc chia sẻ và phân phối, Docker giới thiệu Docker
registry. Một registry là một kho lưu trữ tập trung để lưu trữ các Docker image. Registry
công cộng mặc định là Docker Hub, nơi lưu trữ một bộ sưu tập khổng lồ các image được
xây dựng sẵn mà bạn có thể sử dụng làm điểm khởi đầu cho các container của mình. Trang 2
Bạn cũng có thể thiết lập registry riêng của mình để lưu trữ và chia sẻ các image tùy chỉnh.
Tóm lại, Docker là một nền tảng mạnh mẽ khai thác lợi ích của Containerization,
cung cấp cho các nhà phát triển và quản trị hệ thống một cách nhất quán và hiệu quả để
đóng gói, phân phối và chạy ứng dụng. Bằng cách sử dụng Docker, ta có thể loại bỏ vấn
đề " it works on my machine", đơn giản hóa quá trình triển khai và tăng khả năng mở
rộng và linh hoạt trong việc quản lý phần mềm. Trong các phần tiếp theo, chúng ta sẽ
khám phá những lợi ích của việc sử dụng. 2. Advantages of Docker
Trong phần này, chúng ta sẽ đi sâu vào những lợi ích vô cùng lớn khi sử dụng Docker
trong phát triển và triển khai phần mềm. Docker đã trở nên vô cùng phổ biến nhờ những lợi ích sau:
Một trong những lợi ích lớn nhất của Docker là tính nhất quán. Thay vì phải loay
hoay cài đặt hàng tá công cụ và thư viện trên máy tính cá nhân, bạn chỉ cần tạo một
Dockerfile để định nghĩa môi trường làm việc lý tưởng của mình. Docker sẽ tự động xây
dựng một container chứa tất cả các phần mềm cần thiết, đảm bảo rằng mọi người trong
nhóm đều làm việc trên cùng một nền tảng.
Tính di động là một lợi ích khác không thể bỏ qua. Một khi bạn đã tạo một Docker
image, bạn có thể chạy nó trên bất kỳ máy chủ nào có cài đặt Docker, từ máy tính cá
nhân đến các đám mây công cộng như AWS, Google Cloud hay Azure. Điều này giúp bạn
dễ dàng chia sẻ ứng dụng với đồng nghiệp và triển khai vào môi trường sản xuất.
Hiệu suất cao cũng là một điểm mạnh của Docker. Các container Docker khởi động
rất nhanh và tiêu tốn ít tài nguyên hệ thống hơn so với các máy ảo truyền thống. Điều
này giúp bạn tiết kiệm chi phí và tăng tốc độ triển khai ứng dụng.
Khả năng mở rộng là một lợi ích khác rất quan trọng. Với Docker, bạn có thể dễ dàng
chia nhỏ ứng dụng thành các dịch vụ nhỏ (microservices) và chạy chúng trong các
container riêng biệt. Điều này giúp bạn quản lý và mở rộng ứng dụng một cách linh hoạt hơn.
II. Detailed task list and member assignment 1. Detailed Task List Trang 3
Cuộc họp khởi động: Xác định mục tiêu, phạm vi và yêu cầu của đồ án.
Phân chia công việc: Chia công việc và trách nhiệm cụ thể cho từng thành viên.
Thiết kế kiến trúc ứng dụng: Lập kế hoạch và
- Thiết kế sơ đồ tổng thể kiến trúc hệ thống. Thiết kế -
Chọn công nghệ và framework cần thiết (Node.js, React, MongoDB, Figma)
Thiết kế cơ sở dữ liệu:
- Tạo sơ đồ ERD (Entity-Relationship Diagram). -
Định nghĩa các bảng và mối quan hệ giữa chúng.
Cài đặt và thiết lập môi trường:
- Cài đặt Docker và Docker Compose.
- Tạo Dockerfile cho backend, frontend và database. -
Tạo Docker Compose file để quản lý các container.
Phát triển ứng dụng:
- Thiết lập backend với Node.js và Express.
- Thiết lập frontend với React. Triển khai và Thực
- Kết nối backend và frontend, hoàn thiện các chức năng CRUD hiện
(Create, Read, Update, Delete) cho mạng xã hội dành cho người đọc sách.
Kiểm thử và hoàn thiện:
- Chạy Docker Compose để kiểm thử toàn bộ ứng dụng trong môi trường Docker.
- Kiểm tra và sửa lỗi, tối ưu hóa mã nguồn và Dockerfile.
Triển khai ứng dụng lên Docker: Gắn tag và đẩy image lên Docker Hub.
Hoàn thành bản Báo cáo Docx và Slides. Báo cáo
Nộp báo cáo kết quả dự án và trình bày trước lớp. 2. Member Assignment STT Họ tên MSSV Nhiệm vụ Ghi chú Trang 4 - Ngày 15/7:
- Chuẩn bị Report: phần Hoàn thiện 60% Architecture, Components ứng dụng Web
- Tìm hiểu Docker: dockerfile, docker images, Docker - Ngày 18/7: Lưu Triển khai Container,... 01 Thúy 2374801030003 những phần đã Anh
- Tìm hiểu thêm về Docker có của ứng compose và thư viện nginx dụng lên Docker
- Chuẩn bị 1 CRUD website - Ngày 21/7: (phần frontend: reactjs, Hoàn thành database) toàn bộ Ứng dụng 02 Cao
2374801030044 - Chuẩn bị Report: phần Ngọc Components (Docker - Ngày 25/7: Quỳnh Commands), Installation / Hoàn thiện Mai Configuration / Application triển khai toàn bộ ứng dụng lên
- Tìm hiểu Docker: dockerfile, Docker docker images, Docker Container,... - Ngày 28/7: Kiểm thử và
- Tìm hiểu thêm về Docker hoàn thành Báo compose và thư viện nginx cáo Docx
- Chuẩn bị 1 CRUD website - Ngày 30/7: (phần backend: nodejs, Hoàn thiện database: mongodb) Trang 5
- Chuẩn bị Report: phần Introduction, Conclusions và References
- Tìm hiểu Docker: dockerfile, docker images, Docker Quách 03 2374801030460 Container,... Mỹ Tân Slides
- Tìm hiểu thêm về Docker compose và thư viện nginx - Ngày 31/7: Báo cáo thử
- Chuẩn bị 1 CRUD website (nội bộ) (phần frontend: reactjs, database) - Ngày 1/8: Báo cáo chính thức III. Architecture
Kiến trúc Docker sử dụng mô hình client-server. Docker client giao tiếp với docker
daemon để xây dựng, chạy và phân phối các container Docker. Docker client và daemon
có thể chạy trên cùng một hệ thống hoặc kết nối từ xa. Docker client và daemon tương
tác với nhau qua REST API thông qua UNIX socket hoặc mạng. Trang 6 1. Client
Docker run: Lệnh này được sử dụng để chạy một container từ một image đã có sẵn.
Docker build: Lệnh này được sử dụng để build một Docker image từ một Dockerfile.
Docker pull: Lệnh này được sử dụng để tải về (pull) một Docker image từ Docker registry. 2. DOCKER_HOST
Docker daemon: Là thành phần chính của Docker chạy trên host máy chủ, quản lý
các Docker objects (containers, images, networks, volumes).
Containers: Là các container đang chạy, mỗi container được tạo ra từ một image.
Images: Đây là các Docker images được lưu trữ trên Docker Host, bao gồm images
của MongoDB, Node.js, và Nginx. 3. Registry (Docker Hub)
Images: Docker Hub lưu trữ các Docker images. Bạn có thể pull images từ Docker
Hub hoặc push images từ Docker Host lên Docker Hub. Trong trường hợp này, các
images như Nginx, Node.js, React, và MongoDB được lưu trữ trong Docker Hub. IV. Components 1. Docker Image
Docker image là một mẫu chỉ đọc chứa hướng dẫn để tạo ra các vùng chứa Docker.
Chúng đóng vai trò quan trọng trong việc lưu trữ và vận chuyển các ứng dụng, bao gồm
các lớp từ Dockerfile. Các image này cung cấp cấu hình và các tệp cần thiết để xây dựng
môi trường ứng dụng, giúp đảm bảo tính đồng nhất trong việc triển khai ứng dụng trên
các môi trường khác nhau. 2. Docker Container
Docker container là các thực thể được tạo ra từ Docker image và hoạt động như các
ứng dụng sẵn sàng để chạy. Các vùng chứa cung cấp môi trường thực thi cho các ứng
dụng, với khả năng khởi động, dừng, xóa, và di chuyển thông qua Docker API hoặc CLI.
Chúng chỉ có thể truy cập các tài nguyên được xác định trong Docker image trừ khi có
cấu hình bổ sung trong quá trình xây dựng hoặc quản lý vùng chứa. 3. Docker Volume
Docker volume cho phép lưu trữ dữ liệu trong lớp có thể ghi của vùng chứa. Để quản
lý và lưu trữ dữ liệu, Docker sử dụng các trình điều khiển lưu trữ. Các trình điều khiển
lưu trữ này kiểm soát và quản lý Docker images và containers trên máy chủ, đảm bảo
việc bảo vệ và truy cập dữ liệu khi cần thiết. Trang 7 4. Docker Networking
Docker networking cung cấp khả năng giao tiếp giữa các vùng chứa và giữa các vùng
chứa với mạng bên ngoài. Các mạng Docker có thể được cấu hình như bridge networks
và overlay networks, giúp kết nối các vùng chứa và các dịch vụ khác trong hệ thống. Cấu
hình mạng trong docker-compose.yml hỗ trợ việc liên lạc và tương tác hiệu quả giữa các dịch vụ và ứng dụng. 5. Docker Commands Lệnh Docker Mô tả docker –version
Kiểm tra phiên bản Docker hiện tại. docker pull
Tải xuống một Docker image từ Docker Hub về máy. docker build -t .
Tạo một Docker image từ Dockerfile trong
thư mục hiện tại và gán tên cho image. docker images
Liệt kê tất cả các Docker images trên máy. docker run -d --name
Chạy một Docker container trong chế độ
nền từ một image và đặt tên cho container. docker ps
Liệt kê các Docker containers đang chạy. docker ps -a
Liệt kê tất cả các Docker containers, bao
gồm cả những container đã dừng. docker stop
Dừng một Docker container đang chạy. docker start
Khởi động lại một Docker container đã dừng. docker restart
Khởi động lại một Docker container đang chạy hoặc đã dừng. docker rm
Xóa một Docker container đã dừng. docker rmi
Xóa một Docker image khỏi máy. docker exec -it /bin/bash
Truy cập vào một Docker container đang
chạy bằng cách sử dụng terminal. docker logs
Xem log của một Docker container. Trang 8 docker-compose up
Khởi động các dịch vụ đã định nghĩa trong file docker-compose.yml. docker-compose down
Dừng và xóa các container, network và
volumes được tạo bởi docker-compose up. docker network ls
Liệt kê tất cả các Docker networks. docker volume ls
Liệt kê tất cả các Docker volumes. docker network create
Tạo một Docker network mới. docker volume create
Tạo một Docker volume mới.
V. Installation / Configuration / Application 1. Container Installation Docker Installation: o Windows/macOS:
1. Truy cập trang chính thức của Docker và tải xuống Docker Desktop cho hệ điều hành của bạn.
2. Chạy tệp cài đặt (Docker Desktop Installer) và làm theo hướng dẫn trên màn hình.
3. Chấp nhận các điều khoản cấp phép và chọn vị trí cài đặt (mặc định là C:\Program Files\Docker\Docker).
4. Cấu hình các tùy chọn như tạo lối tắt trên desktop và chọn engine (WSL 2 hoặc Hyper-V).
5. Hoàn tất cài đặt và khởi động Docker Desktop. o Linux:
1. Thực hiện các lệnh sau để cài đặt Docker Engine sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl software-properties- common Trang 9
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64]
https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" sudo apt-get update sudo apt-get install docker-ce 2. Cài đặt Docker Compose:
sudo curl -L "https://github.com/docker/compose/releases/download/$(curl -s
https://api.github.com/repos/docker/compose/releases/latest | grep 'tag_name' |
cut -d\" -f4)/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker- compose
sudo chmod +x /usr/local/bin/docker-compose
Docker Compose Installation: o
Windows/macOS: Đã được tích hợp trong Docker Desktop, không cần cài đặt riêng. o
Linux: Cài đặt Docker Compose theo hướng dẫn ở trên. 2. Configuration
Dockerfile Configuration: o
FROM: Xác định hình ảnh cơ sở. Ví dụ: FROM node:14. o
RUN: Chạy các lệnh trong container. Ví dụ: RUN npm install. o
COPY: Sao chép tệp từ máy chủ vào container. Ví dụ: COPY . /app. o
EXPOSE: Mở cổng cho ứng dụng trong container. Ví dụ: EXPOSE 80. o
CMD: Xác định lệnh để chạy khi container khởi động. Trang 10
Ví dụ: CMD ["node", "app.js"].
docker-compose.yml Configuration: o
version: Phiên bản cấu hình Docker Compose. Ví dụ: version: '3'. o
services: Định nghĩa các dịch vụ và cấu hình của chúng. Ví dụ: services: web: image: nginx:latest ports: - "8080:80" app: image: my-node-app ports: - "3000:3000" volumes: - .:/app
Network Configuration: o
Default Network: Docker tạo một mạng bridge mặc định cho các container. o
Custom Networks: Tạo mạng tùy chỉnh để kết nối các container. Ví dụ:
docker network create my-network
Volumes Configuration: o
Persistent Storage: Tạo và gán volume để lưu trữ dữ liệu. Ví dụ: Trang 11 volumes: my-data: o
Bind Mounts: Liên kết thư mục trên máy chủ với container. Ví dụ: volumes: - ./data:/data 3. Hands-on Application Demo
CRUD Application: Ứng dụng Website Mạng xã hội dành cho những người Đọc Sách. 3.1. Cấu trúc Dự án:
Dự án của nhóm bao gồm các thành phần chính sau:
webserver: Một máy chủ web sử dụng Nginx để phục vụ ứng dụng.
backend: Máy chủ backend chạy API CRUD, sử dụng Node.js (hoặc ngôn ngữ lập trình khác).
frontend: Giao diện người dùng, được xây dựng và phục vụ thông qua một máy chủ web tĩnh.
mongo: Cơ sở dữ liệu MongoDB để lưu trữ dữ liệu. Trang 12 Trang 13
3.2. Cấu hình Docker Compose Services: 3.2.1. mongo
image: Sử dụng image mongo:7.0.7 cho MongoDB.
ports: Ánh xạ cổng 27017 trên máy chủ (host) đến cổng 27017 trong container,
đây là cổng mặc định của MongoDB. Trang 14
volumes: Sử dụng volume tên mongo-data để lưu trữ dữ liệu của MongoDB tại /data/db trong container.
networks: Kết nối đến mạng app-network. 3.2.2. mongo-init
image: Cũng sử dụng image mongo:7.0.7.
depends_on: Đảm bảo dịch vụ mongo khởi động trước khi mongo-init thực thi.
entrypoint: Thực thi một loạt các lệnh mongoimport để nhập các file JSON vào MongoDB.
volumes: Ánh xạ các file JSON từ máy chủ vào container để sử dụng cho việc nhập dữ liệu.
networks: Kết nối đến mạng app-network. 3.2.3. backend
build: Xây dựng image Docker cho dịch vụ backend từ thư mục ./backend sử
dụng file Dockerfile được chỉ định.
ports: Ánh xạ cổng 3000 trên máy chủ đến cổng 3000 trong container.
environment: Đặt biến môi trường MONGO_URI để kết nối với dịch vụ MongoDB.
depends_on: Đảm bảo rằng các dịch vụ mongo và mongo-init khởi động trước khi backend khởi động.
networks: Kết nối đến mạng app-network. 3.2.4. frontend
build: Xây dựng image Docker cho dịch vụ frontend từ thư mục ./frontend.
ports: Ánh xạ cổng 80 trên máy chủ đến cổng 80 trong container.
networks: Kết nối đến mạng app-network.
depends_on: Đảm bảo dịch vụ backend khởi động trước khi frontend khởi động. 3.2.5. webserver
image: Sử dụng image nginx:alpine cho web server.
volumes: Ánh xạ file cấu hình từ máy chủ vào container.
ports: Ánh xạ cổng 8080 trên máy chủ đến cổng 80 trong container. Trang 15
networks: Kết nối đến mạng app-network.
depends_on: Đảm bảo cả hai dịch vụ backend và frontend khởi động trước khi webserver khởi động. Networks:
Định nghĩa một mạng tùy chỉnh tên là app-network sử dụng driver bridge, cho
phép các dịch vụ giao tiếp với nhau. Volumes:
Định nghĩa một volume tên là mongo-data để lưu trữ dữ liệu của MongoDB và
giữ dữ liệu này qua các lần khởi động lại của container. 3.3. Triển khai Dự án
3.3.1. Chuẩn bị Cấu hình Nginx
Tạo file cấu hình Nginx tại ./nginx/configs/default.conf: Trang 16 3.3.2. Cấu hình Backend
Tạo một Dockerfile cho backend tại ./backend/Dockerfile:
Tạo file package.json và các mã nguồn cần thiết cho API CRUD trong thư mục ./backend. 3.3.3. Cấu hình Frontend
Tạo một Dockerfile cho frontend tại ./frontend/Dockerfile: Trang 17
Tạo một ứng dụng Reactjs và có các tệp cần thiết trong thư mục ./frontend.
Thư Mục nginx với tệp default.conf trong ./frontend: Trang 18