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, vận chuyể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 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ỳ giữa việc viết mã và chạy mã.

Docker thực hiện việc này bằng cách kết hợp các tính năng vùng chứa hạt nhân với quy trình công việc và công cụ giúp bạn quản lý và triển khai các ứng dụng.

Bạn có thể sử dụng trực tiếp các vùng chứa Docker trong Kubernetes, nhờ đó, bạn có thể dễ dàng chạy các vùng chứa này trong Kubernetes Engine. Sau khi tìm hiểu những kiến thức cơ bản về Docker, bạn sẽ có kỹ năng để bắt đầu phát triển Kubernetes và các ứng dụng được đóng gói trong 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 một 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à một lớp học thực hành ở cấp độ cơ bản. Bạn không cần có nhiều kinh nghiệm trước đây với Docker và các vùng chứa. Bạn nên làm quen 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 tốc độ của riêng bạn

  1. Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một 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.pnga99b7ace416376c4.pngbd84a6d3004737c5.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ự mà các API của Google không 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 trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi sau khi đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. 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 (thường được xác định là PROJECT_ID). Vì vậy, nếu không thích mã này, bạn có thể tạo một mã ngẫu nhiên khác hoặc thử mã của riêng mình để xem mã đó có dùng được hay không. Sau đó, giá trị này sẽ "đóng băng" sau khi dự án được tạo.
  • Có một giá trị thứ ba là Số dự án mà một số API sử dụng. Tìm hiểu thêm về cả 3 giá trị này trong tài liệu.
  1. Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên Cloud. Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh bị tính phí ngoài phạm vi hướng dẫn này, hãy làm theo mọi hướng dẫn "dọn dẹp" ở 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í trị giá 300 USD.

2. Ứng dụng mẫu

Một ứng dụng mẫu đã được cung cấp để hỗ trợ lớp học lập trình 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 tạo 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 Cloud Source Repository 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'

Tạo ứ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 trên web của Cloud Shell
  • Nhấp vào Xem trước trên cổng 8080

Khi bạn hoàn tất

  • Nhấn tổ hợp phím CTRL + c trong Cloud Shell để dừng ứng dụng đang chạy

3. tệp Docker

Đóng gói ứng dụng bằng Dockerfile

Một phương thức đóng gói ứng dụng vào một vùng chứa là sử dụng Dockerfile. Dockerfile tương tự như một tập lệnh hướng dẫn trình nền cách lắp rá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 mà bạn chọn.

vi ${HOME}/sample-app/Dockerfile

Chọn một hình ảnh bắt đầu

Để tạo một vùng chứa bằng phương thức Dockerfile, bạn cần có kiến thức trực tiếp về ứng dụng để lắp rá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 gốc hoặc 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 sẽ khởi tạo một giai đoạn xây dựng mới và đặt hình ảnh cơ sở cho các lệnh tuần tự tiếp theo. Do đó, chỉ thị FROM thường là chỉ thị đầu tiên trong Dockerfile và chỉ có thể được đặt trước bằng một chỉ thị 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 bạn không chỉ định thẻ hoặc mã nhận dạng, thì thẻ đó sẽ mặc định là thẻ :latest. Định dạng của <image> sẽ thay đổi tuỳ theo sổ đăng ký được 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>.

Trong phòng thí nghiệm này, chúng ta sẽ sử dụng hình ảnh openjdk:11.0-jdk công khai, hãy thêm dòng sau vào Dockerfile

FROM openjdk:11.0-jdk

Đặt thư mục làm việc

Lệnh WORKDIR đặt thư mục làm việc cho mọi lệnh tuần tự theo sau trong Dockerfile. Để biết thêm thông tin, hãy xem phần WORKDIR trong tài liệu tham khảo về Dockerfile

Cú pháp: WORKDIR <path>

Trong phòng thí nghiệm này, chúng ta sẽ sử dụng thư mục /app làm WORKDIR, hãy thêm dòng sau vào cuối Dockerfile

WORKDIR /app

Sao chép các tệp ứng dụng

Lệnh COPY 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ả các tài nguyên đó đều có 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 Bản dựng. Để biết thêm thông tin, hãy xem phần COPY trong tài liệu tham khảo về Dockerfile

Cú pháp: COPY <source>... <destination>

Trong 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

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 ở trên cùng của hình ảnh hiện tại và xác nhận kết quả. Hình ảnh đã xác nhận 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 RUN trong tài liệu tham khảo về Dockerfile

Cú pháp: RUN <command>

Trong 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

RUN ./mvnw compile assembly:single

Bắt đầu đăng ký

Chỉ thị CMD cung cấp lệnh mặc định cho một vùng chứa đang chạy. Chỉ có thể có một chỉ thị CMD trong Dockerfile. 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 cả chỉ thị CMD và ENTRYPOINT để có thêm chức năng nâng cao, nhưng điều này không được đề cập trong lớp học này. Để biết thêm thông tin, hãy xem phần CMD trong 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 sẽ chạy tệp JAR mà chúng ta đã biên dịch, hãy thêm dòng sau vào cuối Dockerfile

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 tệp Docker tại chỗ

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 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 các hướng dẫn trong Dockerfile của chúng ta. Hãy xem tài liệu tham khảo về lệnh docker build để 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, giờ đây, chúng ta có thể chạy ứng dụng và đảm bảo rằng ứng dụng hoạt động như mong đợi bằng lệnh docker run. Lệnh này sẽ khởi chạy vùng chứa ở nền trước của dấu nhắc lệnh để kiểm thử hoặc gỡ lỗi. Hãy xem tài liệu tham khảo về lệnh docker run để 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 đang chạy trong một vùng chứa

  • Nhấp vào nút Xem trước trên web của Cloud Shell
  • Nhấp vào Xem trước trên cổng 8080
  • Nhấn tổ hợp phím 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à tham số khác để 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 đang chạy trong một vùng chứa

  • Nhấp vào nút Xem trước trên web của Cloud Shell
  • Nhấp vào Xem trước trên cổng 8080
  • Chuyển sang thẻ Cloud Shell và xem nhật ký bổ sung
  • Nhấn tổ hợp phím 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 đang chạy trong một vùng chứa

  • Nhấp vào nút Xem trước trên web của 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 tổ hợp phím CTRL + c trong Cloud Shell để dừng vùng chứa

6. Đẩy

Sau khi chắc chắn rằng hình ảnh vùng chứa đang chạy đú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 những người dùng khác, chúng ta cần đẩy hình ảnh đó vào một kho lưu trữ dùng chung. Điều này sẽ xảy ra trong quy trình tạo tự động, nhưng trong môi trường kiểm thử, chúng ta đã định cấu hình một kho lưu trữ và có thể đẩy hình ảnh theo cách thủ công.

Đẩy cam kết Dockerfile vào kho lưu trữ sample-app

cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
git push

Gắn thẻ hình ả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 cho Artifact Registry

gcloud auth configure-docker us-central1-docker.pkg.dev

Khi được nhắc Do you want to continue (Y/n)? 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ày!

Nội dung bạn đã đề cập

  • 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 một vùng chứa cục bộ
  • Thay đổi hành vi của vùng chứa
  • Đã chuyển hình ảnh sang Artifact Registry