1. Trang chủ
  2. » Tất cả

Đề tài tìm hiểu docker và xây dựng ứng dụng minh họa

112 23 0
Tài liệu đã được kiểm tra trùng lặp

Đ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 đề Tìm hiểu Docker và xây dựng ứng dụng minh họa
Tác giả Nguyễn Thanh Hưng, Phạm Nguyễn Minh Thắng
Người hướng dẫn ThS. Nguyễn Công Hoan
Trường học Đại Học Quốc Gia Thành Phố Hồ Chí Minh - Trường Đại Học Công Nghệ Thông Tin
Chuyên ngành Công Nghệ Thông Tin
Thể loại Báo cáo Đồ án
Năm xuất bản 2022
Thành phố Thành phố Hồ Chí Minh
Định dạng
Số trang 112
Dung lượng 3,51 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

  • Chương 1. TỔNG QUAN VỀ DOCKER (14)
    • 1.1 Hoàn cảnh ra đời (14)
      • 1.1.1 Mô hình máy chủ (14)
      • 1.1.2 Virtualization (15)
      • 1.1.3 Containerization (16)
      • 1.1.4 Lịch sử container (17)
      • 1.1.5 So sánh Virtualization và Containerization (18)
  • Chương 2. PHẦN MỀM MÃ NGUỒN MỞ DOCKER (21)
    • 2.1 Docker là gì? (21)
    • 2.2 Lịch sử hình thành Docker (22)
    • 2.3 Kiến trúc của Docker (23)
      • 2.3.1 Docker engine (24)
      • 2.3.2 Docker registry (24)
      • 2.3.3 Docker objects (26)
    • 2.4 Docker networking (35)
      • 2.4.1 Container networking (36)
      • 2.4.2 Docker Drivers (37)
      • 2.4.3 Embedded DNS (42)
    • 2.5 Docker Data Storage (43)
      • 2.5.1 Volumns (44)
      • 2.5.2 Bind mounts (45)
      • 2.5.3 tmpfs (46)
    • 2.6 Dockerfile (47)
      • 2.6.1 Format (47)
      • 2.6.2 Enviroment (47)
      • 2.6.3 Instructions (48)
      • 2.6.4 Shell form và Exec form (54)
      • 2.6.5 Dockerignore file (.dockerignore) (57)
    • 2.7 Docker build (57)
      • 2.7.1 Build context (57)
      • 2.7.2 Multi-stage build (57)
      • 2.7.3 Sử dụng stage trước đó (59)
      • 2.7.4 Cache (59)
    • 2.8 Vai trò của Docker (61)
  • Chương 3. SỬ DỤNG DOCKER (61)
    • 3.1 Cài đặt (61)
      • 3.1.1 Docker Desktop trên Windows (61)
      • 3.1.2 Docker trên Linux (63)
    • 3.2 Các lệnh thường dùng trong Docker (65)
      • 3.2.1 Images (65)
      • 3.2.2 Container (67)
      • 3.2.3 Network (71)
      • 3.2.4 Volume (74)
    • 3.3 Tạo image (76)
      • 3.3.1 Sử dụng Dockerfile (76)
      • 3.3.2 Tương tác trực tiếp (interactive) (81)
    • 3.4 Lưu image bằng repository registry (84)
    • 3.5 Tạo repository registry riêng (87)
  • Chương 4. DOCKER COMPOSE (89)
    • 4.1 Tổng quan (89)
    • 4.2 Viết docker-compose file (91)
    • 4.3 Viết Dockerfile (94)
    • 4.4 Viết entrypoint file (94)
  • Chương 5. XÂY DỰNG ỨNG DỤNG MINH HỌA (95)
    • 5.1 Cài đặt Docker trên Window (95)
    • 5.2 Tổng quan ứng dụng (97)
      • 5.2.1 Giới thiệu (97)
      • 5.2.2 Mục tiêu (97)
      • 5.2.3 Nghiệp vụ (97)
    • 5.3 Kiến trúc ứng dụng (97)
    • 5.4 Sơ đồ Use Case tổng quát (99)
    • 5.5 Build image (99)
      • 5.5.1 Build image cho .NET Core API server (99)
      • 5.5.2 Build image cho các trang SPA (102)
    • 5.6 Lauch ứng dụng bằng Docker compose (103)
    • 5.7 Demo (106)
    • 5.8 Tổng hợp (110)
  • Chương 6. KẾT LUẬN (111)
    • 6.1 Kết quả đạt được (111)
    • 6.2 Ưu, nhược điểm (111)
  • TÀI LIỆU THAM KHẢO (112)

Nội dung

Giới thiệu đề tài: Ngày nay các ứng dụng càng ngày càng phát triển và mở rộng một cách nhanh chóng, việc sử dụng máy ảo VMs trở thành một tiêu chuẩn để chạy các ứng dụng nhanh chóng nga

TỔNG QUAN VỀ DOCKER

Hoàn cảnh ra đời

Ban đầu, các ứng dụng được chạy trên máy chủ vật lý, gồm ba thành phần chính là máy chủ vật lý, hệ điều hành (OS) và các ứng dụng, nhưng việc xác định và phân chia ranh giới tài nguyên giữa các ứng dụng gặp khó khăn, gây ra sự cố phân bổ tài nguyên Để giải quyết vấn đề này, một giải pháp hiệu quả là sử dụng một máy chủ vật lý dành riêng cho từng ứng dụng, giúp tối ưu hóa hiệu suất và đảm bảo tài nguyên được phân bổ hợp lý.

Nhưng đây là một giải pháp không hiệu quả và rất khó khăn trong quá trình phát triển và vận hành ứng dụng

Hình 1-1 Mô hình máy chủ

Công nghệ ảo hóa (Virtualization) và phần mềm giám sát máy ảo (Hypervisor) ra đời như một giải pháp giúp giải quyết vấn đề này

Virtualization là quá trình sử dụng phần mềm để tạo các lớp trừu tượng trên phần cứng, cho phép chia một máy tính thành nhiều máy ảo (Virtual machine) hoạt động độc lập, mỗi máy ảo có hệ điều hành, khả năng tính toán và tài nguyên riêng biệt Phần mềm ảo hóa gọi là Hypervisor, là lớp ứng dụng cho phép chạy song song nhiều hệ điều hành và chia sẻ tài nguyên trên cùng một máy chủ vật lý, với hai loại chính là Type 1 (Native) và Type 2 (Hosted) Hypervisor Type 1 hoạt động trực tiếp trên phần cứng, nằm giữa phần cứng và hệ điều hành, mang lại hiệu suất cao, độ trễ thấp, ví dụ như VMware ESXi và Microsoft Hyper-V; trong khi Hypervisor Type 2 được cài đặt trên hệ điều hành để chạy như một ứng dụng, gồm VMware Workstation và Oracle VirtualBox.

Hình 1-2 Kiến trúc ảo hóa

Container hóa (Containerization) là một chiến lược ảo hóa sử dụng container, nổi bật như một phương pháp thay thế hiệu quả cho ảo hóa dựa trên Hypervisor truyền thống Công nghệ container giúp tối ưu hóa việc triển khai và quản lý ứng dụng, giảm thiểu sự phụ thuộc vào hệ điều hành, và cải thiện hiệu suất hệ thống Đây là giải pháp lý tưởng để giải quyết các vấn đề liên quan đến virtualization, mang lại sự linh hoạt, mở rộng dễ dàng và khả năng vận hành hiệu quả trong môi trường đám mây hiện đại.

Container được xây dựng dựa trên khả năng ảo hóa và tiến trình cô lập tích hợp trong Linux kernel, như Cgroups để phân bổ tài nguyên hiệu quả giữa các tiến trình Các namespace giúp hạn chế quyền truy cập và nâng cao khả năng hiển thị của tiến trình với tài nguyên hệ thống Nhờ đó, container cho phép nhiều thành phần ứng dụng chia sẻ tài nguyên của một máy chủ vật lý duy nhất, giúp các container trở nên nhẹ và linh hoạt hơn trong xử lý ảo hóa Container cung cấp tài nguyên nhanh hơn và đảm bảo tính sẵn sàng của ứng dụng cao hơn, phù hợp với các yêu cầu về mở rộng và hiệu suất trong môi trường công nghệ hiện đại.

Container là phương pháp đóng gói tất cả các thành phần cần thiết cho ứng dụng, bao gồm mã nguồn, các phụ thuộc và cả hệ điều hành, giúp tăng cường tính linh hoạt và dễ dàng triển khai Khác với máy ảo, container không cần khởi động toàn bộ hệ điều hành, chỉ chứa những thành phần ưu tiên, giúp tiết kiệm tài nguyên và thời gian triển khai Nhờ khả năng chứa đựng tất cả các yếu tố cần thiết, container có thể chạy trên nhiều môi trường khác nhau như máy tính cá nhân, hạ tầng doanh nghiệp hoặc các dịch vụ đám mây, đảm bảo tính di động và mở rộng linh hoạt.

Containers sử dụng ảo hóa OS thay vì ảo hóa phần cứng vật lý, tận dụng cơ chế của hệ điều hành máy chủ để cô lập các tiến trình và kiểm soát truy cập vào CPU, bộ nhớ và lưu trữ Nhờ đó, containers hoạt động như các ứng dụng bình thường, khi cần tài nguyên, chúng sẽ truy cập trực tiếp từ máy chủ Công nghệ container giúp tối ưu hóa hiệu suất, cải thiện khả năng mở rộng và quản lý dễ dàng hơn so với các phương pháp ảo hóa truyền thống.

Hình 1-3 Kiến trúc Container hóa

Tóm tắt về lịch sử phát triển của Container từ 1970 đến nay:

