JavaRush /Blog Java /Random-VI /Lần đầu làm quen với Docker
Viacheslav
Mức độ

Lần đầu làm quen với Docker

Xuất bản trong nhóm
Containerization là một cơ chế thường được sử dụng trong thực tế. Ví dụ: khi bạn tìm kiếm trên headhunter, bạn sẽ tìm thấy 477 vị trí tuyển dụng tính đến ngày hôm nay có đề cập đến Docker. Vì vậy, sẽ không phải là một ý tưởng tồi nếu bạn tự làm quen với nó là gì. Tôi hy vọng bài đánh giá ngắn này sẽ giúp hình thành ý tưởng đầu tiên. Chà, anh ấy sẽ hỗ trợ nó bằng các tài liệu bổ sung, chẳng hạn như các khóa học trên Udemy. Giới thiệu lần đầu về Docker - 1

Giới thiệu

Trong bài đánh giá ngắn này, tôi muốn đề cập đến một chủ đề chẳng hạn như việc container hóa. Và bạn cần bắt đầu bằng cách hiểu container hóa thực sự là gì. Theo Wikipedia, “ Containerization ” là ảo hóa cấp hệ điều hành (tức là KHÔNG phải phần cứng) trong đó nhân hệ điều hành duy trì nhiều phiên bản không gian người dùng bị cô lập thay vì chỉ một phiên bản. " Không gian người dùng " là không gian địa chỉ bộ nhớ ảo của hệ điều hành dành riêng cho các chương trình của người dùng. Các phiên bản không gian người dùng (thường được gọi là vùng chứa) hoàn toàn giống với một phiên bản hệ điều hành theo quan điểm của người dùng. Hạt nhân đảm bảo cách ly hoàn toàn vùng chứa, do đó các chương trình từ các vùng chứa khác nhau không thể ảnh hưởng lẫn nhau. Hóa ra, container hóa là ảo hóa phần mềm, tức là ảo hóa ở cấp hệ điều hành mà nhân hệ điều hành chịu trách nhiệm. Một trong những đặc điểm đặc trưng của phương pháp này là tất cả các bộ chứa đều sử dụng một hạt nhân chung, giống như hệ điều hành máy chủ (nghĩa là hệ điều hành chứa các bộ chứa). Điều này cho phép bạn loại bỏ chi phí mô phỏng phần cứng ảo và khởi chạy một phiên bản chính thức của hệ điều hành. Có thể nói đây là ảo hóa “nhẹ”. Hạt nhân là phần trung tâm của HĐH cung cấp cho các ứng dụng quyền truy cập phối hợp vào tài nguyên máy tính, chẳng hạn như thời gian xử lý, bộ nhớ, phần cứng bên ngoài và các thiết bị đầu vào và đầu ra bên ngoài. Hạt nhân cũng thường cung cấp các dịch vụ hệ thống tập tin và giao thức mạng. Nói chung, đây là trái tim của toàn bộ hệ thống. Để biết thêm thông tin, có thể hữu ích khi xem lại tài liệu " Thông tin chung về thùng chứa ". Và một vài lời nữa để phần giới thiệu được hoàn chỉnh. Bây giờ chúng ta đã hiểu rằng một hệ điều hành có kernel. Nó cung cấp sự cô lập cho các phiên bản không gian người dùng. Trong bối cảnh này, bạn có thể gặp thuật ngữ " cgroups ". Đây là tên của cơ chế nhân Linux cho phép bạn đạt được điều này. Do đó, chúng ta có thể nói rằng con đường container hóa bắt đầu từ các hệ thống Linux. Tuy nhiên, bắt đầu từ Windows 10, hỗ trợ container hóa cũng xuất hiện. Để làm việc với ảo hóa, bạn cần định cấu hình hỗ trợ ảo hóa trong BIOS máy tính của mình. Làm thế nào để làm điều này phụ thuộc vào máy tính. Ví dụ: nó có thể trông như thế này:
Giới thiệu lần đầu về Docker - 2
Trên Windows, bạn có thể kiểm tra điều này theo nhiều cách khác nhau. Ví dụ: bạn có thể tải xuống một tiện ích đặc biệt từ trang web của Microsoft: Công cụ phát hiện ảo hóa được hỗ trợ phần cứng . Chà, điều đáng nói là một khái niệm quan trọng khác - Hypervisor. Hypervisor là một trình giám sát máy ảo, một chương trình đảm bảo thực thi song song nhiều hệ điều hành trên cùng một máy tính. Trình ảo hóa đảm bảo rằng các hệ điều hành được cách ly với nhau và chia sẻ tài nguyên giữa các hệ điều hành đang chạy. Một trong những công cụ ảo hóa như vậy là Oracle VirtualBox .
Giới thiệu lần đầu về Docker - 3

