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