1. Tổng quan
Docker là một nền tảng mở để phát triển, truyền và chạy các ứng dụng. Với Docker, bạn có thể tách các ứng dụng khỏi cơ sở hạ tầng và coi cơ sở hạ tầng của mình giống như một ứng dụng được quản lý. Docker giúp bạn vận chuyển mã nhanh hơn, kiểm thử nhanh hơn, triển khai nhanh hơn và rút ngắn chu kỳ viết mã và chạy mã.
Docker thực hiện điều này bằng cách kết hợp các tính năng của vùng chứa nhân hệ điều hành với quy trình làm việc và công cụ giúp bạn quản lý và triển khai ứng dụng.
Bạn có thể trực tiếp sử dụng các vùng chứa Docker trong Kubernetes để dễ dàng chạy các vùng chứa này trong Kubernetes Engine. Sau khi tìm hiểu kiến thức cơ bản về Docker, bạn sẽ có bộ kỹ năng để bắt đầu phát triển Kubernetes và các ứng dụng dựa trên vùng chứa.
Kiến thức bạn sẽ học được
Trong phòng thí nghiệm này, bạn sẽ tìm hiểu cách thực hiện những việc sau:
- Tạo Dockerfile cho một ứng dụng mẫu
- Tạo hình ảnh
- Chạy hình ảnh dưới dạng vùng chứa cục bộ
- Thay đổi hành vi của vùng chứa
- Đẩy hình ảnh lên Artifact Registry
Điều kiện tiên quyết
Đây là phòng thí nghiệm cấp độ giới thiệu. Chúng tôi giả định rằng bạn chưa từng có hoặc có kinh nghiệm sử dụng Docker và vùng chứa. Bạn nên quen thuộc với Cloud Shell và dòng lệnh nhưng không bắt buộc.
Thiết lập môi trường theo tiến độ riêng
- Đăng nhập vào Google Cloud Console rồi tạo dự án mới hoặc sử dụng lại dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.
- Tên dự án là tên hiển thị của những người tham gia dự án này. Đây là một chuỗi ký tự không được API của Google sử dụng và bạn có thể cập nhật chuỗi này bất cứ lúc nào.
- Mã dự án phải là duy nhất trong tất cả các dự án Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này sau khi đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường bạn không quan tâm đến sản phẩm đó là gì. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (và mã này thường được xác định là
PROJECT_ID
). Vì vậy, nếu không thích, bạn có thể tạo một mã ngẫu nhiên khác hoặc bạn có thể thử mã của riêng mình để xem có mã này chưa. Sau đó, video sẽ được "đóng băng" sau khi tạo dự án. - Có giá trị thứ ba là Project Number (Số dự án) mà một số API sử dụng. Tìm hiểu thêm về cả ba giá trị này trong tài liệu này.
- Tiếp theo, bạn sẽ cần bật tính năng thanh toán trong Cloud Console để sử dụng tài nguyên/API trên Cloud. Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Để tắt các tài nguyên để bạn không phải chịu thanh toán ngoài hướng dẫn này, hãy làm theo mọi thao tác "dọn dẹp" hướng dẫn ở cuối lớp học lập trình. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí 300 USD.
2. Ứng dụng mẫu
Chúng tôi đã cung cấp đơn đăng ký mẫu để hỗ trợ phòng thí nghiệm này. Trong phần này, bạn sẽ truy xuất mã nguồn và tạo ứng dụng ở dạng gốc trước khi chuyển sang quy trình chứa vùng chứa.
Mã nguồn
Mã nguồn cho phòng thí nghiệm này có trong kho lưu trữ GoogleCloudPlatform/container-developer-workshop cùng với tài liệu về ứng dụng mẫu.
Định cấu hình git
git config --global user.name ${USER}
git config --global user.email ${USER}@qwiklabs.net
Sao chép ứng dụng mẫu Cloud Source Repository (Kho lưu trữ nguồn đám mây) của ứng dụng mẫu
gcloud source repos clone sample-app ${HOME}/sample-app &&
cd ${HOME}/sample-app &&
git checkout main
Đầu ra
Cloning into '/home/student_03_49720296e995/sample-app'... remote: Finding sources: 100% (16/16) remote: Total 16 (delta 0), reused 16 (delta 0) Receiving objects: 100% (16/16), 47.23 KiB | 681.00 KiB/s, done. warning: remote HEAD refers to nonexistent ref, unable to checkout. Project [qwiklabs-gcp-02-4327c4e03d82] repository [sample-app] was cloned to [/home/student_03_49720296e995/sample-app]. Branch 'main' set up to track remote branch 'main' from 'origin'. Switched to a new branch 'main'
Xây dựng ứng dụng mẫu
cd ${HOME}/sample-app
./mvnw compile
Đầu ra
[INFO] Scanning for projects... ... [INFO] Compiling 1 source file to /home/student_03_49720296e995/sample-app/target/classes [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 10.080 s [INFO] Finished at: 2022-02-23T17:14:30Z [INFO] ------------------------------------------------------------------------
Chạy ứng dụng mẫu
cd ${HOME}/sample-app
./mvnw exec:java
Đầu ra
[INFO] Scanning for projects... ... Listening at http://localhost:8080
Xem trước ứng dụng đang chạy
- Nhấp vào nút Xem trước web Cloud Shell
- Nhấp vào Xem trước trên cổng 8080
Khi bạn hoàn tất
- Nhấn Ctrl + c trong Cloud Shell để dừng ứng dụng đang chạy
3. tệp Docker
Vùng chứa ứng dụng bằng Dockerfile
Một phương pháp đóng gói ứng dụng vào vùng chứa là dùng Dockerfile. Dockerfile tương tự như một tập lệnh hướng dẫn trình nền về cách tập hợp hình ảnh vùng chứa. Hãy xem Tài liệu tham khảo về Dockerfile) để biết thêm thông tin.
Tạo một Dockerfile trống trong kho lưu trữ ứng dụng mẫu.
touch ${HOME}/sample-app/Dockerfile
Mở Dockerfile trong trình chỉnh sửa bạn chọn.
vi ${HOME}/sample-app/Dockerfile
Chọn hình ảnh bắt đầu
Để sử dụng phương thức Dockerfile để xây dựng vùng chứa, bạn phải có kiến thức trực tiếp về ứng dụng để tập hợp vùng chứa. Bước đầu tiên để tạo Dockerfile là chọn một hình ảnh sẽ được dùng làm cơ sở cho hình ảnh của bạn.Hình ảnh này phải là hình ảnh mẹ hoặc hình ảnh cơ sở do một nguồn đáng tin cậy duy trì và xuất bản, thường là công ty của bạn.
Lệnh FROM
khởi tạo một giai đoạn tạo bản dựng mới và đặt hình ảnh cơ sở cho các lệnh tuần tự tiếp theo. Do đó, lệnh FROM
thường là lệnh đầu tiên trong Dockerfile và chỉ có thể đứng sau lệnh ARG không bắt buộc để hỗ trợ các biến.
Cú pháp: FROM <image>[:<tag> | @<digest>] [AS <name>]
Định dạng của hình ảnh là <image>:<tag>
hoặc <image>@<digest>
. Nếu không chỉ định một thẻ hoặc chuỗi đại diện, thì theo mặc định, thẻ hoặc chuỗi đại diện này sẽ trở thành thẻ :latest
. Định dạng của <image>
khác nhau tuỳ theo sổ đăng ký dùng để lưu trữ hình ảnh. Đối với Artifact Registry, định dạng <image>
là <region>-docker.pkg.dev/<project ID>/<repository name>/<image name>:<image tag>
.
Đối với phòng thí nghiệm này, chúng ta sử dụng hình ảnh openjdk:11.0-jdk
công khai, hãy thêm dòng sau vào Dockerfile của bạn
FROM openjdk:11.0-jdk
Đặt thư mục đang hoạt động
Lệnh WORKDIR
thiết lập thư mục đang hoạt động cho mọi lệnh tuần tự theo sau trong Dockerfile. Để biết thêm thông tin, hãy xem mục WORKDIR của tài liệu tham khảo về Dockerfile
Cú pháp: WORKDIR <path>
Đối với phòng thí nghiệm này, chúng ta sử dụng thư mục /app
làm WORKDIR
. Hãy thêm dòng sau vào cuối Dockerfile của bạn
WORKDIR /app
Sao chép các tệp ứng dụng
Lệnh COPY
sẽ sao chép các thư mục hoặc tệp từ vị trí <source>
sang đường dẫn <destination>
của hệ thống tệp hình ảnh. Bạn có thể chỉ định nhiều tài nguyên <source>
và tất cả đều liên quan đến ngữ cảnh bản dựng. Ngữ cảnh bản dựng sẽ được thảo luận thêm trong phần Xây dựng. Để biết thêm thông tin, hãy xem phần NỘI DUNG của tài liệu tham khảo về Dockerfile
Cú pháp: COPY <source>... <destination>
Đối với phòng thí nghiệm này, chúng ta sẽ sao chép tất cả các tệp trong kho lưu trữ vào hệ thống tệp hình ảnh, thêm dòng sau vào cuối Dockerfile của bạn
COPY . /app
Biên dịch ứng dụng
Lệnh RUN
thực thi các lệnh trong một lớp hình ảnh mới lên trên hình ảnh hiện tại và ghi nhận kết quả. Hình ảnh đã cam kết thu được sẽ được dùng cho các bước tuần tự trong Dockerfile. Để biết thêm thông tin, hãy xem phần CHẠY của tài liệu tham khảo về Dockerfile
Cú pháp: RUN <command>
Đối với phòng thí nghiệm này, chúng ta sẽ sử dụng Maven để biên dịch ứng dụng thành tệp JAR. Hãy thêm dòng sau vào cuối Dockerfile của bạn
RUN ./mvnw compile assembly:single
Khởi động ứng dụng
Lệnh CMD
cung cấp lệnh mặc định cho vùng chứa đang chạy. Mỗi Dockerfile chỉ được có một lệnh CMD, nếu bạn chỉ định nhiều CMD thì chỉ CMD cuối cùng mới có hiệu lực. Bạn có thể sử dụng nhiều chức năng nâng cao hơn bằng cách sử dụng cả hướng dẫn CMD và ChọnPOINT, nhưng tính năng đó không được đề cập trong phòng thí nghiệm này. Để biết thêm thông tin, hãy xem phần CMD" của tài liệu tham khảo về Dockerfile
Cú pháp: CMD ["executable","param1","param2"]
Đối với phòng thí nghiệm này, chúng ta chạy tệp JAR đã biên dịch, thêm dòng sau vào cuối Dockerfile của bạn
CMD ["java","-jar","/app/target/sample-app-1.0.0-jar-with-dependencies.jar"]
Dockerfile cuối cùng
Dockerfile cuối cùng sẽ là
FROM openjdk:11.0-jdk
WORKDIR /app
COPY . /app
RUN ./mvnw compile assembly:single
CMD ["java","-jar","/app/target/sample-app-1.0.0-jar-with-dependencies.jar"]
Xác nhận Dockerfile cục bộ
cd ${HOME}/sample-app
git add Dockerfile
git commit -m "Added Dockerfile"
4. Tạo
Bây giờ, chúng ta sẽ tạo hình ảnh từ Dockerfile bằng cách sử dụng lệnh docker build
. Lệnh này hướng dẫn trình nền docker tạo hình ảnh bằng cách sử dụng hướng dẫn trong Dockerfile. Hãy xem tài liệu tham khảo về bản dựng Docker để biết thêm thông tin.
Tạo hình ảnh
cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
docker build --tag sample-app:${IMAGE_TAG} .
Đầu ra
Sending build context to Docker daemon 221.2kB Step 1/4 : FROM openjdk:11.0-jdk 11.0-jdk: Pulling from library/openjdk 0c6b8ff8c37e: Pull complete 412caad352a3: Pull complete e6d3e61f7a50: Pull complete 461bb1d8c517: Pull complete e442ee9d8dd9: Pull complete 542c9fe4a7ba: Pull complete 41de18d1833d: Pull complete Digest: sha256:d72b1b9e94e07278649d91c635e34737ae8f181c191b771bde6816f9bb4bd08a Status: Downloaded newer image for openjdk:11.0-jdk ---> 2924126f1829 Step 2/4 : WORKDIR /app ---> Running in ea037abb273d Removing intermediate container ea037abb273d ---> bd9b6d078082 Step 3/4 : COPY . /app ---> b9aec2b5de51 Step 4/4 : RUN ./mvnw compile jar:jar ---> Running in 3f5ff737b7fd [INFO] Scanning for projects... ... [INFO] Building jar: /app/target/sample-app-1.0.0.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 22.952 s [INFO] Finished at: 2022-02-23T18:09:08Z [INFO] ------------------------------------------------------------------------ Removing intermediate container 331443caebd3 ---> 152f65cc441e Step 5/5 : CMD ["java", "-jar", "/app/target/sample-app-1.0.0.jar"] ---> Running in 3d595a72231c Removing intermediate container 3d595a72231c ---> 0e40d7548cab Successfully built 0e40d7548cab Successfully tagged sample-app:aaa8895
5. Chạy
Sau khi tạo thành công hình ảnh vùng chứa, chúng ta hiện có thể chạy ứng dụng và đảm bảo ứng dụng hoạt động như dự kiến bằng lệnh docker run. Lệnh này sẽ khởi chạy vùng chứa của chúng ta trên nền trước của lời nhắc lệnh để kiểm thử hoặc gỡ lỗi. Hãy xem tài liệu tham khảo về quy trình chạy docker để biết thêm thông tin.
Chạy một vùng chứa bằng hình ảnh
cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
docker run \
--rm \
-p 8080:8080 \
sample-app:${IMAGE_TAG}
Đầu ra
Listening at http://localhost:8080
Xem trước ứng dụng chạy trong vùng chứa
- Nhấp vào nút Xem trước web Cloud Shell
- Nhấp vào Xem trước trên cổng 8080
- Nhấn Ctrl + c trong Cloud Shell để dừng các vùng chứa
Thay đổi hành vi của vùng chứa
Việc thực thi Docker Run sẽ sử dụng cấu hình mặc định trong Dockerfile. Bạn có thể thêm các hướng dẫn và thông số bổ sung để sửa đổi hành vi này.
Bật tính năng ghi nhật ký TRACE
cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
docker run \
--rm \
-p 8080:8080 \
sample-app:${IMAGE_TAG} \
java -Dorg.slf4j.simpleLogger.defaultLogLevel=trace -jar /app/target/sample-app-1.0.0-jar-with-dependencies.jar
Xem trước ứng dụng chạy trong vùng chứa
- Nhấp vào nút Xem trước web Cloud Shell
- Nhấp vào Xem trước trên cổng 8080
- Chuyển sang thẻ Cloud Shell và xem việc ghi nhật ký bổ sung
- Nhấn Ctrl + c trong Cloud Shell để dừng vùng chứa
Thay đổi cổng
cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
docker run \
--rm \
-e PORT=8081 \
-p 8081:8081 \
sample-app:${IMAGE_TAG}
Xem trước ứng dụng chạy trong vùng chứa
- Nhấp vào nút Xem trước web Cloud Shell
- Nhấp vào Thay đổi cổng
- Nhập 8081
- Nhấp vào Thay đổi và Xem trước
- Nhấn Ctrl + c trong Cloud Shell để dừng vùng chứa
6. Đẩy
Khi tự tin rằng hình ảnh vùng chứa đang hoạt động đúng cách và muốn cung cấp vùng chứa này để chạy trong các môi trường khác và/hoặc bởi người dùng khác, chúng tôi cần đẩy hình ảnh vào kho lưu trữ dùng chung. Điều này sẽ xảy ra trong quy trình xây dựng tự động. Tuy nhiên, trong môi trường kiểm thử, chúng tôi đã định cấu hình kho lưu trữ và có thể đẩy hình ảnh theo cách thủ công.
Đẩy quy trình xác nhận (commit) Dockerfile đến kho lưu trữ ứng dụng mẫu
cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
git push
Gắn thẻ hình ảnh dành cho Artifact Registry
docker tag sample-app:${IMAGE_TAG} \
us-central1-docker.pkg.dev/${GOOGLE_CLOUD_PROJECT}/apps/sample-app:${IMAGE_TAG}
Định cấu hình thông tin đăng nhập của bạn cho Artifact Registry
gcloud auth configure-docker us-central1-docker.pkg.dev
Khi được nhắc, Do you want to continue (Y/n)?
hãy trả lời y
và nhấn Enter
Đẩy hình ảnh lên Artifact Registry
docker push us-central1-docker.pkg.dev/${GOOGLE_CLOUD_PROJECT}/apps/sample-app:${IMAGE_TAG}
Đầu ra
The push refers to repository [us-central1-docker.pkg.dev/qwiklabs-gcp-04-b47ced695a3c/apps/sample-app] 453b97f86449: Pushed e86791aa0382: Pushed d404c7ee0850: Pushed fe4f44af763d: Pushed 7c072cee6a29: Pushed 1e5fdc3d671c: Pushed 613ab28cf833: Pushed bed676ceab7a: Pushed 6398d5cccd2c: Pushed 0b0f2f2f5279: Pushed aaa8895: digest: sha256:459de00f86f159cc63f98687f7c9563fd65a2eb9bcc71c23dda3351baf13607a size: 2424
7. Xin chúc mừng!
Xin chúc mừng, bạn đã hoàn thành lớp học lập trình!
Nội dung bạn đã đề cập
- Đã tạo một Dockerfile cho một ứng dụng mẫu
- Đã tạo hình ảnh
- Đã chạy hình ảnh dưới dạng vùng chứa cục bộ
- Đã thay đổi hành vi của vùng chứa
- Đã đẩy hình ảnh lên Artifact Registry