Docker

Vì vậy, ảo hóa là gì đã rõ ràng. Nhưng làm thế nào để sử dụng nó? Và ở đây Docker đã hỗ trợ chúng tôi. Docker là phần mềm tự động hóa việc triển khai và quản lý ứng dụng trong môi trường được đóng gói. Cần bắt đầu với thực tế là Docker được thể hiện bằng một khái niệm như Docker Enginge. Và bạn nên bắt đầu với trang web chính thức của Docker và phần “ Tổng quan về Docker ”.
Giới thiệu lần đầu về Docker - 4
Tài liệu nói rằng docker bao gồm:
  • Máy chủ Docker được gọi là tiến trình Docker Daemon (dockerd).
  • Giao diện dòng lệnh hay còn gọi là CLI (docker).
  • API REST mô tả cách các chương trình có thể "nói chuyện" với deamon và cho nó biết phải làm gì.
Trước khi đi sâu hơn, hãy cài đặt docker, nghĩa là cài đặt daemon docker. Trang web Docker có hướng dẫn cài đặt " Docker for Windows ". Điều thú vị là Docker có yêu cầu hệ thống riêng. Và nếu bạn cũng như tôi, có Windows cũ, chẳng hạn như Windows 7, thì bạn cần sử dụng Docker Toolbox.
Giới thiệu lần đầu về Docker - 5

Hộp công cụ Docker

