1. Tổng quan
Docker là một nền tảng mở để phát triển, vận chuyển và chạy ứng dụng. Với Docker, bạn có thể tách ứ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 của kernel 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ể sử dụng trực tiếp các vùng chứa Docker trong Kubernetes, cho phép bạn 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 vùng chứa hoá.
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 một 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à một phòng thí nghiệm ở cấp độ giới thiệu. Chúng tôi giả định rằng bạn có ít hoặc không có kinh nghiệm trước đó về Docker và 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 tự định hướng
- Đă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.



- Tên dự án là tên hiển thị cho 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 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 trên tất cả các dự án của Google Cloud và không thể thay đổi (không thể thay đổi sau khi đã đặt). Cloud Console 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 (và thường được xác định là
PROJECT_ID), vì vậy, nếu không thích, hãy 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 và xem mã đó có dùng được hay không. Sau đó, mã 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ả ba giá trị này trong tài liệu.
- 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 của 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 tài nguyên để không phải thanh toán ngoài 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
Chúng tôi đã cung cấp một ứng dụng 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 vùng chứa hoá.
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 ứ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 kho lưu trữ Cloud Source Repositories 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. Dockerfile
Vùng chứa hoá ứng dụng bằng Dockerfile
Một phương thức đóng gói ứng dụng vào vùng chứa là sử dụng Dockerfile. Tệp Docker 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 hình ảnh bắt đầu
Việc sử dụng phương thức Dockerfile để tạo vùng chứa đòi hỏi phải 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 mẹ hoặc hình ảnh cơ sở do một nguồn đáng tin cậy duy trì và phát hành, thường là công ty của bạn.
Lệnh FROM khởi động một 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ể được đặt trước bằng một 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 cho hình ảnh là <image>:<tag> hoặc <image>@<digest>. Nếu không chỉ định thẻ hoặc chuỗi đại diện, thì giá trị mặc định sẽ là thẻ :latest. Định dạng của <image> sẽ khác nhau tuỳ thuộc vào 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>.
Đối với phòng thí nghiệm này, chúng ta sẽ sử dụng hình ảnh openjdk:11.0-jdk công khai, 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ự tiếp theo trong Dockerfile. Để biết thêm thông tin, hãy xem phần 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ẽ sử dụng thư mục /app làm WORKDIR, thêm dòng sau vào cuối Dockerfile
WORKDIR /app
Sao chép tệp ứng dụng
Lệnh COPY sao chép các thư mục hoặc tệp từ vị trí <source> đến đườ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 Tạo. Để biết thêm thông tin, hãy xem phần COPY 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
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 hình ảnh hiện tại và cam kết kết quả. Hình ảnh đã cam kết kết quả 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 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, thêm dòng sau vào cuối Dockerfile
RUN ./mvnw compile assembly:single
Bắt đầu ứng dụng
Lệnh 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 lệnh CMD trong Dockerfile. Nếu chỉ định nhiều lệnh CMD, thì chỉ lệnh CMD cuối cùng mới có hiệu lực. Có nhiều chức năng nâng cao hơn khi sử dụng cả lệnh CMD và ENTRYPOINT, nhưng chức 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 sẽ chạy tệp JAR mà chúng ta đã biên dịch, 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"]
Cam kết 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 lệnh docker build. Lệnh này hướng dẫn daemon docker tạo hình ảnh bằng các hướng dẫn từ Dockerfile của chúng ta. Hãy xem tài liệu tham khảo về 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ẽ chạy vùng chứa của chúng ta ở 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ề docker run để biết thêm thông tin.
Chạy 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 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ử 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ố 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 đang chạy trong 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 tính năng ghi 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 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. Chuyển đến
Sau khi chắc chắn rằng hình ảnh vùng chứa đang chạy đúng cách và chúng ta 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 lên một kho lưu trữ dùng chung. Việc này sẽ diễn ra như một phần của quy trình tạo bản dựng tự động, nhưng trong môi trường thử nghiệm, chúng ta đã định cấu hình một kho lưu trữ và có thể đẩy hình ảnh của mình theo cách thủ công.
Đẩy cam kết Dockerfile lên 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 xác thực 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 tất lớp học lập trình!
Nội dung đã đề cập
- Tạo Dockerfile cho một ứng dụng mẫu
- Tạo một 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