Lệnh Chroot cho phép thay đổi thư mục gốc của người dùng nhằm chia sẻ tài nguyên hiệu quả hơn trên hệ thống máy tính lớn và đắt đỏ Trong hệ thống Linux, Linux VServer là một cơ chế đóng gói để phân vùng tài nguyên như hệ thống tệp, địa chỉ mạng và bộ nhớ, được giới thiệu từ năm 2001 và hoàn thiện vào năm 2006 thông qua các bản vá nhân Linux Namespace giúp quản lý các tập tin riêng biệt cho từng người dùng, tạo sự cô lập giữa các người dùng trên cùng một máy chủ UnionFS là hệ thống tệp cho phép tạo các lớp lưu trữ riêng biệt và kết hợp chúng khi truy cập, đóng vai trò nền tảng cho các hình ảnh Docker theo từng layer Cgroup kiểm soát tài nguyên của các nhóm tiến trình, khi kết hợp với Namespace tạo nền tảng cho công nghệ container Docker dựa trên các công nghệ này để tổng hợp và hoàn thiện hệ sinh thái container, là phần mềm quản lý container phổ biến nhất Nhiều người lầm tưởng Docker là công nghệ, tuy nhiên thực chất nó là phần mềm tên đầy đủ là Docker Engine, hoạt động dựa trên nền tảng công nghệ container.

1.1.5 So sánh Virtualization và Containerization

Sự khác biệt chính giữa ảo hóa và container hóa nằm ở mức độ cô lập của hệ điều hành và môi trường chạy ứng dụng Trong quá trình ảo hóa, mỗi máy ảo có một hệ điều hành hoàn chỉnh riêng biệt, trong khi container hóa chỉ cô lập các ứng dụng và hệ điều hành của máy chủ với nhau, chia sẻ một nhân hệ điều hành Tuy nhiên, cả hai phương pháp đều có nguy cơ bị tấn công nếu kẻ xấu kiểm soát máy chủ, làm ảnh hưởng đến toàn bộ các container hoặc máy ảo trên hệ thống.

Ảo hóa cho phép lưu trữ nhiều hệ điều hành hoàn chỉnh, mỗi hệ điều hành có nhân riêng, trong khi container hóa chạy tất cả các container qua chế độ người dùng trên cùng một hệ điều hành Nó cũng hỗ trợ khách hàng bằng cách cho phép sử dụng nhiều hệ điều hành trên cùng một máy chủ, trong khi container hóa phụ thuộc vào hệ điều hành máy chủ và chỉ có thể chạy các bộ chứa tương thích với hệ điều hành đó Về triển khai, ảo hóa sử dụng trình ảo hóa riêng cho từng máy ảo, còn container hóa sử dụng Docker để triển khai từng container hoặc Kubernetes để quản lý nhiều container trên nhiều hệ thống Trong lưu trữ ảo liên tục, ảo hóa cung cấp đĩa cứng ảo riêng cho từng máy ảo, trong khi container hóa sử dụng đĩa cứng cục bộ trên mỗi nút và lưu trữ chia sẻ qua khối thông báo máy chủ Cân bằng tải ảo với ảo hóa dựa trên các cụm chuyển đổi dự phòng để vận hành các máy ảo, còn container hóa tối đa hóa hiệu suất tài nguyên nhờ điều phối của Docker hoặc Kubernetes, nhưng việc ngừng hoạt động để cân bằng tải chỉ xảy ra khi đạt giới hạn về tài nguyên Về mạng ảo hóa, ảo hóa sử dụng bộ điều hợp mạng ảo (VNA) để kết nối qua NIC, trong khi container hóa chia nhỏ VNA thành các chế độ xem biệt lập để thực hiện mạng nhẹ ảo hóa.

Ảo hóa mang lại nhiều lợi ích quan trọng, bao gồm khả năng mở rộng ứng dụng đồng thời và giảm chi phí vận hành Công nghệ này cung cấp tính sẵn sàng cao bằng cách cho phép lưu trữ tài nguyên ảo hóa nhanh chóng và tự động ngưng hoạt động sau khi hoàn tất nhiệm vụ Ngoài ra, tính liên tục trong kinh doanh được đảm bảo nhờ khả năng khôi phục phiên ảo dễ dàng thông qua sao lưu và sao chép dữ liệu Các máy ảo có thể triển khai nhanh chóng vì hệ điều hành cơ sở cùng các phần phụ thuộc đã được cài đặt sẵn trên nền tảng ảo hóa Thêm vào đó, tính bảo mật được nâng cao do mỗi máy ảo sử dụng hệ điều hành riêng biệt, giúp hạn chế rủi ro từ các mối đe dọa và lỗ hổng bảo mật.

Với lợi ích của ảo hóa, còn tồn tại những nhược điểm cần xem xét, bao gồm chi phí phần cứng cao và việc mở rộng quy mô có thể mất nhiều thời gian đối với nhiều phiên bản ảo hóa, ảnh hưởng đến tốc độ phản hồi Các công nghệ Hypervisor đi kèm với chi phí hoạt động, dẫn đến hiệu suất thấp hơn khi so sánh với cùng lượng tài nguyên Ngoài ra, các máy chủ ảo chứa nhiều phiên bản ảo hóa có thể gây gánh nặng quản lý cho bộ phận IT nếu không được giám sát chặt chẽ trong việc cập nhật và nâng cấp, ảnh hưởng đến hiệu quả hoạt động của hệ thống công nghệ thông tin.

Container hóa mang lại lợi ích vượt trội nhờ vào tính độc lập với nền tảng, giúp mở rộng quy mô ứng dụng trên đám mây dễ dàng Các container nhẹ và triển khai nhanh chóng hơn so với ảo hóa, vì chúng có kích thước chỉ tính bằng megabyte thay vì gigabyte, không bao gồm hệ điều hành, giúp tối ưu hóa hiệu suất và tiết kiệm tài nguyên.

Container giúp nhóm các phụ thuộc, thư viện, tệp nhị phân và tệp cấu hình lại với nhau, từ đó cho phép triển khai lại dễ dàng trên bất kỳ nền tảng hoặc môi trường nào Nhờ tính nhẹ, container giảm thiểu chi phí phát triển và vận hành, tối ưu hóa hiệu quả hoạt động của doanh nghiệp.

Mặc dù quá trình container hóa tăng khả năng mở rộng và linh hoạt cho các ứng dụng trên Cloud, nó còn có những hạn chế về dịch vụ như hỗ trợ tốt hơn trên các phân phối Linux, trong khi hỗ trợ của Windows chưa thực sự phù hợp cho doanh nghiệp, gây giới hạn cho người dùng Linux Việc giám sát hàng trăm container riêng lẻ gặp khó khăn hơn so với theo dõi nhiều quy trình trong một máy ảo Ngoài ra, container hóa không phải lúc nào cũng đem lại lợi ích cho các khối lượng công việc, thậm chí có thể làm giảm hiệu suất hệ thống.

PHẦN MỀM MÃ NGUỒN MỞ DOCKER

Docker là gì?

Docker là phần mềm mã nguồn mở của Docker Inc., cho phép các nhà phát triển xây dựng, triển khai, chạy, cập nhật và quản lý container một cách dễ dàng Với khả năng đóng gói và phân phối ứng dụng dưới dạng container hiệu quả, Docker hiện đang trở thành nền tảng phổ biến nhất trong lĩnh vực quản lý và vận hành ứng dụng.

Docker nổi bật với tính dễ sử dụng, kho tài liệu phong phú và cộng đồng hỗ trợ rộng lớn hơn so với các nền tảng container khác như Containerd hay BuildKit Ngoài ra, Docker cho phép tạo và hủy tài nguyên container một cách nhanh chóng và dễ dàng, giúp tối ưu hoá quá trình triển khai và quản lý hệ thống.

Container có kích thước nhỏ gọn, cho phép chạy đồng thời nhiều container trên cùng một máy chủ vật lý, nâng cao hiệu suất và tối ưu hóa tài nguyên Đây là công nghệ có tính chia sẻ và khả năng di động cao, giúp dễ dàng chuyển đổi và quản lý một cách linh hoạt Ngoài ra, container có khả năng tương thích cao, có thể sử dụng trên hầu hết các hệ điều hành như Windows, Linux, MacOS, giúp mở rộng phạm vi ứng dụng và phù hợp với nhiều môi trường khác nhau.

Lịch sử hình thành Docker

Docker, nền tảng mã nguồn mở được giới thiệu lần đầu vào tháng 3 năm 2013 dưới tên gọi dotCloud, đánh dấu bước ngoặt quan trọng trong xu hướng công nghệ container hóa Đến tháng 9 năm 2013, tên gọi của dự án vẫn không thay đổi, qua đó khẳng định vị thế của Docker trong ngành công nghiệp phần mềm.

Khi Docker công bố phiên bản 1.0 vào tháng 6 năm 2014, phần mềm đã đạt mốc hơn 2,75 triệu lượt tải xuống, minh chứng cho sự phổ biến của nền tảng này Tuy nhiên, nhiều người dùng đã nhận thấy Docker vẫn còn thiếu các yếu tố bảo mật quan trọng, đặc biệt là do việc sử dụng daemon Docker, gây ra những lo ngại về an ninh.

Người dùng gặp phải vấn đề với Docker thiếu các công cụ điều phối, dẫn đến sự tích hợp của Kubernetes để nâng cao khả năng quản lý container Mặc dù có những hạn chế, Docker vẫn phát triển mạnh mẽ nhờ sự hỗ trợ của Amazon, công ty đã ra mắt dịch vụ Amazon Elastic Compute Cloud (EC2) Dịch vụ này giúp người dùng chạy Docker Container hiệu quả hơn trên các cụm được quản lý bởi Amazon EC2, tối ưu hóa hiệu suất và dễ dàng quản lý tài nguyên.