Để cài đặt Docker trên các máy cũ không đáp ứng được yêu cầu hệ thống. Trang web nói như vậy, “Giải pháp máy tính để bàn kế thừa”. Chúng ta hãy truy cập trang " Docker Toolbox " và tải xuống. Bộ này nặng khoảng 211 megabyte. Chúng tôi sẽ cài đặt nó làm mặc định, nghĩa là chúng tôi sẽ chỉ đồng ý một cách ngoan ngoãn với mọi thứ mà không cần sắp xếp lại các lá cờ. Sau khi cài đặt, chúng tôi sẽ kiểm tra xem mọi thứ có ổn không. Trong tương lai, chiến trường của chúng ta sẽ là đường chỉ huy. Tôi khuyên bạn không nên sử dụng dòng lệnh Windows vì có thể có những vấn đề không rõ ràng với nó. Tốt hơn là sử dụng bash shell. Trên Windows, cách tốt nhất để có được nó là cài đặt hệ thống kiểm soát phiên bản git , nó vẫn sẽ có ích. Bởi vì “đi kèm” với nó sẽ là bash mà chúng ta cần. Để đánh giá này tôi sẽ sử dụng git bash. Bạn cũng có thể cài đặt bash bằng CYGWIN . Hãy khởi chạy bash hoặc git bash. Hãy đảm bảo rằng chúng ta đã cài đặt Docker Machine, còn được gọi là Docker Machine: docker-machine -version Docker Machine này là gì? Docker Machine là một tiện ích để quản lý các máy chủ được gắn đế (đây là những máy chủ được cài đặt Docker Engine). Nếu ngay sau khi cài đặt Docket Toolbox, chúng ta xem các máy docker bằng lệnh docker-machine ls, chúng ta sẽ thấy một danh sách trống:
Giới thiệu lần đầu về Docker - 6
Hãy tạo ra một máy mới. Để thực hiện việc này, chúng ta cần chạy lệnh create : docker-machine create -- driver virtualbox javarush: Chúng ta sẽ thấy nhật ký tạo máy docker:
Giới thiệu lần đầu về Docker - 7
Điều chúng tôi quan tâm ở đây là như sau. Boot2Docker là gì? Đây là một bản phân phối Linux tối giản để chạy Docker Engine (chúng tôi hiểu rằng Docker hoạt động nhờ các công cụ ảo hóa Linux và trong Windows, cơ chế cần thiết chỉ xuất hiện bắt đầu từ Windows 10). Bản phân phối này dựa trên bản phân phối " Tiny Core Linux ". Cũng đề cập về VirtualBox VM. Điều này là do chúng tôi đã chỉ định --driver virtualbox. Một máy ảo mới đã được tạo trong VirtualBox từ hình ảnh Boot2Docker. Sau khi tạo, chúng ta có thể khởi chạy VirtualBox (vì VirtualBox được cài đặt với Docker Toolbox) và xem máy ảo đã tạo cho máy docker:
Giới thiệu lần đầu về Docker - 8
Sau khi tạo, chúng ta sẽ được nhắc chạy lệnh “ docker-machine env ” để lấy các biến môi trường cần được cấu hình để kết nối với máy docker:
Giới thiệu lần đầu về Docker - 9
Sau khi thực thi lệnh này bằng docker-machine, chúng ta kết nối với một máy chủ được gắn đế từ xa (trong trường hợp này là một máy chủ ảo được lưu trữ trên Virtual Box) và có thể thực thi các lệnh docker cục bộ như thể chúng ta đang thực thi chúng trên một máy chủ từ xa. Để kiểm tra, chúng ta có thể chạy lệnh " docker info ". Nếu kết nối với máy docker không được thiết lập, chúng ta sẽ gặp lỗi. Và nếu mọi thứ đều ổn, thông tin về docker trên máy docker. Bây giờ là lúc để hiểu cách Docker hoạt động chung và cách sử dụng nó.
Giới thiệu lần đầu về Docker - 10

Docker container

