Phát triển vùng chứa bằng Dockerfiles

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

  1. Đă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.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 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.
  1. 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><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