Kể từ năm 2016, Microsoft vẫn chưa phát hành phiên bản phần mềm để hỗ trợ Docker Container, gây ra nhu cầu chưa được đáp ứng từ cộng đồng người dùng Trong thời gian đó, một công ty cạnh tranh đã ra mắt phần mềm WinDocks 1.0, mang đến những tính năng vượt trội mà người dùng mong đợi, chẳng hạn như khả năng hỗ trợ Máy chủ NET và SQL trong container chạy trên Windows Server.

Vào ngày 26 tháng 9 năm 2016, Microsoft chính thức phát hành Windows Server 2016 tích hợp Docker, cho phép chạy Docker Container nguyên bản trên Windows Server, thu hút sự quan tâm từ người dùng Microsoft Đến đầu năm 2018, Docker đã giới thiệu nhiều cập nhật lớn cho Docker Enterprise Edition, gồm phiên bản 2.0 vào tháng 4 và 2.1 vào cuối năm, mang lại khả năng tích hợp công nghệ khác nhau và lựa chọn giữa Kubernetes và Swarm để điều phối container Vào tháng 4 năm 2019, Docker ra mắt phiên bản mới nhất, Docker 3.0, với khả năng xây dựng các ứng dụng đa dịch vụ dựa trên container có thể hoạt động trên mọi môi trường, đáp ứng nhu cầu phát triển phần mềm đa dạng.

Kiến trúc của Docker

Docker operates on a Client-Server architecture, where the Docker client communicates with the Docker daemon to build, run, and deploy containerized applications The Docker client and daemon can run on the same system or be connected remotely via a network They interact using REST API over Unix sockets or network interfaces, enabling seamless management of Docker containers Additionally, Docker Compose functions as a client tool, which will be explored further later in the article.

Hình 2-1 Kiến trúc của Docker

2.3.1 Docker engine o Docker daemon (dockerd): là một tiến trình chạy nền liên tục quản lý các Docker images, containers, networks, volumes Docker daemon liên tục lắng gneh các yêu cầu Docker API và xử lý chúng Một Docker daemon có thể giao tiếp với các daemon khác để quản lý Docker services o Docker client: là một công cụ giúp người dùng giao tiếp với Docker host, khi người dùng chạy một lệnh docker, client sẽ gửi những câu lệnh này đến Docker daemon, các câu lệnh docker sử dụng Docker API Docker client có thể giao tiếp với một hoặc nhiều daemon o Docker API định nghĩa các interface cho phép client có thể giao tiếp với Docker daemon o Docker Desktop là một phần mềm dễ dàng cài đặt và sử dụng trên môi trường Windows và MacOS, Docker desktop đã được bao gồm Docker daemon, Docker client, Docker compose, …

Docker registry là dịch vụ máy chủ dùng để lưu trữ và phân phối Docker images và repositories, là một phần mềm mã nguồn mở hoạt động tương tự như Github, có thể được cung cấp bởi bên thứ ba hoặc triển khai nội bộ Docker Hub là kho lưu trữ công cộng lớn nhất do Docker Inc phát triển, cung cấp các tính năng chính như lưu trữ và tải Docker images, quản lý truy cập qua Team & Organizations, đồng bộ tự động Builds từ Github hoặc Bitbucket, cũng như kích hoạt webhooks sau khi thành công lưu hình ảnh Ngoài Docker Hub, còn có các nhà cung cấp Docker Registry phổ biến khác như Amazon Elastic Container Registry (ECR), Google Container Registry (GCR) và Azure Container Registry (ACR), giúp doanh nghiệp linh hoạt trong việc quản lý và vận hành Docker images phù hợp nhu cầu.

Docker image là một khuôn mẫu file nhị phân dùng để khởi chạy Docker container, tương tự như các file ảnh của hệ điều hành Nó chứa các metadata và câu lệnh hướng dẫn tạo Container trên nền tảng Docker, giúp lưu trữ và vận chuyển ứng dụng một cách hiệu quả Docker images đóng vai trò quan trọng trong quá trình phát triển, triển khai và quản lý ứng dụng trên môi trường Docker.

Hình ảnh (Image) là yếu tố cốt lõi giúp Docker phát triển và phát huy hiệu quả trong quá trình triển khai ứng dụng Khi bắt đầu sử dụng Docker, người dùng sẽ làm quen với các hình ảnh đầu tiên để dễ dàng xây dựng và quản lý môi trường Các hình ảnh này có thể được chia sẻ nhẹ nhàng qua Docker registry, giúp doanh nghiệp và nhà phát triển dễ dàng phân phối và mở rộng dự án Điều đặc biệt của Docker Image là khả năng chạy trên nhiều môi trường khác nhau mà vẫn duy trì tính nhất quán, giúp giải quyết triệt để vấn đề không đồng bộ trong cài đặt môi trường làm việc.

Docker image là tập hợp các file bao gồm tất cả các yếu tố cần thiết để môi trường container hoạt động đầy đủ, như file cài đặt, mã nguồn ứng dụng và các phụ thuộc Có hai cách để tạo Docker image: một là phương pháp tương tác, khởi chạy một container từ image có sẵn, lưu lại các thay đổi bên trong và tạo thành image mới; hai là sử dụng Dockerfile, một tệp văn bản cung cấp hướng dẫn và môi trường để xây dựng image một cách tự động.

Tên và tag trong image: o Cấu trúc tên của Docker image: :

Trong Docker, các hình ảnh có cùng tên được tập hợp lại thành repository, còn tag dùng để chỉ ra phiên bản của hình ảnh đó Khi không chọn tag, Docker tự động hiểu là “latest”, và một hình ảnh có thể sở hữu nhiều tag khác nhau để dễ quản lý Mỗi hình ảnh còn được định danh bằng Image ID, là một chuỗi duy nhất do Docker tạo ra một cách ngẫu nhiên để đảm bảo tính nhận diện chính xác của từng hình ảnh.

Trong Docker, mỗi file cấu thành nên một Docker image gọi là một layer, giúp tối ưu kích thước của image nhờ vào cơ chế chia sẻ và tái sử dụng các lớp này Các lớp này sử dụng hệ thống copy-on-write và chỉ có thể đọc, gọi là intermediate layer (lớp trung gian), được xây dựng chồng lên nhau theo từng giai đoạn (stage), với mỗi lớp phía trên phụ thuộc vào lớp bên dưới để đảm bảo tính liên tục và hiệu quả của quá trình xây dựng Docker image.

Hình 2-3 Các layer trong image

Hệ thống phân cấp các lớp trong Docker giúp quản lý vòng đời của hình ảnh hiệu quả hơn Khi thay đổi bên trong một lớp, Docker chỉ xây dựng lại các lớp phụ thuộc, đặc biệt là các lớp thường xuyên thay đổi như mã nguồn ứng dụng Điều này tối ưu hóa quá trình cập nhật và giảm thiểu thời gian xây dựng lại hình ảnh, nâng cao hiệu quả làm việc của quá trình phát triển phần mềm.

Khi tải một image, thực chất ta đang tải các layer của image

Hình 2-4 Các layer trong image 2

Khi Docker khởi chạy một container từ image, một lớp nhỏ có thể được thêm vào ở layer cao nhất để lưu trữ tất cả các thay đổi trong quá trình chạy Các lớp này phản ánh sự khác biệt giữa các container đang hoạt động, cho phép chúng chia sẻ các lớp nền tảng bên dưới mà vẫn duy trì trạng thái riêng biệt Điều này tối ưu hóa khả năng quản lý và tiết kiệm tài nguyên trong quá trình vận hành container.

Hình 2-5 Container layer o Parent image:

Trong hầu hết các trường hợp, layer đầu tiên của một hình ảnh Docker là parent image, đóng vai trò làm nền tảng để xây dựng các layer tiếp theo Docker Inc đã tạo và phân phối miễn phí các hình ảnh của mình trên Docker Hub, trong đó base image đóng vai trò quan trọng như nền tảng ban đầu cho các ứng dụng và dịch vụ.

Base image là lớp khởi đầu rỗng giúp người dùng xây dựng Docker image từ đầu, mang lại toàn quyền kiểm soát và phù hợp với những người dùng có kỹ năng chuyên sâu Docker manifest đóng vai trò quan trọng trong việc quản lý các thành phần của hình ảnh Docker, giúp đảm bảo tính nhất quán và khả năng mở rộng của các container Hiểu rõ về base image và Docker manifest sẽ nâng cao khả năng tùy biến và tối ưu hóa quá trình phát triển ứng dụng trên nền tảng Docker.

Tệp manifest mô tả các lớp bên trong một layer của Docker image, giúp so sánh các hình ảnh khác nhau, thậm chí khi chúng có các tag khác nhau Manifest được biểu diễn dưới dạng JSON, chứa các thông tin về kiến trúc của image, điều này giúp Docker client xác định tính tương thích của image với thiết bị Nhờ đó, Docker client có thể quyết định cách khởi tạo container mới một cách chính xác và hiệu quả.

Nhờ vào tệp manifest Docker image, chúng ta có thể tạo ra các hình ảnh đa kiến trúc, cho phép một ảnh Docker có nhiều biến thể phù hợp với các kiến trúc phần cứng khác nhau và đôi khi cả các hệ điều hành khác nhau Điều này giúp tăng tính linh hoạt và khả năng tương thích của các container trên đa nền tảng.

Docker tự động chọn biến thể phù hợp với kiến trúc máy tính của bạn khi tải image về, giúp quá trình cài đặt trở nên dễ dàng và hiệu quả hơn Hầu hết các image đều cung cấp nhiều phiên bản kiến trúc khác nhau, như image trong hình hỗ trợ đa dạng các phiên bản của kiến trúc ARM, đảm bảo khả năng tương thích cao với nhiều hệ thống khác nhau.

Docker networking

Docker trở thành một công cụ mạnh mẽ nhờ vào khả năng networking vượt trội, cho phép kết nối các container với nhau một cách dễ dàng Docker networking không chỉ giúp thiết lập các kết nối giữa các container mà còn kết nối chúng với Internet bên ngoài, mở rộng khả năng quản lý và vận hành hệ thống containerized.