Vậy là chúng ta có docker. Docker này là gì vậy? Tài liệu Docker và phần “ Bắt đầu ” sẽ giúp chúng tôi hiểu điều này . Phần giới thiệu của phần này giới thiệu về Docker Concepts . Nó tuyên bố rằng Docker là một nền tảng để phát triển, gỡ lỗi và chạy các ứng dụng trong vùng chứa. Vì vậy, thứ chính của Docker là các container. Ngay cả khi bạn nhìn vào logo docker, nó vẫn là một con cá voi đang cõng các thùng chứa trên lưng. Nhưng thùng chứa là gì? Tiếp theo trong phần " Images and Containers " nó nói rằng một container là một phiên bản đang chạy của Image. Và Hình ảnh là một “gói” chứa mọi thứ cần thiết cho ứng dụng (mã, môi trường, thư viện, cài đặt, v.v.). Bây giờ chúng ta hãy thử nó. Trang web Docker có một phần gọi là " Docker samples " trong đó bao gồm " Docker for Beginners ". Các ví dụ từ đây có vẻ thú vị hơn đối với tôi. Vì vậy, chúng tôi đột nhiên muốn làm quen với Alpine Linux và chúng tôi có thể thực hiện việc này bằng cách sử dụng vùng chứa Docker. Để có được một hình ảnh, chúng ta phải “kéo” hoặc “kéo” nó ra. Do đó, chúng tôi thực hiện lệnh kéo docker :docker pull apline
Giới thiệu lần đầu về Docker - 11
Như chúng ta có thể thấy, chúng ta đang tải xuống từ đâu đó. Theo mặc định, Docker xem kho lưu trữ của nó trên mạng https://hub.docker.com . Sau khi lấy image thành công, chúng ta có thể kiểm tra danh sách image có sẵn bằng cách chạy lệnh docker Images :
Giới thiệu lần đầu về Docker - 12
Bây giờ chúng ta có một hình ảnh apline. Vì vùng chứa là một phiên bản đang chạy của hình ảnh, hãy khởi chạy chính hình ảnh này. Hãy khởi chạy container bằng lệnh docker run alpine. Như chúng ta thấy, không có gì xảy ra. Nếu chúng ta thực thi lệnh docker pshiển thị tất cả các vùng chứa đang hoạt động, chúng ta cũng sẽ không nhận được gì. Nhưng nếu chúng ta thực thi, docker ps -achúng ta sẽ thấy tất cả các container:
Lần đầu làm quen với Docker - 13
Vấn đề là chúng tôi đã không khởi chạy Docker ở chế độ tương tác. Vì vậy, anh ta thực hiện lệnh và dừng lại. Lệnh là mở terminal. Hãy làm điều tương tự, nhưng ở chế độ tương tác (với cờ -it ):
Giới thiệu lần đầu về Docker - 14
Như bạn có thể thấy, sau khi khắc phục một sai lầm và sử dụng gợi ý, chúng ta đã đến được thùng chứa và có thể làm việc trong đó! Để thoát khỏi vùng chứa mà không dừng hoạt động, bạn có thể nhấn Ctrl + p + q. Nếu chạy bây giờ docker ps, chúng ta sẽ thấy một vùng chứa đang hoạt động. Để nhập một container đã chạy, hãy chạy lệnh docker exec :
Lần đầu làm quen với Docker - 15
Tôi khuyên bạn nên đọc mô tả về mẫu Docker để có mô tả tuyệt vời về cách tất cả điều này xảy ra: “ 1.0 Chạy vùng chứa đầu tiên của bạn ”. Tôi thích nó vì mọi thứ được viết ở đó một cách rất dễ tiếp cận và dễ hiểu. Nói một cách ngắn gọn, chúng tôi được kết nối bằng docker-machine với một máy ảo chạy Docker Daemon. Bằng cách sử dụng CLI qua API REST, chúng tôi yêu cầu khởi chạy hình ảnh núi cao. Docker tìm thấy nó và do đó không tải nó xuống. Docker tạo vùng chứa mới và chạy lệnh mà chúng tôi đã chỉ định trong vùng chứa này. Và tất cả điều này, tất nhiên, là tốt. Nhưng tại sao chúng ta cần tất cả những điều này? Và ở đây chúng ta cần tìm hiểu cách docker tạo ra một hình ảnh. Và anh ấy tạo chúng dựa trên dockerfile.
Giới thiệu lần đầu về Docker - 16

Dockerfile

