Docker ra đời để giải quyết vấn đề trên.Bằng cách đơn giản hóa quá trình triển khai có nghĩa là Docker được sử dụng để đóng gói ứng dụng và môi trường thực thi của nó vào một container d
Trang 1ỦY BAN NHÂN DÂN TP HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC SÀI GÒN
Khoa Công nghệ thông tin
ĐỒ ÁN MÔN HỌC
Tìm hiểu Docker và xây dựng mô hình CICD
Tên thành viên :
Trần Ngọc Sơn: 3120410454
Lê Bảo Tài: 3120410457
Vương Trường Chung: 3120410068 Trương Hồ An:3120410024
THÀNH PHỐ HỒ CHÍ MINH, THÁNG 12 NĂM 2023
Trang 2LỜI CẢM ƠN Lời đầu tiên, chúng em xin chân thành cảm ơn thầy Lương Minh Huấn– giảng viên phụ trách – đã hướng dẫn tận tình chúng em trong thời gian thực hiện đồ án Nhờ có sự giúp đỡ tận tình của thầy chúng em có thể hoàn thành được đồ án một cách tốt nhất
Tuy chúng em đã cố gắng hạn chế những sai sót hết mức có thể nhưng vì kiến thức còn hạn hẹp nên chúng em khó tránh khỏi những sai sót trong quá trình thực hiện cũng như là lúc báo cáo đồ án Do đó, chúng em mong nhận được ý kiến đóng góp từ thầy để chúng em có thể khắc phục, sửa chữa
Chúng em xin chân thành cảm ơn thầy!
Trang 3Contents
Chương 1: Kiến thức về Docker 5
1.1 Giới thiệu sơ lược về Docker 5
Tại sao lại có Docker 5
Docker là gì? 5
Lịch sử ra đời 5
Roadmap phát triển 5
1.2 Kiến trúc tổng thể 7
Docker Engine 7
Docker Hub 8
Một số thuật ngữ 8
1.3 Cách thức hoạt động 9
1.4 Docker mang lại lợi ích gì? Cho ai? Trong hoàn cảnh nào? 10
Lợi ích và hoàn cảnh sử dụng 10
Ai sử dụng Docker 10
1.5 Một số công cụ phổ biến 10
Docker Compose 11
Docker Swarm 11
1.6 So sánh Docker với các công nghệ tương tự 11
Chương 2: Áp dụng Docker 12
2.1 Setup Dockerfile 12
NestJs – backend 12
VueJs – frontend 13
2.2 Setup Docker-Compose 14
Quy trình cơ bản 14
Docker-compose file 15
Chương 3: Mô hình CI/CD 16
CICD là gì ? 16
Triển khai CICD đơn giản 16
Jenkins 17
Tại sao lại có Jenkins? 17
Jenkins là gì? 17
Trang 4Thành phần của Jenkins 17
Ứng dụng của Jenkins 18
AWS 19
AWS là gì ? 19
Các tính năng vượt trội 19
Dịch vụ quan trọng trên AWS 20
Ansible: 21
Ansible là gì? 21
Thành phần của Ansible 21
Ứng dụng của Ansible 22
Trang 5Chương 1: Kiến thức về Docker
1.1 Giới thiệu sơ lược về Docker
Tại sao lại có Docker
Trong quá trình phát triển phần mềm, có thể xuất hiện nhiều vấn đề của sự không tương thích giữa các máy tính của các nhà phát triển và môi trường triển khai
Docker ra đời để giải quyết vấn đề trên.Bằng cách đơn giản hóa quá trình triển khai có nghĩa là
Docker được sử dụng để đóng gói ứng dụng và môi trường thực thi của nó vào một container duy nhất, đảm bảo rằng ứng dụng sẽ chạy đúng trên môi trường hoặc một máy tính
Docker là gì?
Docker là một nền tảng cho developers và sysadmin để develop, deploy và run application với container Nó cho phép tạo các môi trường độc lập và tách biệt để khởi chạy và phát triển ứng dụng và môi trường này được gọi là container Khi cần deploy lên bất kỳ server nào chỉ cần run container của Docker thì application của bạn sẽ được khởi chạy ngay lập tức
Lịch sử ra đời
• Docker được thành lập bởi ông Solomon Hykes and Sebastien Pahl Nó là sản phẩm của nhóm startup Y
Combinator phát triển và được công bố năng 2011
• Lúc đầu Docker project là dự án nội bộ của công ty dotCloud, platform-as-a- service ở Pháp
• Lần đầu tiên docker được công bố dưới dạng open-source là tháng 3 năm 2013
• Từ phiên bản 0.9 thì docker đã dùng những component riêng được biết bằng Go ( Golang ) để thay thế cho việc dùng LXC(linux system) làm môi trường thực thi
• Vào năm 2017 thì docker đã tạo ra Moby project để phát triển vấn đề đa nhân thay cho việc dùng docker engine
Roadmap phát triển
• Tháng 9-2013 Red hat và docker công bố hợp tác xoay quanh Fedora, RHEL, OpenShift
• Tháng 10-2014 công bố tích hợp Docker engine vào windows server và hỗ trợ native cho
docker client trong windows
• Tháng 11-2014 Docker công bố hợp tác với Stratoscale(công ty làm về data center
operating system Vmware là 1 trong các sản phẩm).Ngoài ra, Docker container đã có thể
support cho EC2 của Amazon
Trang 6• Tháng 12-2014, IBM công bố hợp tác với Docker và tích hợp docker vào Cloud của IBM
Trang 7• Tháng 6-2015, Docker và 1 số công ty như: CoreOS, Google, Microsoft,
AWS, đã công bố liên kết với nhau để cung cấp giải pháp tiêu chuẩn của hệ điều
hành cho software containers
• Tháng 5-2016 nghiên cứu cho thấy những tổ chức chính tham gia đónng góp
cho docker là: The Docker Teamm Cisco, Google, Huawei,IBM, Microsoft and
Red Hat
• Tháng 6-2016, Microsoft công bố docker có thể sử dụng trên Windown 10
• Tháng 5-2019 WSL2 của windows có thể hỗ trợ chạy Docker
1.2 Kiến trúc tổng thể
Hình 1.1: Kiến trúc Docker
Docker có 2 thành phần chính: Docker Engine và Docker Hub Docker Engine là giải pháp ảo hóa (virtualization) dựa trên công nghệ container, còn tại Docker Hub là platform Software-as-a-Service để chia sẻ images
Docker Engine
Docker Engine là ứng dụng dựa trên kiến trúc client-server với các thành phần chính:
• Docker daemon đóng vai trò như một server Docker daemon có thể build, run và distribute docker container
Trang 8
• Một REST API đóng vai trò như interface để giao tiếp với docker daemon
• Một command line interface (CLI) đóng vai trò như một client
Docker client sẽ giao tiếp với docker daemon thông qua REST API, cả 2 sẽ kết nối với nhau thông qua UNIX socket hoặc qua giao tiếp mạng Việc giao tiếp theo phương thức này cho phép Docker Client và Docker Daemon có thể chạy trên cùng một hệ thống hoặc khác hệ thống
Docker Hub
Docker hub là nơi lưu trữ các image (public hoặc private) Ở đây người dùng có thể chia sẻ các
customized image Ngoài ra, người dùng có thể tìm và tải các image thông qua docker client
Hình 1.2: Trang Docker hub
Một số thuật ngữ
• Image: Là một package chứa tất cả các thông tin, thư viện, framework, cần thiết để tạo ra một container Thông thường, các image được tạo ra dựa trên các image cha (based image) – image cha được cung cấp sẵn bởi docker
• Container: Về cơ bản, container là một công nghệ ảo hóa nhưng thay vì phải giả lập phần cứng như Vmware thì container sẽ chia sẻ hệ điều hành với host Mỗi container đều chạy độc lập với các container khác và hệ thống mà docker đang chạy Do đó người dùng có thể thêm, xóa, sửa container; Kết nối với network; Thậm chí là tạo một image dựa trên trạng thái hiện tại của container mà không ảnh hưởng tới hệ thống host và các container khác
Trang 9Hình 1.3: So sánh kiến trúc của container và Virtual Machines
• Daemon: là một loại chương trình trên các hệ điều hành Like-Unix hoạt động ẩn mà không cần sự kiểm soát bởi user
• Docker Registry: là nơi lưu trữ riêng của Docker Images Images được push vào registry và client
sẽ pull images từ registry Có thể sử dụng registry của riêng bạn hoặc registry của nhà cung cấp như : AWS, Google Cloud, Microsoft Azure
1.3 Cách thức hoạt động
Để cho mỗi container có thể chạy như một process độc lập và chiếm không gian ít thì docker sử dụng kiến trúc phân lớp (layer) Những layer này còn được gọi là layer trung gian, chúng được tạo từ những câu lệnh trong Dockerfile khi build một docker image
Ví dụ:
Với mỗi câu lệnh trên, docker sẽ tạo ra một layer nằm chồng lên container image Các layer sẽ được hash, có nghĩa là docker sẽ lưu các layer vào bộ nhớ cache Điều này sẽ tối ưu thời gian build cho các layer mà không thay đổi giữa những lần build Tức là người dùng sẽ không phải rebuild và copy các file ở bước COPY nếu như câu lệnh COPY không thay đổi
Trang 10Sau khi build xong các câu lệnh, Docker sẽ tạo ra một lớp trắng mới Người dùng có thể truy cập tới layer này sử dụng câu lệnh docker exec –it <container> <command> Bằng cách này người dùng có thể thay đổi image và có thể commit những thay đổi đó bằng câu lệnh docker commit
Hình 1.4: Kiến trúc phân lớp của container
1.4 Docker mang lại lợi ích gì? Cho ai? Trong hoàn cảnh nào?
• Thứ tư là dễ dàng automate (tự động hóa) việc quản lý các docker container thông qua
Kubernetes hoặc Docker Swarm
• Container Docker giúp cho việc chạy nhiều mã hơn trên từng máy chủ trở nên dễ dàng hơn, cải thiện khả năng tận dụng và tiết kiệm tiền bạc cho chúng ta, giúp dự án có khả năng mở rộng cao
Ai sử dụng Docker
• Business Analysist: thường dùng docker để chạy môi trường demo cho khách hàng
• QA & QC: thường dùng docker để chạy môi trường test để kiểm thử sản phầm
• Software Architect dùng để kiểm thử những công nghệ và tính ổn định của các công nghệ trên nhiều nền tảng khác
1.5 Một số công cụ phổ biến
Trang 11Docker Compose
Docker Compose là một công cụ được dùng để quản lý và chạy các Docker Container Docker Compose cho phép ta cấu hình các container trong một file YAML duy nhất và chạy tất cả các container chỉ với một câu lệnh
Docker Swarm
Docker Swarm là một công cụ giúp gom cụm các Docker Docker Swarm có thể gom nhiều Docker
Engine lại với nhau thành một Docker Engine “ảo” Tức là bất cứ công cụ nào giao tiếp với Docker
Engine thì cũng có thể giao tiếp với Docker Swarm như bình thường
1.6 So sánh Docker với các công nghệ tương tự
So sánh với
Docker Mô phỏng trải nghiệmvận hànhMáy ảo
nhưng vềvùng chứa vàlàm như vậymà không tốnchi phí môphỏng tàinguyên phầncứng
Mặc dùdaemon LXDyêu cầu nhânLinux, nó
cóthể được cấuhình để truycập bằng máykhách
Windowshoặc macOS
Một phần mởrộng của nhânLinux, cungcấp các côngcụ để ảo hóacho ngườidùng
Nó sửdụng Môitrường ảo đểlưu trữ các hệthống Khách,
có nghĩa là nósử dụng vùngchứa cho toànbộ hệ điềuhành, khôngphải các ứngdụng và quytrình riêng lẻ
Sử dụng nhân được váđể cung cấp các tínhnăng ảo hóa cấp hệđiều hành Mỗi Máychủ riêng ảo đượcchạy như một quytrình riêng biệt trêncùng một hệ thốngmáy chủ lưu trữ và cóhiệu quả cao do khôngcần mô phỏng Tuynhiên, nó là cổ điển về
CI / CD và DevOps, Vùng chứa và dữ liệu lớn, Bộ Ứng dụng Người dùng Biệt lập Lưu trữ, Hợp nhất máy chủ
Nhiều VPS lưu trữ và quản trị,
DreamHost, Amoebasoft, OpenHosting Inc., Lycos, Pháp,MosaixCommunications, Inc
Trang 12RUN npm run build
FROM node:12.13-alpine as production
ARG NODE_ENV=production ENV
Trang 13COPY –from=development /usr/src/app/dist /dist
CMD [ “node” , “dist/main” ]
Giải thích thông số
FROM — chỉ định image gốc: python, unbutu, alpine…
LABEL — cung cấp metadata cho image Có thể sử dụng để add thông tin maintainer Để xem các label của images, dùng lệnh docker inspect
ENV — thiết lập một biến môi trường
RUN — Có thể tạo một lệnh khi build image Được sử dụng để cài đặt các package vào container COPY — Sao chép các file và thư mục vào container ADD — Sao chép các file và thư mục vào container
CMD — Cung cấp một lệnh và đối số cho container thực thi Các tham số có thể được ghi đè và chỉ có một CMD
WORKDIR — Thiết lập thư mục đang làm việc cho các chỉ thị khác như: RUN, CMD, ENTRYPOINT, COPY, ADD,…
ARG — Định nghĩa giá trị biến được dùng trong lúc build image ENTRYPOINT — cung cấp lệnh và đối số cho một container thực thi EXPOSE — khai báo port lắng nghe của image
VOLUME — tạo một điểm gắn thư mục để truy cập và lưu trữ data
Run project với nestjs
Bước 1: config file Dockerfile
Bước 2: docker build –t <<app-name>>
Bước 3: docker run –p 8080:8080 app-name
Trang 14RUN npm run build
EXPOSE 8080
CMD [“npm”,”run”,”serve”]
Run Project cho VueJs
Bước 1: docker build –t <<app-name>>
Hình 2.1: Build dockerfile cho
VueJs
Bước 2: docker run -it -p 8080:8080 -v /app/node_modules rm test:latest
2.2 Setup Docker-Compose
Quy trình cơ bản
Cơ bản quy trình dùng docker compose gồm ba bước:
1 Xác định môi trường ứng dụng của bạn bằng Dockerfile để nó có thể được lưu trữ ở mọi nơi
2 Xác định các dịch vụ tạo nên ứng dụng của bạn trong docker-compose.yml để chúng có thể chạy cùng nhau trong một môi trường biệt lập
3 Chạy docker-compose up và bắt đầu chạy toàn bộ ứng dụng của bạn
Trang 15Docker-compose file
Ghi chú:
services: để khai báo những service có trong docker-compose
build: để khai báo đường dẫn tới service và có thể thêm đường dẫn đến docker file reset: always dùng khi
db gặp sự cố thì tự khởi động lại
image: khai báo tên image khi build container_name: khai báo tên container khi build
port: ánh xạ port từ container sang port sang máy local
environment: tương tự như file env để setup môi trường
links: để chỉ ra liên kết của các image với nhau
volumes: là nơi chứa data
Trang 16Chương 3: Mô hình CI/CD
3.1 CICD là gì ?
CI/CD là viết tắt của Continuous Integration và Continuous Delivery (hoặc Continuous Deployment), đây
là một phương pháp trong quy trình phát triển phần mềm để tự động hóa quá trình kiểm thử và triển khai
mã nguồn
1 Continuous Integration (CI): Là quá trình tích hợp tự động mã nguồn từ các thành viên của nhóm phát triển Mỗi khi có thay đổi trong mã nguồn, CI sẽ tự động kích hoạt quá trình kiểm thử tự động để đảm bảo rằng mã mới không làm hỏng tính ổn định của hệ thống
2 Continuous Delivery (CD): Là quá trình tự động hóa việc triển khai (deploy) mã nguồn từ môi trường phát triển đến môi trường sản phẩm một cách liên tục Mục tiêu là để có thể triển khai các thay đổi
mà không cần sự can thiệp thủ công, giúp giảm thiểu lỗi và tăng tính ổn định của hệ thống
3 Continuous Deployment (CD): Tương tự như Continuous Delivery, nhưng với Continuous
Deployment, các thay đổi sẽ được triển khai tự động đến môi trường sản phẩm mà không cần sự can thiệp thủ công Điều này có nghĩa là mọi thay đổi qua các bước kiểm thử sẽ tự động triển khai nếu tất cả các bước kiểm thử đều thành công
Quy trình CI/CD giúp tăng cường sự linh hoạt, tính ổn định và tăng tốc trong quá trình phát triển phần mềm bằng cách giảm thời gian và công sức cần thiết cho các bước kiểm thử và triển khai
Triển khai CICD đơn giản
Triển khai CI/CD có thể được thực hiện theo một số bước cơ bản Dưới đây là hướng dẫn giả sử bạn đang bắt đầu từ một dự án phần mềm và muốn triển khai CI/CD:
Continuous Integration (CI):
Quản lý mã nguồn:
Trang 17• Sử dụng một hệ thống quản lý mã nguồn như Git để theo dõi và quản lý mã nguồn
Automated Builds:
• Cấu hình công cụ tự động hóa quy trình xây dựng (build) như Jenkins, Travis CI, hoặc GitLab CI
để tự động xây dựng mã nguồn mỗi khi có thay đổi
Automated Tests:
• Thêm bộ kiểm thử tự động (automated tests) vào quy trình xây dựng để đảm bảo tính ổn định của
mã nguồn Các loại kiểm thử có thể bao gồm unit tests, integration tests, và end-to-end tests Continuous Delivery/Continuous Deployment (CD):
Quy trình Triển khai (Deployment Pipeline):
• Xây dựng một quy trình triển khai tự động, từ môi trường phát triển cho đến môi trường thử nghiệm và môi trường sản phẩm
Tại sao lại có Jenkins?
Trong quá trình phát triển phần mềm, đặc biệt là trong mô hình Agile và DevOps, việc tích hợp liên tục
và triển khai liên tục trở nên quan trọng Jenkins được thiết kế để tự động hóa các bước này, giúp tăng cường chất lượng phần mềm, giảm thời gian triển khai và tạo điều kiện cho quá trình phát triển linh hoạt hơn