SAM 프로젝트 로컬 Docker 환경에서 반드시 알아야 할 명령어 — 실전 중심 가이드
+비유: 사무실 좌석 현황판
+
+ 사무실 출입구에 있는 좌석 현황판처럼, docker ps는
+ 지금 근무 중인(실행 중인) 컨테이너 목록을 보여준다.
+
비유: 가전제품 전원 관리
+
+ stop은 TV 끄기,
+ start는 TV 켜기,
+ restart는 TV를 껐다 다시 켜는 것이다.
+
비유: 회의실에 들어가서 지시하기
+
+ docker exec는
+ 컨테이너라는 방 안에 들어가서 명령을 전달하는 것이다.
+ 내 PC(WSL)에는 PHP가 없지만, 컨테이너 안에는 있으므로 exec로 실행한다.
+
-it 언제 쓰나?
+쓰지 않아도 되는 경우: 명령어 하나만 실행하고 끝날 때 docker exec sam-api-1 php artisan migrate
써야 하는 경우: 컨테이너 안에서 여러 명령을 연속으로 할 때, 또는 tinker처럼 대화형 프로그램을 실행할 때
핵심: 마이그레이션은 반드시 API 컨테이너에서!
+MNG에서 마이그레이션 실행 금지. 모든 DB 관련 작업은 sam-api-1에서만 실행한다.
| 목적 | +명령어 | +
|---|---|
| 마이그레이션 | +docker exec sam-api-1 php artisan migrate |
+
| 캐시 클리어 (MNG) | +docker exec sam-mng-1 php artisan cache:clear |
+
| 캐시 클리어 (API) | +docker exec sam-api-1 php artisan cache:clear |
+
| 설정 초기화 | +docker exec sam-api-1 php artisan config:clear |
+
| Composer 설치 | +docker exec sam-api-1 composer install |
+
| Tinker (대화형) | +docker exec -it sam-api-1 php artisan tinker |
+
| MySQL 접속 | +docker exec -it sam-mysql-1 mysql -u root -proot samdb |
+
| Pint 포맷팅 (MNG) | +docker exec sam-mng-1 ./vendor/bin/pint |
+
| 라우트 목록 | +docker exec sam-mng-1 php artisan route:list |
+
sam-api-1
+API 서버 (Laravel)
마이그레이션, 시더, API
sam-mng-1
+관리자 웹 (Laravel)
뷰, 라우트, 포맷팅
sam-mysql-1
+MySQL 데이터베이스
DB 접속, 쿼리 실행
비유: 오케스트라 지휘자
++ Docker Compose는 오케스트라 지휘자와 같다. 지휘자가 악보(docker-compose.yml) 하나로 + 모든 악기(컨테이너)를 동시에 시작·중지·조율하듯, Compose는 여러 컨테이너를 한 번에 관리한다. +
+SAM의 docker-compose.yml 위치
+/home/aweso/sam/docker-compose.yml
모든 docker compose 명령어는 이 파일이 있는 디렉토리(/home/aweso/sam)에서 실행해야 한다.
비유: USB 외장하드
++ 컨테이너가 컴퓨터라면, 볼륨은 USB 외장하드이다. + 컴퓨터(컨테이너)를 바꿔도 외장하드(볼륨)에 저장한 데이터는 그대로 남아 있다. +
+| 볼륨 이름 | +용도 | +삭제 시 영향 | +
|---|---|---|
| sam_mysql-data | +MySQL 데이터 저장 | +DB 데이터 전체 삭제! | +
| sam_phpmyadmin-data | +phpMyAdmin 세션 | +영향 미미 | +
SAM 네트워크 구조
+
+ 모든 SAM 컨테이너는 samnet 브리지 네트워크에 연결되어 있다.
+ 같은 네트워크 안에서는 컨테이너 이름으로 서로 접근할 수 있다.
+ 예: API 컨테이너가 MySQL에 접속할 때 sam-mysql-1:3306으로 연결한다.
+
문제 1: "사이트에 연결할 수 없음" (mng.sam.kr 접속 불가)
+원인: Docker 컨테이너가 실행되지 않았거나 중지된 상태
+해결:
+문제 2: "500 Server Error" (서버 내부 오류)
+원인: PHP 오류, .env 설정 문제, 캐시 문제 등
+해결:
+문제 3: "Class not found" (클래스를 찾을 수 없음)
+원인: Composer autoload가 갱신되지 않았거나, 새 패키지 설치가 필요
+해결:
+문제 4: "Connection refused" (MySQL 접속 실패)
+원인: MySQL 컨테이너가 아직 시작되지 않았거나, .env의 DB 설정이 잘못됨
+해결:
+문제 5: "Permission denied" (권한 오류)
+원인: storage, bootstrap/cache 디렉토리의 쓰기 권한이 없음
+해결:
+
+ 팁: .env 파일을 수정했다면 반드시 config:clear를 실행해야 변경이 적용된다.
+
경고: 아래 명령어는 데이터 손실을 유발할 수 있다
++ 의미를 정확히 이해하지 않은 채 실행하면 DB 데이터 전체 삭제, 이미지 삭제 등 돌이킬 수 없는 피해가 발생할 수 있다. + 반드시 팀장이나 담당 개발자에게 확인 후 실행하자. +
+
+ 안전한 대안: docker compose down (-v 없이) — 볼륨은 유지하면서 컨테이너만 종료
+
+ 디스크 공간이 부족하다면: docker image prune — 안 쓰는 이미지만 선별 삭제
+
+ 안전한 대안: docker stop sam-api-1 — 먼저 안전하게 중지
+
+ 볼륨 삭제 전 반드시: docker exec -it sam-mysql-1 mysqldump ...로 백업 먼저!
+
-v, -f, prune 플래그가 보이면 한 번 더 생각하기
+ docker compose down은 안전, docker compose down -v는 위험
+ docker ps로 현재 상태를 먼저 확인하는 습관 기르기
+ VS Code 기반 IDE에서 Git 브랜치를 시각적으로 관리하는 도구 추천과 사용법
+비유: 네비게이션 없이 운전하기
++ 주소만 보고 처음 가는 곳을 찾아가는 것은 가능하지만, 네비게이션이 있으면 훨씬 빠르고 안전하다. + Git 시각화 도구는 코드 저장소의 네비게이션이다. +
+CLI에서 보는 브랜치 그래프
+시각화 도구에서 보는 같은 내용
++ 시각화 도구는 색상으로 브랜치를 구분하고, 마우스 클릭만으로 커밋 상세 정보를 볼 수 있다. + Merge와 Rebase 결과도 즉시 확인할 수 있어 실수를 방지한다. +
+색상 구분
+브랜치별 다른 색상으로 한눈에 구분 가능
+클릭 조작
+명령어 대신 마우스 클릭으로 Merge, Rebase 실행
+Diff 미리보기
+커밋 클릭만으로 변경 사항을 바로 확인
+실수 방지
+위험한 작업 전 시각적 확인으로 사고 방지
+비유: 지하철 노선도
++ Git Graph는 지하철 노선도처럼 브랜치를 보여준다. + 각 노선(브랜치)이 어디서 갈라지고 합쳐지는지 한눈에 파악할 수 있다. +
+설치 방법
+사용 방법
+Git Graph: View Git Graph)
+ 주요 기능
+| 기능 | +설명 | +사용법 | +
|---|---|---|
| 브랜치 그래프 | 모든 브랜치를 색상별 그래프로 표시 | 자동 표시 |
| 커밋 상세 | 변경 파일, Diff 미리보기 | 커밋 클릭 |
| 브랜치 생성 | 커밋에서 새 브랜치 생성 | 커밋 우클릭 > Create Branch |
| Merge | 브랜치를 현재 브랜치에 병합 | 브랜치 우클릭 > Merge |
| Rebase | 현재 브랜치를 다른 브랜치 위에 재배치 | 브랜치 우클릭 > Rebase |
| Cherry-pick | 특정 커밋만 가져오기 | 커밋 우클릭 > Cherry Pick |
| 태그 | 커밋에 버전 태그 추가 | 커밋 우클릭 > Add Tag |
비유: CCTV 재생
++ GitLens는 코드의 CCTV와 같다. 어떤 줄이든 클릭하면 + 누가(작성자), 언제(날짜), 왜(커밋 메시지) 수정했는지 바로 확인할 수 있다. +
+설치 방법
+코드 줄 끝에 최근 수정자와 커밋 메시지가 흐릿하게 표시된다. 커서를 올리면 상세 정보를 볼 수 있다.
+파일의 전체 변경 이력을 시간순으로 보여준다. 특정 시점의 내용으로 쉽게 비교할 수 있다.
+Git Graph와 유사한 시각적 브랜치 그래프. GitLens+ (유료) 기능이지만, Git Graph 확장으로 대체 가능하다.
+무료 vs 유료 비교
+| 기능 | +무료 | +유료 (Pro) | +
|---|---|---|
| Inline Blame | ✔ | ✔ |
| File History | ✔ | ✔ |
| Line History | ✔ | ✔ |
| Status Bar Blame | ✔ | ✔ |
| Commit Graph | ✘ | ✔ |
| Visual File History | ✘ | ✔ |
| Worktrees | ✘ | ✔ |
* 무료 기능만으로도 충분히 유용하다. Commit Graph는 Git Graph 확장으로 대체하면 된다.
+주요 단축키
+| 단축키 | +기능 | +설명 | +
|---|---|---|
| Ctrl+Shift+G | Source Control 열기 | Git 패널 열기 |
| Ctrl+Shift+P | 명령 팔레트 | "Git:" 입력 후 모든 Git 명령 접근 |
| Ctrl+Enter | 커밋 | Source Control에서 메시지 입력 후 커밋 |
| 파일 클릭 | Diff 보기 | 변경된 파일 클릭 시 Diff 뷰어 열림 |
| + 버튼 | Stage (git add) | 파일 옆 + 클릭 시 스테이징 |
| - 버튼 | Unstage | 스테이지된 파일 옆 - 클릭 시 언스테이지 |
내장 기능 활용
+| 도구 | +분류 | +가격 | +OS | +Rebase 시각화 | +장점 | +단점 | +추천도 | +
|---|---|---|---|---|---|---|---|
| Git Graph | +VS Code 확장 | +무료 | +All | +✔ | +IDE 통합, 경량 | +대규모 레포에서 느림 | ++ |
| GitLens | +VS Code 확장 | +무료+유료 | +All | +유료 | +Inline Blame, 상세 이력 | +일부 기능 유료 | ++ |
| VS Code SCM | +내장 | +무료 | +All | +✘ | +설치 불필요, 기본 제공 | +그래프 없음 | +★ | +
| GitKraken | +독립 GUI | +유료 | +Win/Mac/Linux | +✔ | +직관적 UI, 드래그&드롭 | +유료, 무거움 | +★ | +
| Sourcetree | +독립 GUI | +무료 | +Win/Mac | +✔ | +무료, Atlassian 제품 | +Linux 미지원, 느림 | +★ | +
| Fork | +독립 GUI | +유료 | +Win/Mac | +✔ | +경량, 빠른 속도 | +Linux 미지원 | +★ | +
| lazygit | +터미널 | +무료 | +All | +✔ | +터미널 전용, 초경량 | +학습 필요 | +★ | +
+ SAM 프로젝트 추천 조합: + Git Graph (브랜치 시각화) + GitLens (코드 이력 추적) + VS Code SCM (기본 Git 작업). + 이 3개면 별도 GUI 도구 없이 모든 Git 작업을 처리할 수 있다. +
+Merge 후 그래프 (다이아몬드 형태)
+Rebase 후 그래프 (직선 형태)
+| 항목 | +Merge | +Rebase | +
|---|---|---|
| 그래프 모양 | 다이아몬드 (분기+합류) | 직선 |
| 이력 | 합류 기록 보존 | 깔끔한 직선 이력 |
| Merge 커밋 | 생성됨 | 생성 안 됨 |
| 안전성 | 안전 (기존 커밋 변경 없음) | 주의 필요 (커밋 해시 변경) |
| 추천 상황 | 공유 브랜치, PR 머지 | 로컬 feature 브랜치 정리 |
+ 이미 Push한 브랜치에서 Rebase를 하면 안 된다! +
++ Rebase는 커밋의 해시값을 변경한다. Push한 브랜치를 Rebase하면 원격 저장소와 이력이 달라져 + 다른 팀원들의 작업이 꼬이게 된다. Force Push가 필요해지며, 이는 매우 위험하다. +
+Git Graph에서 3개 저장소 전환하기
+mng/, api/, react/)
+ Step-by-Step: feature 브랜치 작업 흐름
++ 📖 관련 문서: + SAM 프로젝트의 Git 정책, 커밋 메시지 규칙, 브랜치 전략은 + Git 정책 페이지에서 자세히 확인할 수 있다. +
+비유: 터미널 속 미니 Git 데스크톱
++ lazygit는 터미널 안에서 동작하는 미니 Git 데스크톱 앱이다. + 키보드만으로 Stage, Commit, Push, Branch 전환, Rebase까지 모든 Git 작업을 할 수 있다. +
+설치 방법
+실행 및 기본 사용
+핵심 단축키
+| 키 | +기능 | +설명 | +
|---|---|---|
| Space | Stage/Unstage | 파일 또는 줄 단위 스테이징 |
| c | Commit | 스테이지된 파일 커밋 |
| P | Push | 원격 저장소에 Push |
| p | Pull | 원격 저장소에서 Pull |
| n | New Branch | 새 브랜치 생성 |
| r | Rebase | 선택한 브랜치에 Rebase |
| M | Merge | 선택한 브랜치 Merge |
| e | Edit | 에디터로 파일 열기 |
| q | Quit | lazygit 종료 |
| ? | Help | 전체 단축키 보기 |
+ SSH 환경에서의 장점:
+ 개발 서버에 SSH로 접속하면 GUI 도구를 사용할 수 없다.
+ lazygit를 설치해두면 서버에서도 시각적으로 Git을 관리할 수 있다.
+ ssh pro@114.203.209.83 접속 후
+ cd /home/webservice/mng && lazygit로 바로 사용 가능.
+
서명 방법을 선택해 주세요.