Như đã nêu trong tài liệu tham khảo Dockerfile , dockerfile là một tệp văn bản chứa tất cả các lệnh để lấy hình ảnh. Trên thực tế, tất cả hình ảnh chúng tôi nhận được (thậm chí cả Alpine, từ ví dụ trên) đều được tạo từ dockerfile. Hãy xây dựng hình ảnh của chúng tôi bằng một ứng dụng Java. Và đầu tiên chúng ta cần ứng dụng Java này. Tôi khuyên bạn nên sử dụng hệ thống xây dựng Gradle. Bạn có thể đọc thêm về hệ thống này trong bài đánh giá ngắn này: “ Giới thiệu ngắn gọn về Gradle ”. Sẽ giúp chúng tôi tạo dự án " Gradle Build init plugin ". Hãy tạo một ứng dụng Java mới bằng Gradle: gradle init --type java-application Lệnh này tạo một dự án Java mẫu. Đây là một ứng dụng độc lập nhưng chúng tôi muốn tạo một ứng dụng web. Hãy xóa các lớp Ứng dụng và AppTest (chúng được tạo tự động bởi Plugin Gradle Build Init). Để nhanh chóng tạo một ứng dụng web, chúng ta sẽ sử dụng hướng dẫn từ Gradle: “ Xây dựng ứng dụng web Java ”. Theo hướng dẫn, chúng ta hãy làm: Bạn phải cẩn thận ở đây. Như mọi khi, có thể có sai sót trong các ví dụ. Đây là:
Lần đầu giới thiệu về Docker - 17
Bây giờ, để kiểm tra nó, hãy thêm plugin gretty vào build.gradle, như được chỉ ra trong phần " Thêm plugin gretty và chạy ứng dụng ":
plugins {
    id 'war'
    id 'org.gretty' version '2.2.0'
}
Điều thú vị là Gretty không thấy lỗi HelloServletđược mô tả ở trên. Điều này chứng tỏ rằng một ứng dụng có thể hoạt động khác nhau trong các môi trường khác nhau. Gretty có thể hoạt động ở nơi một máy chủ độc lập thông thường gặp lỗi. Tất cả những gì còn lại là kiểm tra xem ứng dụng có hoạt động chính xác hay không. Chúng ta hãy làm:gradle appRun
Lần đầu làm quen với Docker - 18
Nếu mọi việc đều ổn thì hãy sử dụng lệnh gradle warđể thu thập một kho lưu trữ với cuộc chiến tiện ích mở rộng (lưu trữ web). Theo mặc định, gradle xây dựng nó trong \build\libs. Bây giờ chúng ta đã sẵn sàng để viết dockerfile. Sử dụng " tham chiếu Dockerfile " chúng ta sẽ tạo một Dockerfile. Hãy tạo một tệp có tên "Dockerfile" trong thư mục gốc của dự án Java của chúng ta (ở cùng vị trí với tập lệnh xây dựng). Hãy mở nó để chỉnh sửa. File này có định dạng riêng, được mô tả trong phần " Dockerfile reference: Format ". Bất kỳ dockerfile nào cũng bắt đầu bằng câu lệnh FROM, biểu thị "hình ảnh cơ sở". Có thể nói đây là hình ảnh cha mẹ trên cơ sở đó chúng ta tạo nên hình ảnh của mình. Chúng ta rất dễ dàng chọn một hình ảnh gốc. Một ứng dụng web cần một máy chủ web. Ví dụ: chúng ta có thể sử dụng máy chủ web Tomcat. Chúng tôi đi đến kho lưu trữ Docker chính thức, được gọi là docker hub . Chúng ta nhìn vào đó để xem hình ảnh chúng ta cần có ở đó không:
Lần đầu làm quen với Docker - 19
Cũng cần hiểu rằng hình ảnh tomcat được gọi. Nhưng bên cạnh cái tên nó còn có một thẻ. Thẻ giống như một phiên bản. Hình ảnh Tomcat của các phiên bản khác nhau khác nhau ở phiên bản Tomcat nào được sử dụng, phiên bản jre nào và hình ảnh cơ sở nào. Ví dụ: chúng ta có thể lấy một hình ảnh docker pull tomcat:9-jre8-alpine Nó sử dụng phiên bản 9 của tomcat, phiên bản jre 8 và hình ảnh núi cao làm cơ sở. Điều này có thể quan trọng để giảm kích thước hình ảnh của chúng tôi:
Lần đầu làm quen với Docker - 20
Như chúng ta có thể thấy, sự khác biệt là rất lớn. Nếu chúng tôi xây dựng hình ảnh của mình dựa trên tomcata Alpine, chúng tôi sẽ bắt đầu chỉ với 100 megabyte chứ không phải 600. Theo đó, chúng tôi sẽ thêm nội dung sau vào dockerfile đã tạo trước đó:
# Базовый образ, "наследуемся" от него
FROM tomcat:9-jre8-alpine
# Копируем из Build Context'а собранный web archive в каталог томката
COPY build/libs/docker.war /usr/local/tomcat/webapps/docker.war
# Меняем рабочий каталог на томкатовский
WORKDIR /usr/local/tomcat
# Открываем порт 8080 для контейнера, т.к. его слушает томкат
EXPOSE 8080
Và bây giờ hãy thực hiện lệnh xây dựng hình ảnh: docker build -t jrdocker ..
Lần đầu làm quen với Docker - 21
-t- đây là một thẻ, tức là gọi hình ảnh đã lắp ráp. Dấu chấm ở cuối có nghĩa là chúng ta thêm thư mục hiện tại (thư mục chứa dockerfile và nơi chúng ta chạy lệnh từ đó) vào Build context. Build context- đây là ngữ cảnh của những tệp có sẵn khi tạo dockerfile. Như bạn có thể thấy, nhờ điều này, chúng tôi đã có thể sao chép tệp chiến tranh đã tập hợp vào hình ảnh của mình, vào thư mục máy chủ web. Bây giờ hãy chạy hình ảnh của chúng tôi:docker run -d --rm -p 8888:8080 jrdocker
Lần đầu làm quen với Docker - 22
Để biết liệu máy chủ đã khởi động hay chưa, bạn có thể xem nhật ký từ vùng chứa. Nhật ký có thể được lấy bằng lệnh docker logs, chỉ định vùng chứa theo ID hoặc tên của nó. Ví dụ:
Lần đầu làm quen với Docker - 23
Chà, đừng quên rằng chúng ta luôn có thể truy cập một container đang chạy theo tên bằng lệnh: winpty docker exec -it NameКонтейнера sh Bây giờ tất cả những gì còn lại là kết nối. Trước đây, chúng tôi đã chỉ định EXPOSE , nghĩa là chúng tôi cho phép truy cập vào cổng 8080 từ bên trong vùng chứa. Khi chúng tôi khởi chạy chính vùng chứa, chúng tôi đã chỉ định thẻ -p ( cổng đến ), từ đó tương quan với cổng 8080 trên vùng chứa (máy chủ web Tomcat đang chờ kết nối ở đó) với cổng 8888 trên máy có trình nền docker. Như chúng tôi nhớ, chúng tôi đã khởi chạy docker daemon không trực tiếp mà thông qua docker-machine. Do đó, một lần nữa chúng ta sẽ yêu cầu dữ liệu trên các máy docker của mình bằng lệnh docker-machine ls và liên hệ với máy chủ trong vùng chứa:
Giới thiệu lần đầu về Docker - 24
Như vậy, bạn và tôi vừa khởi chạy ứng dụng web của mình trong vùng chứa Docker! ) Tôi cũng muốn lưu ý những điều sau. Trong trường hợp có vấn đề về quyền truy cập, bạn nên nhớ rằng máy Docker trước hết là máy ảo Virtual BOx. Có thể có vấn đề với cài đặt mạng của máy ảo. Cấu hình VMBox đang hoạt động có thể trông như thế này:
Lần đầu làm quen với Docker - 25
Lần đầu làm quen với Docker - 26

Lớp

Chúng tôi đã tìm ra rằng hình ảnh được tạo từ dockerfiles và dockerfiles là một tập hợp các lệnh. Chúng tôi cũng đã phát hiện ra rằng dockerfile có cha. Và kích thước của hình ảnh là khác nhau. Điều thú vị là bạn có thể xem lịch sử hình ảnh được xây dựng bằng lệnh docker history . Ví dụ:
Lần đầu làm quen với Docker - 27
Nói điều này để hiểu rằng, về bản chất, mỗi hình ảnh là một tập hợp các hình ảnh. Mỗi thay đổi hình ảnh (mỗi lệnh mới trong dockerfile) sẽ tạo ra một lớp mới có ID riêng. Bạn có thể đọc thêm về các lớp trong tài liệu " Docker: Images and Layers ". Tôi cũng thực sự khuyên bạn nên đọc bài viết trên Habré: “ Hình ảnh Docker và vùng chứa trong ảnh .”

Phần kết luận

Tôi hy vọng phần tổng quan ngắn gọn này đủ để khiến bạn quan tâm đến việc container hóa. Dưới đây là các liên kết đến tài liệu bổ sung có thể hữu ích: #Viacheslav
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION