jvinhit//lab

Search posts

Type to search across journal entries.

navigate open esc close

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: scprsync

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

  1. Tạo SSH alias cho một host bạn dùng thường xuyên.
  2. Dùng rsync --dry-run để xem file nào sẽ copy.
  3. Chạy một container nginx, xem logs và exec vào shell.
  4. Nếu có Docker Compose project, chạy docker compose psdocker 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.