Command Line cho Developer · Part 9 - Docker, SSH & Remote Files
Command line cho môi trường thật: ssh config, scp, rsync, tail log remote, docker ps/logs/exec/cp/stats, compose up/logs/exec/down và checklist debug container.
Đây là Phần 9. Developer không chỉ chạy code local. Bạn sẽ đụng container, staging server, VM, remote log, file cần copy, service cần restart.
Bài này gom các command bạn cần để làm việc đó vừa nhanh vừa đỡ nguy hiểm.
SSH cơ bản
Kết nối server:
ssh user@example.com
ssh user@192.168.1.10
Chạy một command remote:
ssh user@example.com 'hostname && uptime'
Chỉ định key:
ssh -i ~/.ssh/id_ed25519 user@example.com
Kiểm tra kết nối verbose khi fail:
ssh -v user@example.com
-v giúp thấy SSH đang dùng key nào, host nào, auth fail ở bước nào.
SSH config alias
Thay vì gõ dài:
# ~/.ssh/config
Host staging
HostName staging.example.com
User deploy
IdentityFile ~/.ssh/id_ed25519
ForwardAgent no
Sau đó:
ssh staging
ssh staging 'docker ps'
Alias giúp script và doc dễ đọc hơn. Nhìn ssh staging rõ hơn nhiều so với một chuỗi host/key/user dài.
Copy file: scp và rsync
Copy local lên server:
scp ./dist/app.tar.gz staging:/tmp/app.tar.gz
Copy remote về local:
scp staging:/var/log/app.log ./app.log
Sync thư mục bằng rsync:
rsync -av ./dist/ staging:/var/www/app/
Dry-run trước:
rsync -av --dry-run ./dist/ staging:/var/www/app/
rsync tốt hơn scp khi thư mục lớn vì nó chỉ copy phần thay đổi.
Chú ý dấu slash:
rsync -av dist/ server:/app/dist/ # copy nội dung trong dist
rsync -av dist server:/app/ # copy cả thư mục dist
Xem log remote
ssh staging 'tail -n 100 -f /var/log/app/app.log'
Search log remote:
ssh staging 'grep -i "error" /var/log/app/app.log | tail -50'
Nếu log là systemd:
ssh staging 'journalctl -u my-app -n 100 -f'
Nếu app chạy trong Docker, dùng docker logs ở phần dưới.
Docker: nhìn container đang chạy
docker ps
docker ps -a
Xem image:
docker images
Xem log:
docker logs web
docker logs --tail 100 -f web
Exec vào container:
docker exec -it web sh
docker exec -it web bash
Nhiều image production không có bash, chỉ có sh.
Docker inspect, cp, stats
Xem config container:
docker inspect web
docker inspect web | jq '.[0].NetworkSettings.Ports'
Copy file từ container ra:
docker cp web:/app/logs/app.log ./app.log
Copy vào container:
docker cp ./config.json web:/app/config.json
Xem tài nguyên:
docker stats
docker stats web
Xem process trong container:
docker top web
Docker Compose workflow
Start services:
docker compose up
docker compose up -d
Build lại:
docker compose up --build
Xem services:
docker compose ps
Log:
docker compose logs
docker compose logs -f web
docker compose logs --tail 100 -f api
Exec:
docker compose exec api sh
docker compose exec db psql -U postgres
Dừng:
docker compose down
Xóa volume cũng mất dữ liệu:
docker compose down -v
Chỉ dùng -v khi bạn thật sự muốn reset database/volume.
Checklist debug container
Container không start:
docker compose ps
docker compose logs --tail 100 api
docker inspect api
App không reachable:
docker compose ps
docker port api
curl -i http://localhost:3000/health
Env trong container:
docker compose exec api env | sort
File có tồn tại trong container không:
docker compose exec api ls -la /app
Process trong container:
docker compose exec api ps aux
Cẩn thận với prune
Docker có nhiều lệnh dọn:
docker system df
docker image prune
docker container prune
docker volume prune
docker system prune
volume prune có thể xóa database local. system prune -a --volumes là dọn rất mạnh. Đọc output trước khi confirm.
Workflow an toàn:
docker system df
docker image prune
docker container prune
Chỉ động tới volume khi bạn biết volume nào chứa gì.
Bài tập
- Tạo SSH alias cho một host bạn dùng thường xuyên.
- Dùng
rsync --dry-runđể xem file nào sẽ copy. - Chạy một container
nginx, xem logs và exec vào shell. - Nếu có Docker Compose project, chạy
docker compose psvàdocker compose logs --tail 50.
Lời giải tham khảo
ssh staging 'hostname && uptime'
rsync -av --dry-run ./dist/ staging:/tmp/dist/
docker run --name cli-nginx -p 8080:80 -d nginx
docker logs --tail 20 cli-nginx
docker exec -it cli-nginx sh
docker rm -f cli-nginxĐiều cốt lõi
SSH đưa bạn vào môi trường remote, rsync copy file có kiểm soát, Docker CLI cho bạn nhìn container như process thật. Khi đụng staging hoặc container, hãy đọc log, inspect env/port/file, rồi mới restart hoặc prune.