Lab 02: Khám Phá Các Công Cụ Dòng Lệnh Docker
Mục Tiêu
Lab này hướng dẫn bạn khám phá các công cụ dòng lệnh cơ bản của Docker, bao gồm việc kéo (pull), chạy (run), quản lý container, kiểm tra cấu hình, xử lý file và thư mục, mạng, và nhật ký (logs). Bạn sẽ thực hành trên môi trường cục bộ với registry tùy chỉnh từ GitLab.
Yêu Cầu
Docker Registry
Theo mặc định, Docker sử dụng https://registry-1.docker.io/ làm registry công cộng. Tuy nhiên, trong lab này, chúng ta sử dụng registry tùy chỉnh từ GitLab (registry.git.lab). Các lệnh sẽ bao gồm đầy đủ URL để tránh sử dụng registry mặc định. Không có cách nguyên bản để thay đổi đường dẫn tìm kiếm mặc định; trong thực tế, có thể sử dụng alias bash hoặc makefile để đơn giản hóa. Hiểu Các Lệnh Cấp Cao
Từ Docker 1.13, cấu trúc lệnh được tổ chức lồng nhau để hỗ trợ nhiều tính năng hơn. Chúng ta sẽ sử dụng lệnh cấp cao (ví dụ: docker container ls thay vì docker ps) vì chúng là chiến lược dài hạn. Các lệnh truyền thống có thể bị ẩn bằng biến môi trường DOCKER_HIDE_LEGACY_COMMANDS.
Dưới đây là bảng so sánh một số lệnh tương đương:
Phần 1: Đảm Bảo Docker Được Cài Đặt Và Đang Chạy
Dừng và xóa tất cả container còn lại để dọn dẹp:
text
docker container stop $(docker container ls -q)
docker container rm $(docker container ls -a -q)
docker container prune -f
Lab này đảm bảo tất cả lệnh có thể thực thi nếu môi trường được thiết lập đúng. Nếu gặp lỗi, kiểm tra Docker đang chạy và quyền truy cập registry.
Mục Tiêu
Lab này hướng dẫn bạn khám phá các công cụ dòng lệnh cơ bản của Docker, bao gồm việc kéo (pull), chạy (run), quản lý container, kiểm tra cấu hình, xử lý file và thư mục, mạng, và nhật ký (logs). Bạn sẽ thực hành trên môi trường cục bộ với registry tùy chỉnh từ GitLab.
Yêu Cầu
- Máy trạm với Docker đã cài đặt và đang chạy (phiên bản >= 1.13).
- Tài khoản GitLab với quyền truy cập registry (sử dụng thông tin đăng nhập từ Job Aids nếu có).
- Thư mục làm việc: ~/labs/lab02 (chứa thư mục app cho các bước sau).
- Không sử dụng registry Docker mặc định; thay vào đó sử dụng registry.git.lab/cisco-devops/containers.
Docker Registry
Theo mặc định, Docker sử dụng https://registry-1.docker.io/ làm registry công cộng. Tuy nhiên, trong lab này, chúng ta sử dụng registry tùy chỉnh từ GitLab (registry.git.lab). Các lệnh sẽ bao gồm đầy đủ URL để tránh sử dụng registry mặc định. Không có cách nguyên bản để thay đổi đường dẫn tìm kiếm mặc định; trong thực tế, có thể sử dụng alias bash hoặc makefile để đơn giản hóa. Hiểu Các Lệnh Cấp Cao
Từ Docker 1.13, cấu trúc lệnh được tổ chức lồng nhau để hỗ trợ nhiều tính năng hơn. Chúng ta sẽ sử dụng lệnh cấp cao (ví dụ: docker container ls thay vì docker ps) vì chúng là chiến lược dài hạn. Các lệnh truyền thống có thể bị ẩn bằng biến môi trường DOCKER_HIDE_LEGACY_COMMANDS.
Dưới đây là bảng so sánh một số lệnh tương đương:
| docker images | docker image list |
| docker rmi | docker image rm |
| docker create | docker container create |
| docker ps | docker container ls |
- Mở terminal trên máy trạm học viên và chuyển đến thư mục lab:
text
cd ~/labs/lab02 - Kiểm tra phiên bản Docker:
text
docker version
Nếu Docker không chạy, lệnh sẽ thất bại. Khởi động Docker nếu cần (ví dụ: sudo systemctl start docker trên Linux).
- Đăng nhập:
text
docker login registry.git.lab
Sử dụng thông tin đăng nhập từ Job Aids nếu được yêu cầu. Docker sẽ lưu credentials để không cần đăng nhập lại. - Xem tệp credentials:
text
cat /home/student/.docker/config.json
- Chạy container lần đầu (với tag latest):
text
docker run registry.git.lab/cisco-devops/containers/hello-world:latest
Docker sẽ tải hình ảnh nếu chưa có cục bộ. - Chạy lại mà không có tag (mặc định latest):
text
docker run registry.git.lab/cisco-devops/containers/hello-world
Quan sát: Không tải lại vì hình ảnh đã tồn tại cục bộ.
- Xem tất cả container (bao gồm đã dừng):
text
docker container ls -a
Xem xét các cột: CONTAINER ID, IMAGE, COMMAND, CREATED, STATUS, PORTS, NAMES. Tên container được tạo tự động (ví dụ: affectionate_margulis). - Xem chỉ container đang chạy:
text
docker container ls
(Không có gì nếu không có container đang chạy).
- Kéo hình ảnh Alpine:
text
docker pull registry.git.lab/cisco-devops/containers/alpine - Xem danh sách hình ảnh:
text
docker images
Tag mặc định là latest nếu không chỉ định. - Chạy container Alpine tương tác:
text
docker run -it registry.git.lab/cisco-devops/containers/alpine sh
Trong shell container:
text
ls
Thoát:
text
exit - Chạy ở chế độ tách rời (detached) và đặt tên:
text
docker run -itd --name dev_alpine registry.git.lab/cisco-devops/containers/alpine sh - Kiểm tra container đang chạy:
text
docker container ls - Thực thi lệnh đơn lẻ trên container:
text
docker exec -it dev_alpine ls - Kết nối shell container:
text
docker exec -it dev_alpine sh
Thoát:
text
exit
- Dừng container:
text
docker container stop dev_alpine - Kiểm tra không còn chạy:
text
docker container ls - Kiểm tra vẫn tồn tại:
text
docker container ls -a - Khởi động lại:
text
docker container start dev_alpine - Xác nhận hoạt động:
text
docker exec -it dev_alpine ls - Dừng và xóa:
text
docker container stop dev_alpine
docker container rm dev_alpine - Xác nhận đã xóa:
text
docker container ls -a - Xóa tất cả container đã dừng:
text
docker container prune
Xác nhận bằng y. - Tạo container mới và thử xóa khi đang chạy:
text
docker run -itd --name alpine_force_remove registry.git.lab/cisco-devops/containers/alpine
docker container ls
docker container rm alpine_force_remove # Thất bại vì đang chạy
docker container rm -f alpine_force_remove # Buộc xóa
- Tạo container để kiểm tra:
text
docker run -itd --name alpine_inspect registry.git.lab/cisco-devops/containers/alpine - Kiểm tra toàn bộ cấu hình:
text
docker container inspect alpine_inspect - Lọc và định dạng JSON (mạng):
text
docker container inspect --format='{{json .NetworkSettings }}' alpine_inspect
docker container inspect --format='{{json .NetworkSettings }}' alpine_inspect | json_pp - Lọc mạng lồng:
text
docker container inspect --format='{{json .NetworkSettings.Networks }}' alpine_inspect | json_pp - Kiểm tra trạng thái:
text
docker container inspect --format='{{json .State }}' alpine_inspect | json_pp - Dừng và kiểm tra lại trạng thái:
text
docker container stop alpine_inspect
docker container inspect --format='{{json .State }}' alpine_inspect | json_pp
Trạng thái: exited.
- Tạo container:
text
docker run -itd --name alpine_folder registry.git.lab/cisco-devops/containers/alpine - Sao chép thư mục:
text
docker container cp app/ alpine_folder:/ - Xác nhận sao chép (không đồng bộ):
text
docker exec -it alpine_folder sh
touch app/file1.txt
ls app/
exit
ls app/ # Trên host, không thay đổi - Tạo container với volume:
text
docker run -itd --name alpine_folder_volume -v ${PWD}/app:/app registry.git.lab/cisco-devops/containers/alpine - Xác nhận đồng bộ volume:
text
docker exec -it alpine_folder_volume sh
ls app/
touch app/file1.txt
exit
ls app/ # Thay đổi trên host - Tạo container với mount:
text
docker run -itd --name alpine_folder_mount --mount source=${PWD}/app,target=/app,type=bind registry.git.lab/cisco-devops/containers/alpine - Xác nhận đồng bộ mount:
text
docker exec -it alpine_folder_mount sh
ls app/
touch app/file2.txt
exit
ls app/ # Thay đổi trên host
- Tạo container:
text
docker run -itd --name alpine_net registry.git.lab/cisco-devops/containers/alpine - So sánh gateway:
text
docker container inspect --format='{{json .NetworkSettings.Networks.bridge.Gateway }}' alpine_net
docker exec -it alpine_net route - So sánh IP:
text
docker container inspect --format='{{json .NetworkSettings.Networks.bridge.IPAddress }}' alpine_net
docker exec -it alpine_net ip addr show - Kiểm tra mạng chi tiết:
text
docker container inspect --format='{{json .NetworkSettings.Networks.bridge.NetworkID }}' alpine_net
Sử dụng NetworkID để chạy:
text
docker network inspect <NetworkID>
- Tạo container với vòng lặp tạo log:
text
docker run -itd --name alpine_log registry.git.lab/cisco-devops/containers/alpine sh -c "while true; do $(echo date); sleep 5; done" - Xem log:
text
docker logs alpine_log - Theo dõi log thời gian thực (10 dòng cuối):
text
docker logs -f --tail 10 alpine_log - Xem trợ giúp:
text
docker logs --help
Dừng và xóa tất cả container còn lại để dọn dẹp:
text
docker container stop $(docker container ls -q)
docker container rm $(docker container ls -a -q)
docker container prune -f
Lab này đảm bảo tất cả lệnh có thể thực thi nếu môi trường được thiết lập đúng. Nếu gặp lỗi, kiểm tra Docker đang chạy và quyền truy cập registry.