Docker hỗ trợ nhiều loại driver mạng phù hợp với từng trường hợp cụ thể, khác biệt so với networking trong VM hoặc máy chủ vật lý Trong khi VM linh hoạt hơn về cấu hình mạng như NAT hoặc host networking, Docker chủ yếu sử dụng bridge network trên Linux Việc cô lập mạng trong container dựa vào network namespace thay vì mạng riêng biệt, giúp tăng hiệu quả và bảo mật Một máy chủ vật lý có thể chạy hàng trăm container, đòi hỏi hệ thống mạng của Docker phải mở rộng để đáp ứng quy mô lớn, trong khi VM thường không gặp vấn đề về giới hạn mạng vì ít tiến trình hơn.

Docker container sử dụng một trong các loại mạng do Docker cung cấp như bridge, overlay hoặc macvlan để kết nối và quản lý mạng nội bộ Mỗi mạng trong container có các thành phần như network interface, gateway, bảng định tuyến và DNS để đảm bảo hoạt động ổn định Mặc định, khi chạy một container Docker, các cổng không được mở ra bên ngoài trừ khi sử dụng tham số -p hoặc publish để mở cổng container ra bên ngoài Điều này giúp kiểm soát và bảo vệ các dịch vụ trong container khỏi truy cập không mong muốn từ bên ngoài mạng.

Giá trị flag Mô tả

-p 8080:80 Ánh xạ TCP port 80 của container với port 8080 của Docker host (giao thức tcp)

-p 192.168.1.100:8080:80 Ánh xạ TCP port 80 của container với port 8080 của Docker host cho kết nối đến host 192.168.1.100

-p 8080:80/udp Ánh xạ UDP port 80 của container với port 8080 của Docker host

-p 8080:80/tcp -p 8080:80/udp Ánh xạ TCP port 80 của container với

TCP port 8080 Docker host, và ánh xạ UDP port 80 của container với UDP

8080 của Docker host o Ip address and hostname:

Docker tự động gán một địa chỉ IP cho container dựa trên network mà nó kết nối, dựa trên IP Pool của network đó Điều này giúp Docker daemon hoạt động như một máy chủ DHCP hiệu quả cho từng container, đảm bảo mỗi container có địa chỉ IP riêng biệt Ngoài ra, mỗi mạng còn có subnet mask và gateway mặc định, giúp quản lý và kết nối các container một cách dễ dàng và tối ưu.

Khi khởi tạo một container, nó chỉ có thể kết nối đến một network duy nhất, nhưng Docker cho phép kết nối một container đang chạy với nhiều network khác nhau để tăng tính linh hoạt trong quản lý mạng Ngoài ra, người dùng có thể chỉ định địa chỉ IP riêng cho container trên một network bằng cách sử dụng các tham số ip hoặc ipv6, giúp quản lý địa chỉ mạng một cách chính xác và dễ dàng hơn.

Mặc định hostname của container cũng chính là Docker container id, ta cũng có thể ghi đè hostname bằng cách dùng tham số hostname o DNS service:

Mặc định, container kế thừa cấu hình DNS từ host, có thể tìm thấy ở

Container sử dụng bridge network mặc định sẽ tạo một file copy tương tự, trong khi các container sử dụng custom network sẽ sử dụng Docker

Embedded DNS cho việc tìm kiếm DNS

Mặc định Docker sẽ có sẵn 3 loại network: Bridge, Host, None

Docker tự động khởi tạo container trong mạng Bridge (docker0) khi không chỉ định mạng khác, đây là mạng nội bộ do Docker tạo và quản lý để đảm bảo kết nối giữa các container một cách dễ dàng và an toàn.

Bridge đảm nhận việc liên kết giao tiếp giữa các container với nhau và với internet của máy chủ

Docker host có thể kết nối đến tất cả các container thông qua địa chỉ ip được cấp

Khi khởi động, Docker engine sẽ tìm một subnet network chưa được sử dụng trên Docker host (thường là 172.17.0.0/16) và gán địa chỉ đầu tiên (172.17.0.1) cho docker0

Mặc định, mạng bridge do Docker tạo ra không hỗ trợ chức năng service discovery, nghĩa là không thể tự động định tuyến gói tin dựa trên tên container hoặc hostname Vì vậy, người dùng cần biết chính xác địa chỉ IP của container để quản lý và liên hệ giữa các container trong mạng Docker.

User-defined bridge network (custom network)

Users can create a Docker network using the bridge driver, known as a custom network This custom network offers several advantages, most notably leveraging the embedded DNS service discovery mechanism.

Host driver network sử dụng mạng do máy chủ host cung cấp, loại bỏ sự cô lập mạng giữa các container và máy chủ host chạy Docker Điều này có nghĩa là khi một container A sử dụng port 80, ứng dụng của container đó cũng khả dụng trên port 80 của máy chủ, khiến không thể đăng ký thêm container nào khác sử dụng cùng port 80 Sử dụng host network giúp các container truy cập trực tiếp vào mạng của máy chủ, tối ưu cho các ứng dụng yêu cầu hiệu năng cao hoặc cần truy cập trực tiếp vào mạng ngoài Tuy nhiên, cần lưu ý về việc hạn chế đăng ký port và khả năng xung đột mạng giữa các container khi sử dụng loại mạng này.

Một hạn chế của mạng host là không thể sử dụng trên Docker Desktop, yêu cầu phải dùng Linux host để hoạt động chính xác Ngoài ra, mạng host còn gặp khó khăn khi chạy nhiều container trên cùng một cổng, do cổng đã được chia sẻ giữa host và các container khác, gây giới hạn trong việc mở rộng và quản lý các container một cách hiệu quả.

Tất cả network interface của máy chủ host được khả dụng trong container, container sẽ không được cấp phát địa chỉ ip như bridge network

Host network rất hữu dụng trong việc tối ưu hiệu năng vì nó không yêu cầu một NAT ở giữa host và container

Trong Docker, mạng "none" sẽ không gắn container vào bất kỳ mạng nào, khiến container không thể truy cập từ bên ngoài Điều này thường được sử dụng khi muốn tắt mạng cho một container cụ thể, đảm bảo tính cô lập và tăng cường bảo mật cho container đó.

Overlay driver được dùng cho giao tiếp giữa nhiều host network (Docker

Overlay network là một mạng ảo phân tán được xây dựng trên nhiều host network, giúp các container trên nhiều máy chủ có thể giao tiếp một cách dễ dàng Công nghệ này thường được sử dụng trong các hệ thống như Swarm hoặc Kubernetes để đảm bảo kết nối liên tục và an toàn giữa các dịch vụ container phân tán Tưởng tượng overlay network như một mảng ảo được tạo lập trên nhiều host, tạo điều kiện thuận lợi cho việc liên lạc giữa các container trên nhiều máy chủ khác nhau trong môi trường phân tán.

Trong Docker, các container trong cùng một mạng và trên cùng một host có thể giao tiếp với nhau một cách dễ dàng, nhưng để kết nối container qua các host khác, cần phải publish port của container và thiết lập routing qua Internet, điều này không an toàn và không hiệu quả Overlay network thiết lập một lớp mạng ảo giúp kết nối trực tiếp giữa các container, tăng cường bảo mật và hiệu suất cho hệ thống.

Việc biết chính xác địa chỉ IP để giao tiếp giữa các container gây ra nhiều trở ngại, nhưng Embedded DNS server ra đời nhằm giải quyết vấn đề này một cách hiệu quả.

Cơ chế service discovery của DNS server hoạt động như một bảng định tuyến IP, ánh xạ hostname và ID của container đến địa chỉ IP của chúng, giúp các container kết nối với nhau dễ dàng mà không cần biết chính xác IP.

Docker Data Storage

Trong Docker, Storage là tính năng quan trọng để quản lý dữ liệu của container, bao gồm các file phát sinh trong quá trình chạy ứng dụng như log, dữ liệu, báo cáo và các loại file khác Việc sử dụng Storage giúp đảm bảo dữ liệu được lưu trữ an toàn, dễ dàng truy xuất và quản lý khi cần thiết Tính năng này đóng vai trò thiết yếu trong việc duy trì hiệu suất và bảo mật của hệ thống Docker.

Khi một container được khởi chạy, dữ liệu trong quá trình vận hành được lưu trữ trên writable layer, tuy nhiên dữ liệu này sẽ bị mất đi khi container bị xóa Một nhược điểm quan trọng của phương pháp này là dữ liệu trong container rất khó chia sẻ với các container khác, gây hạn chế trong việc mở rộng và quản lý dữ liệu hiệu quả.

Vậy để giải quyết các vấn đề này, Docker đưa ra một cơ chế để quản lý data của các Container đó là Docker Storage

Về bản chất, Docker Storage là một cơ chế cho phép lưu trữ các data của

Container vào Docker Host bằng cách mount một folder từ Docker Container vào Docker Host

Việc mount dữ liệu trong container giúp bảo vệ dữ liệu an toàn hơn và dễ dàng chia sẻ giữa các container Các thư mục chứa cài đặt hoặc log được truy cập dễ dàng hơn, hỗ trợ quá trình troubleshoot container hiệu quả hơn Đây là giải pháp tối ưu để quản lý dữ liệu và cải thiện hiệu suất hoạt động của container.

Có 3 kiểu mount của Docker Storage đó là: o Volumes: Mount-point sẽ nằm ở /var/lib/docker/volumes/ của Docker

Docker cho phép quản lý host bằng cách sử dụng các loại mount như bind mounts và tmpfs mounts Bind mounts cho phép xác định điểm gắn kết nằm ở bất kỳ đâu trên Docker Host không do Docker quản lý, giúp dễ dàng chia sẻ dữ liệu giữa container và hệ thống ngày Trong khi đó, tmpfs mounts lưu dữ liệu trực tiếp vào bộ nhớ của Docker Host, mang lại tốc độ truy cập cao nhưng dữ liệu sẽ bị mất đi khi container dừng hoặc khởi động lại, phù hợp cho các dữ liệu tạm thời.

Volume hoạt động tương tự như bind mounts nhưng được quản lý bởi Docker, giúp dễ dàng quản lý dữ liệu container Khác với bind mounts yêu cầu file hoặc thư mục tồn tại trên Docker host, volume có thể tạo ra mà không cần phải tồn tại sẵn, và được lưu trữ tại thư mục /var/lib/docker/volumes/ Ngoài ra, volume còn hỗ trợ cơ chế của volume drivers, cho phép lưu trữ dữ liệu trên các server remote hoặc nền tảng đám mây, nâng cao tính linh hoạt và mở rộng của hệ thống lưu trữ Docker.

45 o Bạn có thể quản lý volume sử dụng CLI hoặc API o Volume hoạt động trên cả Linux và Windows container

Using volumes in Docker is essential when sharing data between multiple containers, ensuring persistent storage across container instances They are ideal for saving data to remote servers or cloud storage for reliable access and scalability Volumes are also crucial for backing up, restoring, or migrating data seamlessly between different Docker hosts, facilitating smoother data management Additionally, volumes offer easier and more convenient management compared to bind mounts, making them the preferred choice for persistent data handling in containerized applications.

Khi mount volume vào thư mục của container đã có dữ liệu, dữ liệu từ container sẽ được sao chép vào volume trên Docker host Nếu không tạo volume trước, Docker sẽ tự động tạo volume mới khi chạy container, giúp dữ liệu tồn tại ngoài vòng đời của container Ví dụ lệnh Docker để mount volume là: docker run -itd name webapp mount source=webapp-vol,destination=/var/centos Volume thường là lựa chọn ưu việt hơn so với sử dụng writable layer của container, vì sử dụng volume không làm tăng dung lượng của container.

Bind mounts trong Docker xuất hiện trước Volume và thường có hiệu năng tốt hơn, nhưng bị giới hạn về một số tính năng so với Volume Chúng phụ thuộc vào cấu trúc filesystem của Docker host, khiến cho việc quản lý trở nên linh hoạt hơn nhưng cũng có hạn chế về tính mở rộng và tính di động của dữ liệu.

Khi sử dụng bind mount thì một file hoặc một folder trong docker host được mount vào trong container File hoặc Folder này yêu cầu đường dẫn tuyệt đối

Vậy nên, trong trường hợp file hoặc folder này không tồn tại trên docker host, thì quá trình mount sẽ bị lỗi

Bind mounts are ideal when sharing configuration files between the Docker host and containers, ensuring seamless access and updates They are also useful for sharing source code or environment directories from the Docker host with containers, enabling efficient development workflows Additionally, bind mounts should be used when the Docker host's filesystem structure is well-defined and aligns with the specific requirements of the bind mount setup, providing clarity and consistency in container management.

502 Bad GatewayUnable to reach the origin service The service may be down or it may not be responding to traffic from cloudflared

502 Bad GatewayUnable to reach the origin service The service may be down or it may not be responding to traffic from cloudflared

502 Bad GatewayUnable to reach the origin service The service may be down or it may not be responding to traffic from cloudflared

47 o tmpfs mount sẽ lưu dữ liệu tạm thời trên memory Khi container stop, tmpfs mount sẽ bị xóa bỏ.

Dockerfile

502 Bad GatewayUnable to reach the origin service The service may be down or it may not be responding to traffic from cloudflared

Chỉ thị trong Dockerfile không phân biệt chữ hoa thường Tuy nhiên, quy ước nên ghi hoa các chỉ thị để dễ dàng phân biệt với các tham số

Docker xem các dòng bắt đầu bằng kí tự # là comment

Trong quá trình xây dựng Docker, các chỉ thị được thực thi theo thứ tự từ trên xuống dưới, đảm bảo quá trình tạo hình container diễn ra chính xác Dockerfile bắt buộc phải bắt đầu bằng lệnh FROM để xác định hình ảnh gốc, đồng thời các comment và ARG có phạm vi toàn cục có thể đứng ở vị trí bất kỳ trước hoặc sau lệnh này Việc sắp xếp hợp lý các chỉ thị giúp tối ưu hóa quá trình dựng hình và quản lý container hiệu quả hơn.

Các biến môi trường được khai báo bằng chỉ thị ENV, các biến này được khai báo dưới dạng key-value bằng các chuỗi

Cú pháp: o ENV = o Ví dụ: ENV version=1.0

Khi dùng lên docker run ta có thể thay đổi biến môi trường bằng flag –env

Biến chỉ được sử dụng trong các chỉ thị: ADD, COPY, ENV, EXPOSE,

FROM, LABEL, STOPSIGNAL, USER, VOLUME, WORKDIR

Mỗi chỉ thị (instruction) trong Dockerfile thực hiện một nhiệm vụ nhất định

Các chỉ thị FROM, RUN, ADD, COPY, CMD, ENTRYPOINT, … sẽ tạo một layer trong image

Để xác định image nào là image cơ sở cho quá trình tạo image mới, cần chỉ rõ hình ảnh sẽ thực thi các lệnh tiếp theo Các image này thường được tải từ các Repository registry như Docker Hub hoặc các registry riêng, giúp đảm bảo quá trình xây dựng và triển khai container diễn ra chính xác và hiệu quả.

Chỉ thị ENV được biểu diễn dưới dạng key-value, trong đó ENV gán giá trị cho biến key dưới dạng chuỗi Biến này sau đó có thể được sử dụng trong các chỉ thị tiếp theo, giúp quản lý biến môi trường một cách linh hoạt và rõ ràng Việc sử dụng ENV dưới dạng key-value tối ưu hóa khả năng kiểm soát các biến môi trường trong quá trình triển khai và vận hành hệ thống.

Chỉ thị dùng để thêm meta data vào hình ảnh khi được tạo, dưới dạng key-value trong chuỗi Bạn có thể chỉ định nhiều LABEL cho một hình ảnh, nhưng các key phải là duy nhất; nếu khai báo trùng, giá trị mới sẽ ghi đè lên giá trị cũ của key đó.

Chỉ thị MAINTAINER dùng để khai báo thông tin tác giả, hiện nay chỉ thị này đang được thay thế bằng LABEL maintainer

Chỉ thị USER dùng để gán `username` hoặc `uid` để sử dụng khi chạy image và các chỉ thị RUN, CMD, ENTRYPOINT

The ADD directive copies files and folders from the source machine, including files generated from URLs in the `src` directory, and adds them to the image's filesystem within the specified `dest` directory.

Chỉ thị COPY cũng tương tự như ADD, sao chép thư mục từ `src` và thêm vào

`dest` của image, khác với ADD nó không hỗ trợ thêm các file bằng url

Lệnh RUN trong Dockerfile dùng để chạy một lệnh nào đó trong quá trình xây dựng hình ảnh Tùy thuộc vào image gốc được khai báo ở dòng FROM, các câu lệnh RUN sẽ phù hợp và thực thi tương ứng Kết quả của mỗi lệnh RUN sẽ được commit lại, tạo thành một layer mới trong quá trình xây dựng image, giúp tối ưu hóa quá trình tạo và quản lý các image Docker.

RUN thường được sử dụng để cài đặt package và các phụ thuộc

Chỉ thị CMD định nghĩa các câu lệnh sẽ được chạy khi container được khởi động Có thể khai báo nhiều CMD nhưng chỉ CMD cuối cùng được chạy

Chỉ thị ENTRYPOINT hoạt động tương tự CMD, tuy nhiên ENTRYPOINT không thể bị ghi đè từ dòng lệnh khi khởi tạo container

Thiết lập port mà container sẽ lắng nghe, cho phép các container trên cùng network giao tiếp qua cổng này, hoặc ánh xạ với port của host

Trong Docker, chỉ thị ARG cho phép người dùng định nghĩa biến có thể truyền vào khi xây dựng hình ảnh bằng cờ –build-arg = Khi người dùng cung cấp một tham số không được khai báo trong Dockerfile, hệ thống sẽ cảnh báo trong quá trình build, giúp đảm bảo tính nhất quán và kiểm soát tốt hơn quá trình tạo hình ảnh Docker.

Ta có thể định nghĩa một ARG với giá trị mặc định

Chỉ thị WORKDIR chỉ đỉnh thư mục mà các lệnh RUN, CMD,

ENTRYPOINT, COPY, ADD thực hiện Nếu thư mục không tồn tại, Docker sẽ tạo ra nó

WORKDIR có thể được sử dụng nhiều lần trong Dockerfile, nếu dùng đường dẫn tương đối, nó sẽ đứng ở thư mục của lệnh WORDIR trước đó

Chỉ thị VOLUME cho phép tạo một vùng nhớ và đánh dấu nó đang giữ vùng nhớ từ host hoặc container khác

Khi container chạy sẽ khởi tạo một vùng nhớ mới với dữ liệu tồn tại trong base image

2.6.4 Shell form và Exec form

Cả ba chị thị RUN, CMD, ENTRYPOINT đều có 2 dạng thực thi: shell form và exec form

Khi chị thị được thi trong chế độ shell form, nó sẽ gọi lệnh /bin/sh -c để thực thi, và quá trình xử lý shell diễn ra Ví dụ, bạn có thể sử dụng một Dockerfile đơn giản để minh họa cách hoạt động này.

Khi khởi tạo container từ image được build bằng Dockerfile này, kết quả đầu ra sẽ là câu “Xin chào Nguyễn Văn A” Điều này xảy ra vì shell đã xử lý và thay thế biến ${name} bằng giá trị của biến môi trường ENV name, đảm bảo cấu hình linh hoạt và tùy biến cho container Docker của bạn.

Exec form sẽ được xử dụng nhiều hơn với CMD và ENTRYPOINT

Format: [“executable”, “param1”, “param2”]

Khi chỉ thị ở dạng exec form, nó sẽ thực thi trực tiếp và xử lý shell sẽ không xảy ra Ví dụ:

Khi chạy container này output sẽ là “Xin chào ${name}”, biến ${name} không được xử lý thay thế

Ta có thể sử dụng exec form với /bin/sh như một executable để shell có thể xử lý như bình thường

Khi này output sẽ là “Xin chào Nguyễn Văn A”

CMD cho phép ta định nghĩa command mặc định, nghĩa là command sẽ được chạy khi container chạy mà không chỉ định command nào

Nếu có command được chỉ định khi container chạy, thì command mặc định sẽ bị bỏ qua

CMD can be executed in three forms: the exec form, written as CMD ["executable", "param1", "param2"]; the form that sets default parameters for ENTRYPOINT in exec form, written as CMD ["param1", "param2"]; and the shell form, which uses a command line syntax like CMD command param1 param2 Understanding these different CMD execution formats is essential for effective Docker container configuration and optimal image design.

Trong các cách, cách 1 và cách 3 sẽ không được đề cập thêm, trong khi cách 2 được sử dụng cùng với ENTRYPOINT trong dạng exec Phương pháp này thiết lập các tham số mặc định cho ENTRYPOINT, giúp container hoạt động đúng nếu không có đối số truyền vào Tuy nhiên, nếu người dùng không cung cấp đối số khi chạy container, các tham số này sẽ bị bỏ qua, đảm bảo tính linh hoạt trong quá trình triển khai.

Có chức năng tương tự lệnh CMD, tuy nhiên ENTRYPOINT và các tham số không bị bỏ qua khi container chạy

ENTRYPOINT có 2 dạng là shell form và exec form

Exec form của ENTRYPOINT cho phép ta đặt các lệnh và tham số và sau đó sử dụng một trong hai cách: o CMD đặt các tham số bổ sung

57 o Các đối số ENTRYPOINT (luôn được sử dụng), trong khi các đối số CMD có thể bị ghi đè từ dòng lệnh khi container chạy

Khi chạy container từ Dockerfile này output sẽ là “Xin chào các bạn”

Trước khi Docker tiến hành build image, nó sẽ kiểm tra xem trong bối cảnh đang build có file dockerignore hay không Nếu có, Docker sẽ bỏ qua các thư mục và tập tin được mô tả trong tập tin dockerignore Điều này giúp tối ưu quá trình build bằng cách loại bỏ những thành phần không cần thiết khỏi hình ảnh Docker Việc sử dụng file dockerignore là một bước quan trọng để giảm kích thước hình ảnh và tăng tốc độ xây dựng Docker.

Docker build

Docker build là chức năng phổ biến nhất của Docker engine, đóng vai trò quan trọng trong quá trình phát triển phần mềm, giúp tạo và xây dựng image mới một cách nhanh chóng và dễ dàng Khi cần phát hành phiên bản mới hoặc cập nhật dự án, Docker build chính là công cụ hỗ trợ đắc lực để thực thi quá trình này hiệu quả Việc sử dụng Docker build giúp tối ưu hóa vòng đời phát triển phần mềm, đảm bảo các container luôn được cập nhật và nhất quán.

Docker Buildx là một client mới, một plugin CLI mở rộng docker command

Build context là một tập hợp các file ở /PATH được truyền vào lệnh docker build PATH, khi đó PATH được gọi là PATH context

Là kĩ thuật rất hữu ích đối với những ai đang gặp khó khăn trong việc tối ưu Dockerfile mà vẫn giữ Dockfile dễ đọc và bảo trì code

Một trong những thách thức lớn khi tối ưu hóa Docker image là giữ cho dung lượng của image càng nhỏ càng tốt Mỗi lệnh RUN, COPY, ADD trong Dockerfile sẽ tạo ra một layer mới, do đó, việc quản lý và loại bỏ những tệp không cần thiết giúp giảm kích thước của từng layer và overall image Việc dọn dẹp các tệp không cần thiết sau khi thực hiện các lệnh sẽ giúp duy trì image nhẹ, tối ưu hiệu suất và giảm thời gian tải.

Quản lý hai Dockerfile cho môi trường Development và Production có thể dễ dàng hơn khi sử dụng các cách tối ưu hóa phù hợp, chẳng hạn như tạo Dockerfile riêng biệt cho từng môi trường để đảm bảo tính rõ ràng và dễ bảo trì Một Dockerfile dành cho phát triển thường bao gồm các công cụ và phần mềm hỗ trợ quá trình lập trình và kiểm thử, trong khi Dockerfile cho Production nên được tối giản, chỉ chứa những phần cần thiết để đảm bảo hiệu suất và bảo mật Việc quản lý đồng thời hai Dockerfile có thể gây phức tạp và giảm hiệu quả quản lý dự án, do đó, cần có chiến lược tối ưu để duy trì sự nhất quán mà vẫn tối ưu hóa từng môi trường.

Lệnh FROM trong Docker có thể được sử dụng nhiều lần trong một Dockerfile để tạo nhiều stages khác nhau Điều này cho phép bạn sử dụng mỗi lệnh FROM cho từng base image riêng biệt, từ đó xây dựng nhiều stage độc lập trong quá trình build Bạn có thể sao chép các thành phẩm cần thiết từ một stage sang stage khác hoặc loại bỏ các stage không cần thiết, giúp tối ưu hóa quá trình tạo hình ảnh Docker hiệu quả hơn.

Mặc định, các stage không được đặt tên, và chúng ta có thể truy cập vào chúng bằng số thứ tự bắt đầu từ 0 Tuy nhiên, để dễ quản lý và theo dõi hơn, bạn có thể đặt tên cho các stage bằng cách sử dụng cú pháp "AS " sau lệnh FROM, giúp đảm bảo tính rõ ràng và linh hoạt trong quá trình xử lý dữ liệu.

2.7.3 Sử dụng stage trước đó

Ta có thể thu thập các tài liệu, sản phẩm ở stage trước đó như ví dụ sau:

Trong quá trình phát triển phần mềm, việc liên tục bổ sung và chỉnh sửa mã nguồn dẫn đến nhu cầu phải build lại hình ảnh Docker nhiều lần Nhờ cơ chế cache của Docker build, quá trình này trở nên hiệu quả hơn nhờ vào khả năng lưu trữ và không cần build lại những layer không thay đổi, giúp tiết kiệm thời gian và tài nguyên hệ thống.

Ví dụ ta có một Dockerfile như này:

Với mỗi lệnh Dockerfile sẽ dịch ra thằng từng layer, ta có thể mô tả như sau

Khi một layer thay đổi, ta cần build lại layer đó để đảm bảo tính nhất quán của container Việc sửa mã nguồn như trong file main.c sẽ khiến Docker bị invalid cache cho stage COPY, dẫn đến việc build lại layer này Thay đổi ở Layer 3 sẽ kéo theo các layer 4, 5 cũng phải được build lại, làm tăng thời gian build Để tối ưu hóa caching, nên đưa những stage dễ thay đổi xuống cuối cùng của Dockerfile, giúp hạn chế việc build lại các layer không cần thiết Ví dụ, hoán đổi thứ tự của stage 3 và 4 sẽ giúp chỉ phải build lại 2 layer thay vì tất cả, từ đó nâng cao hiệu quả và giảm thời gian build.

Vai trò của Docker

Linh động giúp triển khai dễ dàng ở nhiều môi trường khác nhau nhờ loại bỏ sự phụ thuộc của ứng dụng vào tầng hệ điều hành và cơ sở hạ tầng Điều này đảm bảo tính linh hoạt và mở rộng của hệ thống, phù hợp với nhiều yêu cầu khác nhau của doanh nghiệp.

• Tiết kiệm không gian: container được xây dựng dựa trên nhiều image có sẵn, từ đó tiết kiệm được nhiều không gian lưu trữ hơn

• Đồng nhất: không có sự sai khác về mặt môi trường khi triển khai ở bất kỳ nơi đâu, tạo ra sự nhất quán khi làm việc theo nhóm

Các container được tạo gần như ngay lập tức nhờ chia sẻ hệ điều hành chủ, giúp quá trình khởi động diễn ra nhanh chóng và tối ưu hóa hiệu suất hệ thống.

SỬ DỤNG DOCKER

Cài đặt

Sử dụng WSL 2 backend: o Windows 11 64-bit: Home hoặc Pro phiên bản 21H2 trở lên hoặc Enterprise hoặc Education phiên bản 21H2 trở lên

To run this setup, ensure you have Windows 10 64-bit with either Home or Pro edition, version 21H1 (build 19043) or later, or Enterprise or Education edition, version 20H2 (build 19042) or later Additionally, you must enable the Windows Subsystem for Linux 2 (WSL 2) feature on your Windows device For detailed instructions on enabling WSL 2, please refer to Microsoft's official documentation.

Cần có các điều kiện tiên quyết về phần cứng sau đây để chạy thành công WSL

Để chạy Windows 10 hoặc Windows 11, máy tính của bạn cần có bộ xử lý 64 bit hỗ trợ Dịch địa chỉ cấp hai (SLAT) và tối thiểu 4GB RAM hệ thống Bạn cũng cần bật ảo hóa phần cứng trong cài đặt BIOS để đảm bảo hoạt động tối ưu của các công nghệ ảo hóa Ngoài ra, để sử dụng WSL 2 trên Windows, bạn phải kích hoạt tính năng này theo hướng dẫn của Microsoft và tải xuống cũng như cài đặt gói cập nhật nhân Linux phù hợp Để biết thêm chi tiết về các bước thiết lập, hãy tham khảo tài liệu chính thức của Microsoft về WSL 2 và ảo hóa trên Windows.

Tải Docker destktop tại Docker desktop cho Window

Để cài đặt Docker Desktop thành công, làm theo các hướng dẫn cài đặt thông thường và bật WSL 2 khi hệ thống yêu cầu Sau đó, khởi động Docker Desktop từ menu Start của Windows, truy cập vào Settings > General, và chọn hộp kiểm "Use WSL 2 based engine"; tùy chọn này sẽ được kích hoạt mặc định nếu hệ thống đã hỗ trợ WSL 2 Cuối cùng, nhấn "Apply & Restart" để hoàn tất quá trình cài đặt Docker Desktop.

Kích hoạt hỗ trợ Docker trong các bản phân phối WSL 2:

Để đảm bảo phân phối Linux chạy đúng chế độ WSL 2, bạn có thể kiểm tra trạng thái bằng lệnh "wsl.exe -l -v" trong PowerShell Nếu cần nâng cấp phân phối hiện tại lên WSL 2, sử dụng lệnh "wsl.exe set-version (tên phân phối) 2" Để đặt WSL 2 làm mặc định cho các phân phối mới trong tương lai, chạy "wsl.exe set-default-version 2" Ngoài ra, khi Docker Desktop khởi động, bạn có thể truy cập vào Settings > Resources > WSL để cấu hình và tối ưu hóa hiệu suất hoạt động với WSL 2.

Tích hợp Docker-WSL sẽ tự động bật trên bản phân phối WSL mặc định của bạn, giúp quá trình cài đặt và vận hành dễ dàng hơn Để thay đổi bản phân phối WSL mặc định, bạn có thể sử dụng lệnh `wsl set-default `, đảm bảo môi trường phát triển của bạn phù hợp với nhu cầu sử dụng Docker và WSL.

Ví dụ: để đặt Ubuntu làm bản phân phối WSL mặc định của bạn, hãy chạy wsl set-default ubuntu

Theo tùy chọn, hãy chọn bất kỳ bản phân phối bổ sung nào bạn muốn bật tích hợp Docker-WSL

Bước 1: Update các package và cài các package cần thiết với các lệnh sau: sudo apt-get update sudo apt-get install \

64 apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common

To add Docker’s official GPG key on Ubuntu, use the command: curl -fsSL insecure https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add – Afterward, verify the key by checking the last 8 characters of the output with the command: sudo apt-key fingerprint 0EBFCD88 This process ensures the authenticity of Docker's GPG key for secure installation.

Key fingerprint = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 uid Docker Release (CE deb) sub 4096R/F273FCD8 2017-02-22

Bước 3: Cài Docker repository: sudo add-apt-repository \

"deb [arch=amd64] https://download.docker.com/linux/ubuntu \

Bước 4: Tiến hành cài đặt Docker: sudo apt-get update sudo apt-get install docker-ce

Xác nhận kết quả cài đặt thành công bằng việc run image hello-world sudo docker run hello-world

Và đây là kết quả nếu thành công:

Hình 3-1 Cài đặt Docker trên Linux thành công

Các lệnh thường dùng trong Docker

** Tên và ID của image, container, network sẽ được Docker xử lý tương tự nhau ta có thể dùng 1 trong 2 để định danh một image, container và network

3.2.1 Images Để xem tất cả image đang có trong máy, dùng lệnh docker images

Thông tin của hình ảnh được hiển thị bao gồm tên repository, tag của hình ảnh, ID của hình ảnh, ngày tạo và kích thước Để tải hình ảnh từ registry về, bạn có thể sử dụng lệnh Docker pull với cú pháp `docker pull :`, trong đó tag mặc định sẽ là "latest".

Xóa image bằng lênh docker rmi : hoặc docker rmi

Ta có thể gắn tag mới và đổi tên image từ một image có sẵn bằng lệnh docker tag : :

Lấy danh sách các container đang chạy trên host dùng lệnh: docker ps

Ngoài ra có thể thêm flag -a để lấy tất các container đang có trên host (kể cả đang chạy và ngừng)

Chạy một container từ image dùng lệnh docker run [OPTIONS] , các flag, tùy chọn có thể xem ở Docker docs

Tham số -it trong ví dụ ta có thể làm việc với container trên console

68 Để dừng một container ta dùng lệnh docker pause [OPTIONS]

Lệnh docker stop [OPTIONS] sẽ tắt hản container đó (giống như shutdown)

Lệnh docker start [OPTIONS] giúp ta cho chạy lại các container ở trạng thái Exited

Còn lệnh docker unpause [OPTIONS] sẽ cho container tiếp tục chạy lại sau khi bị dừng

Docker container hỗ trợ xem log dễ dàng thông qua các lệnh riêng biệt, giúp quản lý và theo dõi hoạt động của container hiệu quả hơn Mặc định, Docker container mở ba luồng I/O gồm STDIN, STDOUT và STDERR, trong đó STDIN là dòng đầu vào từ bàn phím, STDOUT là đầu ra chính của ứng dụng ghi ở /dev/stdout, còn STDERR dùng để xuất thông báo lỗi ghi ở /dev/stderr, hỗ trợ phát hiện và xử lý lỗi nhanh chóng.

Dùng lệnh docker logs [OPTIONS] để xuất log ra console, sử dụng flag -f để theo dõi log trong thời gian thực

Các đối số khi chạy container trong Docker chi tiết có thể tìm thấy trong tài liệu Docker container docs, giúp người dùng hiểu rõ các tùy chọn của lệnh Để xóa một container, bạn có thể sử dụng lệnh docker rm [OPTIONS], lưu ý chỉ có thể xoá các container đã dừng (Exited) để tránh lỗi, còn để xóa ngay lập tức bất kỳ container nào kể cả đang chạy, dùng lệnh docker rm -f [OPTIONS] Ngoài ra, để thực thi một câu lệnh bên trong container, bạn có thể sử dụng lệnh docker exec, mang lại khả năng tương tác và quản lý linh hoạt hơn cho các container Docker.

Ta có thể dùng docker exec để truy cập vào shell của container, ví dụ:

Lấy danh sách tất cả network hiện có dùng lệnh: docker network ls

[OPTIONS] Để xem thông tin chi tiết một network dùng lệnh: docker network inspect

Người dùng có thể định nghĩa một network mới (custom network) với những driver có sẵn, dùng lệnh: docker network create [OPTIONS]

Docker cho phép kết nối một container đang chạy với bất kỳ mạng nào, giúp dễ dàng mở rộng và tích hợp hệ thống Khi container tham gia vào network mới, nó sẽ được cấp phát một địa chỉ IP mới, đảm bảo tính riêng biệt và dễ quản lý trong mạng Tính năng này tối ưu hóa khả năng mở rộng và linh hoạt trong môi trường Docker.

73 Để ngắt kết nối container với network dùng lệnh: docker network disconnect

Cuối cùng để xóa network dùng lệnh: docker network rm

Xem toàn bộ volume đang có trên host, dùng lệnh: docker volume ls

75 Để xem thông tin volume dùng lệnh: docker volume inspect [OPTIONS]

Tạo mới một volume: docker volume create [OPTIONS]

Xóa một volume, dùng lệnh: docker volume rm [OPTIONS]

Tạo image

Một trong những cách hiệu quả nhất để tạo Docker image là dùng Dockerfile, sau đây ta sẽ tiến hành việc tạo một image bằng Docker

Dockerfile sử dụng hình ảnh nginx:alpine làm hình nền chính được pull về từ Docker Hub Các dòng lệnh COPY trong Dockerfile lần lượt sao chép các thư mục từ build context vào container, đảm bảo nội dung cần thiết được chuyển đổi chính xác Điều này giúp cấu hình container chạy nginx một cách tối ưu và dễ quản lý.

Tạo các file default.conf, index.html, health.html

77 o File default.conf dùng để ghi đè cài đặt nginx mặc định để phù hợp với chúng ta o File index.html là trang index của nginx o Source code: Github

78 Để build Dockerfile thành image ta dùng lệnh docker build [OPTIONS] Các đối số của OPTIONS có thể tham khảo Docker build doc

Trong phần trước, chúng ta đã tìm hiểu về các lệnh FROM và COPY, giúp tạo ra các stage là các layer của hình ảnh Docker Khi xem kết quả build, chúng ta sẽ thấy có 4 stage được đánh số từ 1 đến 4 theo thứ tự từ trên xuống dưới trong Dockerfile Để build ảnh trực tiếp tại thư mục hiện tại, bạn chỉ cần sử dụng đường dẫn context là dấu chấm “.” nhằm đảm bảo quá trình build diễn ra chính xác và tiện lợi.

Kiểm tra image mới xây dựng bằng lệnh `docker images` cho thấy image có ID là ab1af3ef2d98, nhưng do chưa thuộc repository nào, việc theo dõi sẽ gặp khó khăn Thông thường, chúng ta sử dụng cờ `-t :` để đặt tên cho image, giúp quản lý dễ dàng hơn Lưu ý rằng nếu cùng tên image và tag đã tồn tại, việc xây dựng mới sẽ ghi đè lên image cũ, đảm bảo phiên bản luôn được cập nhật.

Trong quá trình phát triển, hình ảnh container "ab1af3ef2d98" đã được đưa vào repository "my-nginx" với tag là "dev", giúp quản lý phiên bản dễ dàng Cải tiến đáng chú ý là cơ chế cache của Docker đã được tận dụng hiệu quả ở các stage 2 đến 4 khi nhận diện không có sự thay đổi nào, tối ưu hoá quá trình build Thử nghiệm thay đổi nội dung trong file "index.html" và xây dựng lại container đã cho thấy quá trình build nhanh hơn đáng kể nhờ vào cơ chế cache tự động của Docker, giúp tiết kiệm thời gian và tăng hiệu suất phát triển.

80 o Docker đã invalidate cache cho stage 3,4 và build lại 2 layer này vì thế nên thiết kế các layer sao cho layer thay đổi nhiều nhất luôn nằm trên

Bạn có thể chạy container từ image my-nginx bằng lệnh Docker để kiểm tra kết quả, trong đó sử dụng flag -d để chạy trong chế độ nền và xuất ra container ID Flag name cho phép bạn đặt tên duy nhất cho container, giúp dễ quản lý Port 8080 của máy chủ được ánh xạ với port 80 của container qua giao thức TCP, cho phép truy cập dễ dàng Sau đó, bạn mở trình duyệt và truy cập vào địa chỉ http://localhost:8080 để xem kết quả của container nginx hoạt động chính xác.

Ta có thể kiểm tra lịch sử thay đổi của image bằng câu lệnh: docker history my-nginx:dev

Ứng dụng trang tĩnh của chúng tôi đã chạy thành công, được xây dựng từ image nginx lấy trực tiếp từ Docker Hub Điều này cho thấy rằng, với bất kỳ ứng dụng nào đã có sẵn image base trên registry, chúng ta có thể dễ dàng triển khai và vận hành ứng dụng một cách nhanh chóng và hiệu quả.

3.3.2 Tương tác trực tiếp (interactive) Ở phần trước ta đã biết cách tạo image nhờ vào Dockerfile, tuy nhiên vẫn còn một cách nữa để tạo image mà không dùng Dockerfile, ta sẽ dùng trạng thái của container để lưu nó lại thành một imagerun Đầu tiên ta sẽ tạo một container từ nginx image

Dùng trình duyệt kiểm tra thấy container đã hoạt động

We'll access the container's shell to make necessary edits Next, we'll modify the default.conf file of Nginx to match the example configuration, ensuring optimal performance and proper setup.

Dockerfile và nội dung index.html

Ta truy cập vào lại http://localhost:8080 và nhận thấy nội dung mới đã hoạt động

To commit the changes of a container into an image, use the command: docker commit [OPTIONS] [:] The image "my-nginx:interactive" has been successfully built; now, you can run this image to test its functionality.

Và đây là kết quả:

Ta kiểm tra lịch sử của image mới tạo này: o Layer eff7 chính là những trạng thái ta sửa trong container và commit lại

Bạn có thể tạo image theo phương pháp này, tuy nhiên sẽ gặp khó khăn trong việc quản lý và bảo trì vì nội dung không được hiển thị rõ ràng khi thay đổi Việc chia sẻ và cập nhật image cũng trở nên phức tạp hơn so với sử dụng Dockerfile, đòi hỏi nhiều công đoạn và dễ gây nhầm lẫn trong quá trình phát triển và vận hành.

Lưu image bằng repository registry

Dockerfile có thể dễ dàng chia sẻ, nhưng việc build image mỗi khi muốn chạy lại tốn thời gian Repository registry, như Docker Hub, giúp lưu trữ các image một cách tiện lợi mà không cần chia sẻ Dockerfile, tiết kiệm công sức và thời gian Để bắt đầu, bạn cần truy cập Docker Hub và đăng ký tài khoản; giao diện sau khi đăng ký thành công sẽ là nơi quản lý các image của bạn.

To push an image to Docker Hub, it is essential to configure Docker client correctly by using an access token for authentication You can generate this token within Docker Hub's Settings, ensuring it has the necessary permissions Properly setting up the access token streamlines the login process and facilitates seamless image uploads to Docker Hub.

Sau khi tạo xong ta dùng lệnh docker login -u như hướng dẫn là sẽ được

Vì đây là tài khoản cá nhân và không có quyền đẩy ảnh vào thư viện của Docker, các hình ảnh trong thư viện sẽ không yêu cầu namespace Do đó, cần phải đặt lại nhãn (tag) cho hình ảnh theo định dạng /[:], trong đó namespace chính là tên người dùng (username) của Docker Hub.

Dùng lệnh docker push : để lưu image trên hub

Kiểm tra trên Docker Hub image đã được lưu trong repository tương ứng giờ ta có thể tải image từ bất cứ đâu mà không cần build lại

Tạo repository registry riêng

Docker đã phát triển một phần mềm mã nguồn mở để hỗ trợ các cá nhân, tổ chức cần một self-hosted registry

Ta tải registry image: docker pull registry

Chạy container từ registry image ở port 5000: docker run -d name local-hub

Docker registry cung cấp một số API có thể tim thấy ở Registry API

Thử lấy tất cả repository trong registry bằng endpoint /v2/_catalog

Tag image như đã làm với Docker Hub để đây lên registry mình mới dựng, tuy nhiên namespace bây giờ sẽ là tên miền của registry

Registry đã chứa repository my-nginx

Thử xóa image trong máy host và pull image từ hosted registry về

Như vậy ta đã dựng được một repository registry cho riêng mình bằng chính Docker.

DOCKER COMPOSE

Tổng quan

Compose là công cụ giúp xác định và chạy các ứng dụng Docker có nhiều container một cách dễ dàng Với Compose, người dùng có thể sử dụng tệp YAML để định cấu hình các dịch vụ của ứng dụng một cách linh hoạt và rõ ràng Chỉ với một lệnh duy nhất, bạn có thể tạo và khởi động toàn bộ các dịch vụ dựa trên cấu hình đã thiết lập, giúp tiết kiệm thời gian và tăng hiệu quả quản lý ứng dụng Docker đa container.

Compose hoạt động trong mọi môi trường bao gồm quy trình xây dựng ứng dụng, phát triển, thử nghiệm và CI (Continuous Integration), đảm bảo quá trình phát triển phần mềm liên tục và hiệu quả Các lệnh trong Compose giúp quản lý toàn bộ vòng đời của ứng dụng từ lập trình, kiểm thử đến triển khai, tối ưu hóa quy trình phát triển phần mềm Việc sử dụng Compose hỗ trợ các nhà phát triển duy trì tính nhất quán và hiệu quả trong mọi giai đoạn của dự án.

• Start, Stop, Rebuild lại dịch vụ

• Xem trạng thái của các dịch vụ đang chạy

• Logging các dịch vụ đang chạy

Các tính năng chính của Compose:

• Có nhiều môi trường độc lập trên một máy chủ duy nhất

• Giữ nguyên volumns data cũ khi container mới được tạo

• Chỉ tạo lại các container có sự thay đổi

• Hỗ trợ sử dụng biến

Gồm có 3 bước để sử dụng Compose:

• Xác định môi trường ứng dụng Dockerfile để có thể sao chép môi trường đó ở mọi nơi

Trong file docker-compose.yml, cần xác định các dịch vụ của ứng dụng để chúng có thể hoạt động cùng nhau trong một môi trường cách ly Docker Compose điều phối các hoạt động của các container, giúp quản lý và vận hành toàn bộ hệ thống một cách dễ dàng và hiệu quả Việc cấu hình đúng các dịch vụ trong docker-compose.yml đảm bảo sự phối hợp trơn tru giữa các thành phần trong ứng dụng.

• Chạy docker-compose up để chạy toàn bộ ứng dụng

Ví dụ về file docker-compose.yml:

Hình 4-1 Ví dụ file docker-compose.yml

Viết docker-compose file

Khai báo phiên bản và các dịch vụ của ứng dụng:

Trong đó “idrink” là tên của dịch vụ mã nguồn ứng dụng (nơi chứa code và các thư viện), “mongodb” là tên dịch vụ cơ sở dữ liệu

Hình 4-2 Khai báo phiên bản và dịch vụ

Hình 4-3 Cấu hình cho idrink

92 build: Sử dụng khi chúng ta không xây dựng container từ image có sẵn nữa mà xây dựng nó từ Dockerfile

Nếu Dockerfile nằm cùng thư mục với docker-compose.yml thì chỉ cần build:

Bạn có thể đặt Dockerfile trong thư mục docker để dễ quản lý, sửa thành "build: context: / dockerfile: docker/Dockerfile" để cấu hình đúng Để xác định hình ảnh (image) sẽ khởi động container, sử dụng thuộc tính "image", và để đặt tên tùy chỉnh cho container thay vì tên mặc định, dùng "container_name" Ngoài ra, nếu muốn container phụ thuộc vào dịch vụ khác, bạn có thể sử dụng "depends_on" để đảm bảo các dịch vụ hoạt động đúng thứ tự.

Trong quá trình cấu hình môi trường Docker, chúng ta cần xác định các biến môi trường phù hợp để đảm bảo hệ thống hoạt động hiệu quả Cấu hình cổng kết nối là một phần quan trọng, với cú pháp (HOST:CONTAINER), ví dụ như khi chỉ định 2000:2001, truy cập vào cổng 2000 của máy thật sẽ tương ứng với cổng 2001 trên mạng ảo Ngoài ra, việc chỉ định vị trí lưu trữ dữ liệu qua phần volumes giúp đảm bảo dữ liệu được bảo vệ và dễ dàng quản lý trong quá trình phát triển và vận hành hệ thống.

Cấu hình tương tự cho “mongodb”:

Hình 4-4 Cấu hình cho mongodb

Trong đó cả “idrink” và “mongodb” đều sử dụng networks là

“iddrink_network” được khai báo bên dưới với driver là bridge:

Viết Dockerfile

Viết entrypoint file

Ở đây entrypoint file được gọi đến có tên là develop.sh Cần lưu ý file sh với bash chứ không phải là sh hay zsh

To build the application, run the command `docker-compose build` To start the application, use `docker-compose up`, and to stop it, execute `docker-compose down` These commands streamline the deployment process, ensuring efficient container management.

XÂY DỰNG ỨNG DỤNG MINH HỌA

Ngày đăng: 01/02/2023, 21:12

TỪ KHÓA LIÊN QUAN

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