2026-02-25 10:33:43 +09:00
@ extends ( 'layouts.app' )
@ section ( 'title' , 'Docker 명령어' )
@ push ( 'styles' )
< style >
. help - balloon - trigger {
display : inline - flex ;
align - items : center ;
justify - content : center ;
width : 18 px ;
height : 18 px ;
border - radius : 50 % ;
background : #eff6ff;
color : #1d4ed8;
font - size : 11 px ;
font - weight : 700 ;
cursor : pointer ;
border : 1.5 px solid #93c5fd;
vertical - align : middle ;
margin - left : 4 px ;
transition : all 0.15 s ease ;
position : relative ;
user - select : none ;
}
. help - balloon - trigger : hover {
background : #1d4ed8;
color : white ;
border - color : #3b82f6;
}
. help - balloon {
display : none ;
position : absolute ;
bottom : calc ( 100 % + 10 px );
left : 50 % ;
transform : translateX ( - 50 % ) scale ( 0.95 );
background : #1e293b;
color : #f1f5f9;
font - size : 12 px ;
font - weight : 400 ;
line - height : 1.6 ;
padding : 10 px 14 px ;
border - radius : 10 px ;
max - width : 300 px ;
min - width : 200 px ;
width : max - content ;
white - space : normal ;
word - break : keep - all ;
box - shadow : 0 8 px 24 px rgba ( 0 , 0 , 0 , 0.25 );
z - index : 40 ;
opacity : 0 ;
transition : opacity 0.15 s ease , transform 0.15 s ease ;
pointer - events : none ;
}
. help - balloon :: after {
content : '' ;
position : absolute ;
top : 100 % ;
left : 50 % ;
transform : translateX ( - 50 % );
border : 7 px solid transparent ;
border - top - color : #1e293b;
}
. help - balloon - trigger . is - active . help - balloon {
display : block ;
opacity : 1 ;
transform : translateX ( - 50 % ) scale ( 1 );
pointer - events : auto ;
}
. code - block {
background : #1e1e2e;
color : #a6e3a1;
border - radius : 0.75 rem ;
padding : 1 rem 1.25 rem ;
font - family : 'Courier New' , Courier , monospace ;
font - size : 0.75 rem ;
line - height : 1.7 ;
overflow - x : auto ;
white - space : pre ;
}
. code - block . code - comment { color : #6c7086; }
. code - block . code - keyword { color : #cba6f7; }
. code - block . code - string { color : #a6e3a1; }
. code - block . code - flag { color : #89b4fa; }
. code - block . code - path { color : #f9e2af; }
. code - block . code - output { color : #9399b2; }
. code - block . code - danger { color : #f38ba8; }
. code - block . code - prompt { color : #89dceb; }
. cmd - card {
transition : all 0.15 s ease ;
}
. cmd - card : hover {
box - shadow : 0 4 px 12 px rgba ( 0 , 0 , 0 , 0.08 );
}
. danger - badge {
display : inline - flex ;
align - items : center ;
gap : 4 px ;
padding : 2 px 8 px ;
border - radius : 9999 px ;
font - size : 10 px ;
font - weight : 600 ;
}
</ style >
@ endpush
@ section ( 'content' )
< div class = " max-w-6xl mx-auto " >
{{ -- ============================================================ -- }}
{{ -- 히어로 배너 -- }}
{{ -- ============================================================ -- }}
< div class = " rounded-2xl overflow-hidden mb-8 shadow-lg " style = " background: linear-gradient(135deg, #0c4a6e 0%, #0f172a 100%); " >
< div class = " flex items-center " style = " flex-wrap: wrap; " >
< div style = " flex: 1 1 300px; padding: 2rem 2.5rem; " >
< div class = " flex items-center gap-2 text-sm mb-2 " style = " color: #7dd3fc; " >
< span > 아카데미 </ span >
< svg class = " w-4 h-4 " fill = " none " stroke = " currentColor " viewBox = " 0 0 24 24 " >< path stroke - linecap = " round " stroke - linejoin = " round " stroke - width = " 2 " d = " M9 5l7 7-7 7 " /></ svg >
< span style = " color: #bae6fd; " > Docker 명령어 </ span >
</ div >
< h1 class = " text-3xl font-bold mb-2 " style = " color: #ffffff; " > Docker 명령어 </ h1 >
< p class = " text-sm " style = " color: #cbd5e1; " > SAM 프로젝트 로컬 Docker 환경에서 반드시 알아야 할 명령어 — 실전 중심 가이드 </ p >
</ div >
< div class = " shrink-0 " style = " width: 240px; padding: 1.5rem; " >
< div class = " text-center " style = " font-size: 100px; line-height: 1; " >
< span style = " filter: drop-shadow(0 4px 8px rgba(0,0,0,0.3)); " > 🐳 </ span >
</ div >
</ div >
</ div >
</ div >
< div class = " flex gap-8 " >
{{ -- ============================================================ -- }}
{{ -- 좌측 고정 목차 ( TOC ) -- }}
{{ -- ============================================================ -- }}
< nav class = " hidden lg:block shrink-0 " style = " width: 220px; " >
< div class = " sticky top-24 " >
< div class = " bg-blue-50 border border-blue-200 rounded-xl p-5 " >
< h2 class = " font-semibold text-blue-800 mb-3 flex items-center gap-2 text-sm " >
< svg class = " w-5 h-5 " fill = " none " stroke = " currentColor " viewBox = " 0 0 24 24 " >< path stroke - linecap = " round " stroke - linejoin = " round " stroke - width = " 2 " d = " M4 6h16M4 10h16M4 14h16M4 18h16 " /></ svg >
목차
</ h2 >
< div class = " space-y-0.5 text-xs " >
< a href = " #docker-check " class = " block text-blue-700 hover:text-blue-900 py-1 font-medium " > 1. Docker 기본 확인 </ a >
< a href = " #docker-ps " class = " block text-blue-600 hover:text-blue-800 py-0.5 pl-3 " > docker ps </ a >
< a href = " #docker-images " class = " block text-blue-600 hover:text-blue-800 py-0.5 pl-3 " > docker images </ a >
< a href = " #container-control " class = " block text-blue-700 hover:text-blue-900 py-1 font-medium mt-2 " > 2. 컨테이너 제어 </ a >
< a href = " #start-stop " class = " block text-blue-600 hover:text-blue-800 py-0.5 pl-3 " > start / stop / restart </ a >
< a href = " #container-exec " class = " block text-blue-700 hover:text-blue-900 py-1 font-medium mt-2 " > 3. 컨테이너 진입 & 실행 </ a >
< a href = " #docker-exec " class = " block text-blue-600 hover:text-blue-800 py-0.5 pl-3 " > docker exec </ a >
< a href = " #sam-patterns " class = " block text-blue-600 hover:text-blue-800 py-0.5 pl-3 " > SAM 전용 패턴 </ a >
< a href = " #container-logs " class = " block text-blue-700 hover:text-blue-900 py-1 font-medium mt-2 " > 4. 로그 확인 </ a >
< a href = " #docker-logs " class = " block text-blue-600 hover:text-blue-800 py-0.5 pl-3 " > docker logs </ a >
< a href = " #docker-compose " class = " block text-blue-700 hover:text-blue-900 py-1 font-medium mt-2 " > 5. Docker Compose </ a >
< a href = " #compose-commands " class = " block text-blue-600 hover:text-blue-800 py-0.5 pl-3 " > 주요 명령어 </ a >
< a href = " #volume-network " class = " block text-blue-700 hover:text-blue-900 py-1 font-medium mt-2 " > 6. 볼륨 & 네트워크 </ a >
< a href = " #volume-list " class = " block text-blue-600 hover:text-blue-800 py-0.5 pl-3 " > 볼륨 관리 </ a >
< a href = " #network-list " class = " block text-blue-600 hover:text-blue-800 py-0.5 pl-3 " > 네트워크 관리 </ a >
< a href = " #troubleshooting " class = " block text-blue-700 hover:text-blue-900 py-1 font-medium mt-2 " > 7. 트러블슈팅 </ a >
< a href = " #common-issues " class = " block text-blue-600 hover:text-blue-800 py-0.5 pl-3 " > 자주 발생하는 문제 </ a >
< a href = " #danger-zone " class = " block text-blue-700 hover:text-blue-900 py-1 font-medium mt-2 " > 8. 위험한 명령어 </ a >
< a href = " #danger-commands " class = " block text-blue-600 hover:text-blue-800 py-0.5 pl-3 " > 절대 주의 !</ a >
</ div >
</ div >
</ div >
</ nav >
{{ -- ============================================================ -- }}
{{ -- 우측 콘텐츠 -- }}
{{ -- ============================================================ -- }}
< div class = " flex-1 min-w-0 space-y-10 " >
{{ -- 모바일 목차 -- }}
< div class = " lg:hidden bg-blue-50 border border-blue-200 rounded-xl p-4 mb-6 " >
< details >
< summary class = " font-semibold text-blue-800 text-sm cursor-pointer flex items-center gap-2 " >
< svg class = " w-5 h-5 " fill = " none " stroke = " currentColor " viewBox = " 0 0 24 24 " >< path stroke - linecap = " round " stroke - linejoin = " round " stroke - width = " 2 " d = " M4 6h16M4 10h16M4 14h16M4 18h16 " /></ svg >
목차 보기
</ summary >
< nav class = " mt-3 space-y-1 text-sm " >
< a href = " #docker-check " class = " block text-blue-700 hover:text-blue-900 py-1 " > 1. Docker 기본 확인 </ a >
< a href = " #container-control " class = " block text-blue-700 hover:text-blue-900 py-1 " > 2. 컨테이너 제어 </ a >
< a href = " #container-exec " class = " block text-blue-700 hover:text-blue-900 py-1 " > 3. 컨테이너 진입 & 실행 </ a >
< a href = " #container-logs " class = " block text-blue-700 hover:text-blue-900 py-1 " > 4. 로그 확인 </ a >
< a href = " #docker-compose " class = " block text-blue-700 hover:text-blue-900 py-1 " > 5. Docker Compose </ a >
< a href = " #volume-network " class = " block text-blue-700 hover:text-blue-900 py-1 " > 6. 볼륨 & 네트워크 </ a >
< a href = " #troubleshooting " class = " block text-blue-700 hover:text-blue-900 py-1 " > 7. 트러블슈팅 </ a >
< a href = " #danger-zone " class = " block text-blue-700 hover:text-blue-900 py-1 " > 8. 위험한 명령어 </ a >
</ nav >
</ details >
</ div >
{{ -- ============================================================ -- }}
{{ -- 1. Docker 기본 확인 -- }}
{{ -- ============================================================ -- }}
< section id = " docker-check " class = " scroll-mt-20 " >
< div class = " bg-white rounded-xl shadow-sm border border-gray-100 p-6 " >
< h2 class = " text-xl font-bold text-gray-800 mb-6 flex items-center gap-3 " >
< span class = " w-8 h-8 bg-sky-600 text-white rounded-lg flex items-center justify-center text-sm font-bold " > 1 </ span >
Docker 기본 확인
</ h2 >
< div id = " docker-ps " class = " scroll-mt-20 mb-8 " >
< h3 class = " text-lg font-semibold text-gray-800 mb-3 flex items-center gap-2 " >
< span class = " w-2 h-2 bg-sky-400 rounded-full " ></ span >
docker ps — 실행 중인 컨테이너 확인
< span class = " help-balloon-trigger " onclick = " toggleBalloon(this) " > ? < span class = " help-balloon " > 가장 자주 쓰는 명령어 . " 지금 어떤 컨테이너가 돌아가고 있지? " 궁금할 때 사용한다 .</ span ></ span >
</ h3 >
< div class = " bg-amber-50 rounded-lg p-4 border border-amber-100 mb-4 " >
< p class = " font-semibold text-amber-800 mb-1 " > 비유 : 사무실 좌석 현황판 </ p >
< p class = " text-xs text-amber-900 leading-relaxed " >
사무실 출입구에 있는 좌석 현황판처럼 , < code class = " bg-amber-100 px-1.5 py-0.5 rounded text-xs " > docker ps </ code > 는
< strong > 지금 근무 중인 ( 실행 중인 ) 컨테이너 목록 </ strong > 을 보여준다 .
</ p >
</ div >
< div class = " space-y-3 " >
< div class = " cmd-card bg-gray-50 rounded-lg p-4 border border-gray-200 " >
< div class = " flex items-center gap-2 mb-2 " >
< span class = " bg-sky-100 text-sky-800 text-xs font-bold px-2 py-0.5 rounded " > 기본 </ span >
< span class = " text-sm font-semibold text-gray-800 " > 실행 중인 컨테이너만 </ span >
</ div >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > ps
< span class = " code-output " > CONTAINER ID IMAGE STATUS NAMES
a1b2c3d4 sam - mng Up 2 hours sam - mng - 1
e5f6g7h8 sam - api Up 2 hours sam - api - 1
i9j0k1l2 mysql : 8.0 Up 2 hours sam - mysql - 1
m3n4o5p6 nginx : alpine Up 2 hours sam - nginx - 1 </ span ></ div >
</ div >
< div class = " cmd-card bg-gray-50 rounded-lg p-4 border border-gray-200 " >
< div class = " flex items-center gap-2 mb-2 " >
< span class = " bg-purple-100 text-purple-800 text-xs font-bold px-2 py-0.5 rounded " > 응용 </ span >
< span class = " text-sm font-semibold text-gray-800 " > 모든 컨테이너 ( 중지된 것 포함 ) </ span >
</ div >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > ps < span class = " code-flag " >- a </ span >
< span class = " code-comment " > # -a = all. 중지된 컨테이너까지 전부 보여준다</span>
< span class = " code-output " > CONTAINER ID IMAGE STATUS NAMES
a1b2c3d4 sam - mng Up 2 hours sam - mng - 1
q7r8s9t0 sam - react Exited ( 0 ) 3 hours ago sam - react - 1 </ span ></ div >
</ div >
</ div >
</ div >
< div id = " docker-images " class = " scroll-mt-20 " >
< h3 class = " text-lg font-semibold text-gray-800 mb-3 flex items-center gap-2 " >
< span class = " w-2 h-2 bg-sky-400 rounded-full " ></ span >
docker images — 설치된 이미지 목록
< span class = " help-balloon-trigger " onclick = " toggleBalloon(this) " > ? < span class = " help-balloon " > 이미지는 컨테이너를 만들기 위한 " 설계도 " 이다 . 어떤 설계도가 설치되어 있는지 확인할 때 사용한다 .</ span ></ span >
</ h3 >
< div class = " cmd-card bg-gray-50 rounded-lg p-4 border border-gray-200 " >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > images
< span class = " code-output " > REPOSITORY TAG IMAGE ID SIZE
sam - mng latest abc123def 650 MB
sam - api latest 456 ghi789 620 MB
mysql 8.0 jkl012mno 580 MB
nginx alpine pqr345stu 40 MB </ span ></ div >
</ div >
</ div >
</ div >
</ section >
{{ -- ============================================================ -- }}
{{ -- 2. 컨테이너 제어 -- }}
{{ -- ============================================================ -- }}
< section id = " container-control " class = " scroll-mt-20 " >
< div class = " bg-white rounded-xl shadow-sm border border-gray-100 p-6 " >
< h2 class = " text-xl font-bold text-gray-800 mb-6 flex items-center gap-3 " >
< span class = " w-8 h-8 bg-sky-600 text-white rounded-lg flex items-center justify-center text-sm font-bold " > 2 </ span >
컨테이너 제어
</ h2 >
< div id = " start-stop " class = " scroll-mt-20 " >
< h3 class = " text-lg font-semibold text-gray-800 mb-3 flex items-center gap-2 " >
< span class = " w-2 h-2 bg-sky-400 rounded-full " ></ span >
start / stop / restart
< span class = " help-balloon-trigger " onclick = " toggleBalloon(this) " > ? < span class = " help-balloon " > 컨테이너를 시작 , 중지 , 재시작하는 명령어 . 전원 버튼을 누르는 것과 같다 .</ span ></ span >
</ h3 >
< div class = " bg-amber-50 rounded-lg p-4 border border-amber-100 mb-4 " >
< p class = " font-semibold text-amber-800 mb-1 " > 비유 : 가전제품 전원 관리 </ p >
< p class = " text-xs text-amber-900 leading-relaxed " >
< code class = " bg-amber-100 px-1 rounded " > stop </ code > 은 TV 끄기 ,
< code class = " bg-amber-100 px-1 rounded " > start </ code > 는 TV 켜기 ,
< code class = " bg-amber-100 px-1 rounded " > restart </ code > 는 TV를 < strong > 껐다 다시 켜는 것 </ strong > 이다 .
</ p >
</ div >
< div class = " space-y-3 " >
< div class = " cmd-card bg-gray-50 rounded-lg p-4 border border-gray-200 " >
< div class = " flex items-center gap-2 mb-2 " >
< span class = " bg-green-100 text-green-800 text-xs font-bold px-2 py-0.5 rounded " > 시작 </ span >
< span class = " text-sm font-semibold text-gray-800 " > 컨테이너 시작 </ span >
</ div >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > start < span class = " code-string " > sam - api - 1 </ span >
< span class = " code-comment " > # 중지된 컨테이너를 다시 시작</span></div>
</ div >
< div class = " cmd-card bg-gray-50 rounded-lg p-4 border border-gray-200 " >
< div class = " flex items-center gap-2 mb-2 " >
< span class = " bg-red-100 text-red-800 text-xs font-bold px-2 py-0.5 rounded " > 중지 </ span >
< span class = " text-sm font-semibold text-gray-800 " > 컨테이너 중지 </ span >
</ div >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > stop < span class = " code-string " > sam - mng - 1 </ span >
< span class = " code-comment " > # 실행 중인 컨테이너를 안전하게 중지</span></div>
</ div >
< div class = " cmd-card bg-gray-50 rounded-lg p-4 border border-gray-200 " >
< div class = " flex items-center gap-2 mb-2 " >
< span class = " bg-amber-100 text-amber-800 text-xs font-bold px-2 py-0.5 rounded " > 재시작 </ span >
< span class = " text-sm font-semibold text-gray-800 " > 컨테이너 재시작 </ span >
</ div >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > restart < span class = " code-string " > sam - api - 1 </ span >
< span class = " code-comment " > # stop + start를 한 번에. 설정 변경 후 자주 사용</span></div>
</ div >
< div class = " cmd-card bg-gray-50 rounded-lg p-4 border border-gray-200 " >
< div class = " flex items-center gap-2 mb-2 " >
< span class = " bg-purple-100 text-purple-800 text-xs font-bold px-2 py-0.5 rounded " > 응용 </ span >
< span class = " text-sm font-semibold text-gray-800 " > 여러 컨테이너 한번에 </ span >
</ div >
< div class = " code-block " >< span class = " code-comment " > # 여러 컨테이너를 한 번에 중지/시작/재시작</span>
< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > stop < span class = " code-string " > sam - api - 1 sam - mng - 1 </ span >
< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > start < span class = " code-string " > sam - api - 1 sam - mng - 1 </ span >
< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > restart < span class = " code-string " > sam - api - 1 sam - mng - 1 sam - nginx - 1 </ span ></ div >
</ div >
</ div >
</ div >
</ div >
</ section >
{{ -- ============================================================ -- }}
{{ -- 3. 컨테이너 진입 & 실행 -- }}
{{ -- ============================================================ -- }}
< section id = " container-exec " class = " scroll-mt-20 " >
< div class = " bg-white rounded-xl shadow-sm border border-gray-100 p-6 " >
< h2 class = " text-xl font-bold text-gray-800 mb-6 flex items-center gap-3 " >
< span class = " w-8 h-8 bg-sky-600 text-white rounded-lg flex items-center justify-center text-sm font-bold " > 3 </ span >
컨테이너 진입 & 실행
</ h2 >
< div id = " docker-exec " class = " scroll-mt-20 mb-8 " >
< h3 class = " text-lg font-semibold text-gray-800 mb-3 flex items-center gap-2 " >
< span class = " w-2 h-2 bg-sky-400 rounded-full " ></ span >
docker exec — 컨테이너 안에서 명령 실행
< span class = " help-balloon-trigger " onclick = " toggleBalloon(this) " > ? < span class = " help-balloon " > 실행 중인 컨테이너 " 안으로 들어가서 " 명령어를 실행한다 . SAM에서 가장 많이 쓰는 핵심 명령어이다 .</ span ></ span >
</ h3 >
< div class = " bg-amber-50 rounded-lg p-4 border border-amber-100 mb-4 " >
< p class = " font-semibold text-amber-800 mb-1 " > 비유 : 회의실에 들어가서 지시하기 </ p >
< p class = " text-xs text-amber-900 leading-relaxed " >
< code class = " bg-amber-100 px-1.5 py-0.5 rounded text-xs " > docker exec </ code > 는
< strong > 컨테이너라는 방 안에 들어가서 명령을 전달 </ strong > 하는 것이다 .
내 PC ( WSL ) 에는 PHP가 없지만 , 컨테이너 안에는 있으므로 exec로 실행한다 .
</ p >
</ div >
< div class = " space-y-3 " >
< div class = " cmd-card bg-gray-50 rounded-lg p-4 border border-gray-200 " >
< div class = " flex items-center gap-2 mb-2 " >
< span class = " bg-sky-100 text-sky-800 text-xs font-bold px-2 py-0.5 rounded " > 기본 </ span >
< span class = " text-sm font-semibold text-gray-800 " > 명령어 한 줄 실행 </ span >
</ div >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > exec < span class = " code-string " > sam - api - 1 </ span > < span class = " code-path " > php artisan migrate </ span >
< span class = " code-comment " > # sam-api-1 컨테이너 안에서 php artisan migrate 실행</span></div>
</ div >
< div class = " cmd-card bg-gray-50 rounded-lg p-4 border border-gray-200 " >
< div class = " flex items-center gap-2 mb-2 " >
< span class = " bg-purple-100 text-purple-800 text-xs font-bold px-2 py-0.5 rounded " > 대화형 </ span >
< span class = " text-sm font-semibold text-gray-800 " > 컨테이너 안에 직접 들어가기 ( - it ) </ span >
</ div >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > exec < span class = " code-flag " >- it </ span > < span class = " code-string " > sam - api - 1 </ span > < span class = " code-path " > bash </ span >
< span class = " code-comment " > # -i = interactive (키보드 입력 가능)</span>
< span class = " code-comment " > # -t = tty (터미널 화면 할당)</span>
< span class = " code-comment " > # bash = 쉘 프로그램 실행</span>
< span class = " code-output " > root @ a1b2c3d4 :/ var / www / html #</span> <span class="code-comment">← 컨테이너 안에 들어온 상태</span>
< span class = " code-output " > root @ a1b2c3d4 :/ var / www / html #</span> exit <span class="code-comment">← exit로 빠져나오기</span></div>
</ div >
</ div >
< div class = " bg-blue-50 rounded-lg p-4 border border-blue-100 mt-4 " >
< p class = " font-semibold text-blue-800 mb-1 " >- it 언제 쓰나 ? </ p >
< div class = " text-xs text-blue-900 space-y-1 " >
< p >< strong > 쓰지 않아도 되는 경우 :</ strong > 명령어 하나만 실행하고 끝날 때 < code class = " bg-blue-100 px-1 rounded " > docker exec sam - api - 1 php artisan migrate </ code ></ p >
< p >< strong > 써야 하는 경우 :</ strong > 컨테이너 안에서 여러 명령을 연속으로 할 때 , 또는 < code class = " bg-blue-100 px-1 rounded " > tinker </ code > 처럼 대화형 프로그램을 실행할 때 </ p >
</ div >
</ div >
</ div >
< div id = " sam-patterns " class = " scroll-mt-20 " >
< h3 class = " text-lg font-semibold text-gray-800 mb-3 flex items-center gap-2 " >
< span class = " w-2 h-2 bg-sky-400 rounded-full " ></ span >
SAM 프로젝트 전용 명령어 패턴
</ h3 >
< div class = " bg-indigo-50 border-2 border-indigo-300 rounded-xl p-5 mb-4 " >
< div class = " flex items-start gap-3 " >
< span class = " w-8 h-8 bg-indigo-500 text-white rounded-lg flex items-center justify-center text-sm font-bold shrink-0 " >!</ span >
< div >
< p class = " font-bold text-indigo-900 mb-1 " > 핵심 : 마이그레이션은 반드시 API 컨테이너에서 !</ p >
< p class = " text-xs text-indigo-700 " > MNG에서 마이그레이션 실행 금지 . 모든 DB 관련 작업은 < code class = " bg-indigo-100 px-1 rounded " > sam - api - 1 </ code > 에서만 실행한다 .</ p >
</ div >
</ div >
</ div >
< div class = " overflow-x-auto " >
< table class = " w-full text-xs border-collapse " >
< thead >
< tr class = " bg-gray-100 " >
< th class = " text-left p-3 border border-gray-200 font-semibold text-gray-700 " style = " min-width: 120px; " > 목적 </ th >
< th class = " text-left p-3 border border-gray-200 font-semibold text-gray-700 " > 명령어 </ th >
</ tr >
</ thead >
< tbody >
< tr >
< td class = " p-3 border border-gray-200 font-medium text-gray-800 " > 마이그레이션 </ td >
< td class = " p-3 border border-gray-200 " >< code class = " bg-gray-100 px-1.5 py-0.5 rounded text-xs " > docker exec sam - api - 1 php artisan migrate </ code ></ td >
</ tr >
< tr class = " bg-gray-50 " >
< td class = " p-3 border border-gray-200 font-medium text-gray-800 " > 캐시 클리어 ( MNG ) </ td >
< td class = " p-3 border border-gray-200 " >< code class = " bg-gray-100 px-1.5 py-0.5 rounded text-xs " > docker exec sam - mng - 1 php artisan cache : clear </ code ></ td >
</ tr >
< tr >
< td class = " p-3 border border-gray-200 font-medium text-gray-800 " > 캐시 클리어 ( API ) </ td >
< td class = " p-3 border border-gray-200 " >< code class = " bg-gray-100 px-1.5 py-0.5 rounded text-xs " > docker exec sam - api - 1 php artisan cache : clear </ code ></ td >
</ tr >
< tr class = " bg-gray-50 " >
< td class = " p-3 border border-gray-200 font-medium text-gray-800 " > 설정 초기화 </ td >
< td class = " p-3 border border-gray-200 " >< code class = " bg-gray-100 px-1.5 py-0.5 rounded text-xs " > docker exec sam - api - 1 php artisan config : clear </ code ></ td >
</ tr >
< tr >
< td class = " p-3 border border-gray-200 font-medium text-gray-800 " > Composer 설치 </ td >
< td class = " p-3 border border-gray-200 " >< code class = " bg-gray-100 px-1.5 py-0.5 rounded text-xs " > docker exec sam - api - 1 composer install </ code ></ td >
</ tr >
< tr class = " bg-gray-50 " >
< td class = " p-3 border border-gray-200 font-medium text-gray-800 " > Tinker ( 대화형 ) </ td >
< td class = " p-3 border border-gray-200 " >< code class = " bg-gray-100 px-1.5 py-0.5 rounded text-xs " > docker exec - it sam - api - 1 php artisan tinker </ code ></ td >
</ tr >
< tr >
< td class = " p-3 border border-gray-200 font-medium text-gray-800 " > MySQL 접속 </ td >
< td class = " p-3 border border-gray-200 " >< code class = " bg-gray-100 px-1.5 py-0.5 rounded text-xs " > docker exec - it sam - mysql - 1 mysql - u root - proot samdb </ code ></ td >
</ tr >
< tr class = " bg-gray-50 " >
< td class = " p-3 border border-gray-200 font-medium text-gray-800 " > Pint 포맷팅 ( MNG ) </ td >
< td class = " p-3 border border-gray-200 " >< code class = " bg-gray-100 px-1.5 py-0.5 rounded text-xs " > docker exec sam - mng - 1 ./ vendor / bin / pint </ code ></ td >
</ tr >
< tr >
< td class = " p-3 border border-gray-200 font-medium text-gray-800 " > 라우트 목록 </ td >
< td class = " p-3 border border-gray-200 " >< code class = " bg-gray-100 px-1.5 py-0.5 rounded text-xs " > docker exec sam - mng - 1 php artisan route : list </ code ></ td >
</ tr >
</ tbody >
</ table >
</ div >
< div class = " mt-4 grid grid-cols-1 md:grid-cols-3 gap-3 text-xs " >
< div class = " bg-sky-50 rounded-lg p-3 border border-sky-200 text-center " >
< p class = " font-bold text-sky-800 mb-1 " > sam - api - 1 </ p >
< p class = " text-sky-700 " > API 서버 ( Laravel ) < br > 마이그레이션 , 시더 , API </ p >
</ div >
< div class = " bg-emerald-50 rounded-lg p-3 border border-emerald-200 text-center " >
< p class = " font-bold text-emerald-800 mb-1 " > sam - mng - 1 </ p >
< p class = " text-emerald-700 " > 관리자 웹 ( Laravel ) < br > 뷰 , 라우트 , 포맷팅 </ p >
</ div >
< div class = " bg-amber-50 rounded-lg p-3 border border-amber-200 text-center " >
< p class = " font-bold text-amber-800 mb-1 " > sam - mysql - 1 </ p >
< p class = " text-amber-700 " > MySQL 데이터베이스 < br > DB 접속 , 쿼리 실행 </ p >
</ div >
</ div >
</ div >
</ div >
</ section >
{{ -- ============================================================ -- }}
{{ -- 4. 로그 확인 -- }}
{{ -- ============================================================ -- }}
< section id = " container-logs " class = " scroll-mt-20 " >
< div class = " bg-white rounded-xl shadow-sm border border-gray-100 p-6 " >
< h2 class = " text-xl font-bold text-gray-800 mb-6 flex items-center gap-3 " >
< span class = " w-8 h-8 bg-sky-600 text-white rounded-lg flex items-center justify-center text-sm font-bold " > 4 </ span >
로그 확인
</ h2 >
< div id = " docker-logs " class = " scroll-mt-20 " >
< h3 class = " text-lg font-semibold text-gray-800 mb-3 flex items-center gap-2 " >
< span class = " w-2 h-2 bg-sky-400 rounded-full " ></ span >
docker logs — 컨테이너 로그 보기
< span class = " help-balloon-trigger " onclick = " toggleBalloon(this) " > ? < span class = " help-balloon " > 컨테이너가 출력하는 모든 메시지 ( 에러 , 접속 기록 등 ) 를 확인할 수 있다 . 오류 원인을 찾을 때 필수 .</ span ></ span >
</ h3 >
< div class = " space-y-3 " >
< div class = " cmd-card bg-gray-50 rounded-lg p-4 border border-gray-200 " >
< div class = " flex items-center gap-2 mb-2 " >
< span class = " bg-sky-100 text-sky-800 text-xs font-bold px-2 py-0.5 rounded " > 기본 </ span >
< span class = " text-sm font-semibold text-gray-800 " > 전체 로그 보기 </ span >
</ div >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > logs < span class = " code-string " > sam - api - 1 </ span >
< span class = " code-comment " > # 컨테이너 시작부터 지금까지의 모든 로그 출력</span></div>
</ div >
< div class = " cmd-card bg-gray-50 rounded-lg p-4 border border-gray-200 " >
< div class = " flex items-center gap-2 mb-2 " >
< span class = " bg-purple-100 text-purple-800 text-xs font-bold px-2 py-0.5 rounded " > 응용 </ span >
< span class = " text-sm font-semibold text-gray-800 " > 최근 N줄만 보기 ( -- tail ) </ span >
</ div >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > logs < span class = " code-flag " >-- tail 50 </ span > < span class = " code-string " > sam - nginx - 1 </ span >
< span class = " code-comment " > # 최근 50줄만 출력. 로그가 많을 때 유용</span></div>
</ div >
< div class = " cmd-card bg-gray-50 rounded-lg p-4 border border-gray-200 " >
< div class = " flex items-center gap-2 mb-2 " >
< span class = " bg-green-100 text-green-800 text-xs font-bold px-2 py-0.5 rounded " > 실시간 </ span >
< span class = " text-sm font-semibold text-gray-800 " > 실시간 로그 추적 ( - f ) </ span >
</ div >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > logs < span class = " code-flag " >- f </ span > < span class = " code-string " > sam - api - 1 </ span >
< span class = " code-comment " > # -f = follow. 새 로그가 생기면 실시간으로 표시</span>
< span class = " code-comment " > # Ctrl + C 로 종료</span></div>
</ div >
< div class = " cmd-card bg-gray-50 rounded-lg p-4 border border-gray-200 " >
< div class = " flex items-center gap-2 mb-2 " >
< span class = " bg-amber-100 text-amber-800 text-xs font-bold px-2 py-0.5 rounded " > 시간 필터 </ span >
< span class = " text-sm font-semibold text-gray-800 " > 특정 시간 이후 로그 ( -- since ) </ span >
</ div >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > logs < span class = " code-flag " >-- since 30 m </ span > < span class = " code-string " > sam - api - 1 </ span >
< span class = " code-comment " > # 최근 30분 이내의 로그만 출력</span>
< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > logs < span class = " code-flag " >-- since 2 h </ span > < span class = " code-string " > sam - mng - 1 </ span >
< span class = " code-comment " > # 최근 2시간 이내의 로그만 출력</span></div>
</ div >
< div class = " cmd-card bg-gray-50 rounded-lg p-4 border border-gray-200 " >
< div class = " flex items-center gap-2 mb-2 " >
< span class = " bg-purple-100 text-purple-800 text-xs font-bold px-2 py-0.5 rounded " > 조합 </ span >
< span class = " text-sm font-semibold text-gray-800 " > 실무에서 가장 많이 쓰는 조합 </ span >
</ div >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > logs < span class = " code-flag " >-- tail 100 - f </ span > < span class = " code-string " > sam - api - 1 </ span >
< span class = " code-comment " > # 최근 100줄 출력 후 실시간 추적. 실무 디버깅의 기본!</span></div>
</ div >
</ div >
</ div >
</ div >
</ section >
{{ -- ============================================================ -- }}
{{ -- 5. Docker Compose -- }}
{{ -- ============================================================ -- }}
< section id = " docker-compose " class = " scroll-mt-20 " >
< div class = " bg-white rounded-xl shadow-sm border border-gray-100 p-6 " >
< h2 class = " text-xl font-bold text-gray-800 mb-6 flex items-center gap-3 " >
< span class = " w-8 h-8 bg-sky-600 text-white rounded-lg flex items-center justify-center text-sm font-bold " > 5 </ span >
Docker Compose
</ h2 >
< div id = " compose-commands " class = " scroll-mt-20 " >
< h3 class = " text-lg font-semibold text-gray-800 mb-3 flex items-center gap-2 " >
< span class = " w-2 h-2 bg-sky-400 rounded-full " ></ span >
주요 명령어
< span class = " help-balloon-trigger " onclick = " toggleBalloon(this) " > ? < span class = " help-balloon " > Docker Compose는 여러 컨테이너를 한 번에 관리하는 도구이다 . docker - compose . yml 파일에 모든 설정이 정의되어 있다 .</ span ></ span >
</ h3 >
< div class = " bg-amber-50 rounded-lg p-4 border border-amber-100 mb-4 " >
< p class = " font-semibold text-amber-800 mb-1 " > 비유 : 오케스트라 지휘자 </ p >
< p class = " text-xs text-amber-900 leading-relaxed " >
Docker Compose는 < strong > 오케스트라 지휘자 </ strong > 와 같다 . 지휘자가 악보 ( docker - compose . yml ) 하나로
모든 악기 ( 컨테이너 ) 를 동시에 시작·중지·조율하듯 , Compose는 여러 컨테이너를 < strong > 한 번에 관리 </ strong > 한다 .
</ p >
</ div >
< div class = " bg-blue-50 rounded-lg p-4 border border-blue-100 mb-4 " >
< p class = " font-semibold text-blue-800 mb-1 " > SAM의 docker - compose . yml 위치 </ p >
< p class = " text-xs text-blue-900 " >< code class = " bg-blue-100 px-1.5 py-0.5 rounded " >/ home / aweso / sam / docker - compose . yml </ code ></ p >
< p class = " text-xs text-blue-700 mt-1 " > 모든 < code class = " bg-blue-100 px-1 rounded " > docker compose </ code > 명령어는 이 파일이 있는 디렉토리 ( < code class = " bg-blue-100 px-1 rounded " >/ home / aweso / sam </ code > ) 에서 실행해야 한다 .</ p >
</ div >
< div class = " space-y-3 " >
< div class = " cmd-card bg-gray-50 rounded-lg p-4 border border-gray-200 " >
< div class = " flex items-center gap-2 mb-2 " >
< span class = " bg-green-100 text-green-800 text-xs font-bold px-2 py-0.5 rounded " > 시작 </ span >
< span class = " text-sm font-semibold text-gray-800 " > 모든 컨테이너 시작 </ span >
</ div >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > cd </ span > < span class = " code-path " >/ home / aweso / sam </ span >
< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker compose </ span > up < span class = " code-flag " >- d </ span >
< span class = " code-comment " > # -d = detached (백그라운드 실행)</span>
< span class = " code-comment " > # docker-compose.yml에 정의된 모든 서비스를 한 번에 시작</span></div>
</ div >
< div class = " cmd-card bg-gray-50 rounded-lg p-4 border border-gray-200 " >
< div class = " flex items-center gap-2 mb-2 " >
< span class = " bg-red-100 text-red-800 text-xs font-bold px-2 py-0.5 rounded " > 종료 </ span >
< span class = " text-sm font-semibold text-gray-800 " > 모든 컨테이너 종료 </ span >
</ div >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker compose </ span > down
< span class = " code-comment " > # 모든 컨테이너를 중지하고 제거</span>
< span class = " code-comment " > # 볼륨(DB 데이터)은 유지됨!</span></div>
</ div >
< div class = " cmd-card bg-gray-50 rounded-lg p-4 border border-gray-200 " >
< div class = " flex items-center gap-2 mb-2 " >
< span class = " bg-sky-100 text-sky-800 text-xs font-bold px-2 py-0.5 rounded " > 상태 </ span >
< span class = " text-sm font-semibold text-gray-800 " > 서비스 상태 확인 </ span >
</ div >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker compose </ span > ps
< span class = " code-output " > NAME SERVICE STATUS PORTS
sam - api - 1 api running 9000 / tcp
sam - mng - 1 mng running 9000 / tcp
sam - mysql - 1 mysql running 3306 / tcp
sam - nginx - 1 nginx running 0.0 . 0.0 : 80 -> 80 / tcp </ span ></ div >
</ div >
< div class = " cmd-card bg-gray-50 rounded-lg p-4 border border-gray-200 " >
< div class = " flex items-center gap-2 mb-2 " >
< span class = " bg-amber-100 text-amber-800 text-xs font-bold px-2 py-0.5 rounded " > 로그 </ span >
< span class = " text-sm font-semibold text-gray-800 " > 전체 서비스 로그 보기 </ span >
</ div >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker compose </ span > logs < span class = " code-flag " >- f </ span >
< span class = " code-comment " > # 모든 서비스의 로그를 한 화면에서 실시간 추적</span>
< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker compose </ span > logs < span class = " code-flag " >- f </ span > < span class = " code-string " > api mng </ span >
< span class = " code-comment " > # 특정 서비스만 골라서 로그 확인</span></div>
</ div >
< div class = " cmd-card bg-gray-50 rounded-lg p-4 border border-gray-200 " >
< div class = " flex items-center gap-2 mb-2 " >
< span class = " bg-purple-100 text-purple-800 text-xs font-bold px-2 py-0.5 rounded " > 재시작 </ span >
< span class = " text-sm font-semibold text-gray-800 " > 특정 서비스만 재시작 </ span >
</ div >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker compose </ span > restart < span class = " code-string " > api </ span >
< span class = " code-comment " > # api 서비스만 재시작 (다른 서비스는 그대로)</span>
< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker compose </ span > restart
< span class = " code-comment " > # 모든 서비스 재시작</span></div>
</ div >
</ div >
</ div >
</ div >
</ section >
{{ -- ============================================================ -- }}
{{ -- 6. 볼륨 & 네트워크 -- }}
{{ -- ============================================================ -- }}
< section id = " volume-network " class = " scroll-mt-20 " >
< div class = " bg-white rounded-xl shadow-sm border border-gray-100 p-6 " >
< h2 class = " text-xl font-bold text-gray-800 mb-6 flex items-center gap-3 " >
< span class = " w-8 h-8 bg-sky-600 text-white rounded-lg flex items-center justify-center text-sm font-bold " > 6 </ span >
볼륨 & 네트워크
</ h2 >
< div id = " volume-list " class = " scroll-mt-20 mb-8 " >
< h3 class = " text-lg font-semibold text-gray-800 mb-3 flex items-center gap-2 " >
< span class = " w-2 h-2 bg-sky-400 rounded-full " ></ span >
볼륨 관리
< span class = " help-balloon-trigger " onclick = " toggleBalloon(this) " > ? < span class = " help-balloon " > 볼륨은 컨테이너 데이터를 영구 저장하는 공간이다 . 컨테이너를 삭제해도 볼륨에 저장된 데이터 ( DB 등 ) 는 남아 있다 .</ span ></ span >
</ h3 >
< div class = " bg-amber-50 rounded-lg p-4 border border-amber-100 mb-4 " >
< p class = " font-semibold text-amber-800 mb-1 " > 비유 : USB 외장하드 </ p >
< p class = " text-xs text-amber-900 leading-relaxed " >
컨테이너가 컴퓨터라면 , 볼륨은 < strong > USB 외장하드 </ strong > 이다 .
컴퓨터 ( 컨테이너 ) 를 바꿔도 외장하드 ( 볼륨 ) 에 저장한 데이터는 그대로 남아 있다 .
</ p >
</ div >
< div class = " space-y-3 " >
< div class = " cmd-card bg-gray-50 rounded-lg p-4 border border-gray-200 " >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > volume ls
< span class = " code-comment " > # 생성된 볼륨 목록 조회</span>
< span class = " code-output " > DRIVER VOLUME NAME
local sam_mysql - data
local sam_phpmyadmin - data </ span ></ div >
</ div >
< div class = " cmd-card bg-gray-50 rounded-lg p-4 border border-gray-200 " >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > volume inspect < span class = " code-string " > sam_mysql - data </ span >
< span class = " code-comment " > # 볼륨의 상세 정보(저장 위치 등) 확인</span></div>
</ div >
</ div >
< div class = " mt-4 overflow-x-auto " >
< table class = " w-full text-xs border-collapse " >
< thead >
< tr class = " bg-gray-100 " >
< th class = " text-left p-3 border border-gray-200 font-semibold text-gray-700 " > 볼륨 이름 </ th >
< th class = " text-left p-3 border border-gray-200 font-semibold text-gray-700 " > 용도 </ th >
< th class = " text-left p-3 border border-gray-200 font-semibold text-gray-700 " > 삭제 시 영향 </ th >
</ tr >
</ thead >
< tbody >
< tr >
< td class = " p-3 border border-gray-200 font-mono " > sam_mysql - data </ td >
< td class = " p-3 border border-gray-200 " > MySQL 데이터 저장 </ td >
< td class = " p-3 border border-gray-200 " >< span class = " danger-badge bg-red-100 text-red-800 " > DB 데이터 전체 삭제 !</ span ></ td >
</ tr >
< tr class = " bg-gray-50 " >
< td class = " p-3 border border-gray-200 font-mono " > sam_phpmyadmin - data </ td >
< td class = " p-3 border border-gray-200 " > phpMyAdmin 세션 </ td >
< td class = " p-3 border border-gray-200 " >< span class = " text-gray-500 " > 영향 미미 </ span ></ td >
</ tr >
</ tbody >
</ table >
</ div >
</ div >
< div id = " network-list " class = " scroll-mt-20 " >
< h3 class = " text-lg font-semibold text-gray-800 mb-3 flex items-center gap-2 " >
< span class = " w-2 h-2 bg-sky-400 rounded-full " ></ span >
네트워크 관리
< span class = " help-balloon-trigger " onclick = " toggleBalloon(this) " > ? < span class = " help-balloon " > Docker 네트워크는 컨테이너들이 서로 통신하는 가상 네트워크이다 . SAM의 모든 컨테이너는 samnet이라는 하나의 네트워크에 연결되어 있다 .</ span ></ span >
</ h3 >
< div class = " space-y-3 " >
< div class = " cmd-card bg-gray-50 rounded-lg p-4 border border-gray-200 " >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > network ls
< span class = " code-comment " > # Docker 네트워크 목록 조회</span>
< span class = " code-output " > NETWORK ID NAME DRIVER SCOPE
abc123def samnet bridge local </ span ></ div >
</ div >
< div class = " cmd-card bg-gray-50 rounded-lg p-4 border border-gray-200 " >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > network inspect < span class = " code-string " > samnet </ span >
< span class = " code-comment " > # samnet에 연결된 컨테이너 목록과 IP 주소 확인</span></div>
</ div >
</ div >
< div class = " bg-blue-50 rounded-lg p-4 border border-blue-100 mt-4 " >
< p class = " font-semibold text-blue-800 mb-1 " > SAM 네트워크 구조 </ p >
< p class = " text-xs text-blue-900 " >
모든 SAM 컨테이너는 < code class = " bg-blue-100 px-1 rounded " > samnet </ code > 브리지 네트워크에 연결되어 있다 .
같은 네트워크 안에서는 < strong > 컨테이너 이름으로 서로 접근 </ strong > 할 수 있다 .
예 : API 컨테이너가 MySQL에 접속할 때 < code class = " bg-blue-100 px-1 rounded " > sam - mysql - 1 : 3306 </ code > 으로 연결한다 .
</ p >
</ div >
</ div >
</ div >
</ section >
{{ -- ============================================================ -- }}
{{ -- 7. 트러블슈팅 -- }}
{{ -- ============================================================ -- }}
< section id = " troubleshooting " class = " scroll-mt-20 " >
< div class = " bg-white rounded-xl shadow-sm border border-gray-100 p-6 " >
< h2 class = " text-xl font-bold text-gray-800 mb-6 flex items-center gap-3 " >
< span class = " w-8 h-8 bg-sky-600 text-white rounded-lg flex items-center justify-center text-sm font-bold " > 7 </ span >
트러블슈팅
</ h2 >
< div id = " common-issues " class = " scroll-mt-20 " >
< h3 class = " text-lg font-semibold text-gray-800 mb-3 flex items-center gap-2 " >
< span class = " w-2 h-2 bg-sky-400 rounded-full " ></ span >
자주 발생하는 문제 & 해결 방법
</ h3 >
{{ -- 문제 1 -- }}
< div class = " mb-4 " >
< div class = " cmd-card bg-red-50 rounded-lg p-4 border border-red-200 " >
< p class = " font-bold text-red-800 mb-2 " > 문제 1 : " 사이트에 연결할 수 없음 " ( mng . sam . kr 접속 불가 ) </ p >
< p class = " text-xs text-red-700 mb-3 " > 원인 : Docker 컨테이너가 실행되지 않았거나 중지된 상태 </ p >
< p class = " text-xs font-semibold text-gray-800 mb-1 " > 해결 :</ p >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > ps < span class = " code-comment " > # 실행 중인 컨테이너 확인</span>
< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > cd </ span > < span class = " code-path " >/ home / aweso / sam </ span >
< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker compose </ span > up < span class = " code-flag " >- d </ span > < span class = " code-comment " > # 모든 서비스 시작</span></div>
</ div >
</ div >
{{ -- 문제 2 -- }}
< div class = " mb-4 " >
< div class = " cmd-card bg-red-50 rounded-lg p-4 border border-red-200 " >
< p class = " font-bold text-red-800 mb-2 " > 문제 2 : " 500 Server Error " ( 서버 내부 오류 ) </ p >
< p class = " text-xs text-red-700 mb-3 " > 원인 : PHP 오류 , . env 설정 문제 , 캐시 문제 등 </ p >
< p class = " text-xs font-semibold text-gray-800 mb-1 " > 해결 :</ p >
< div class = " code-block " >< span class = " code-comment " > # 1. 로그 확인 (원인 파악)</span>
< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > logs < span class = " code-flag " >-- tail 50 </ span > < span class = " code-string " > sam - mng - 1 </ span >
< span class = " code-comment " > # 2. 캐시 전부 클리어</span>
< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > exec < span class = " code-string " > sam - mng - 1 </ span > < span class = " code-path " > php artisan config : clear </ span >
< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > exec < span class = " code-string " > sam - mng - 1 </ span > < span class = " code-path " > php artisan cache : clear </ span >
< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > exec < span class = " code-string " > sam - mng - 1 </ span > < span class = " code-path " > php artisan view : clear </ span ></ div >
</ div >
</ div >
{{ -- 문제 3 -- }}
< div class = " mb-4 " >
< div class = " cmd-card bg-red-50 rounded-lg p-4 border border-red-200 " >
< p class = " font-bold text-red-800 mb-2 " > 문제 3 : " Class not found " ( 클래스를 찾을 수 없음 ) </ p >
< p class = " text-xs text-red-700 mb-3 " > 원인 : Composer autoload가 갱신되지 않았거나 , 새 패키지 설치가 필요 </ p >
< p class = " text-xs font-semibold text-gray-800 mb-1 " > 해결 :</ p >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > exec < span class = " code-string " > sam - mng - 1 </ span > < span class = " code-path " > composer dump - autoload </ span >
< span class = " code-comment " > # 또는 composer install로 전체 의존성 재설치</span>
< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > exec < span class = " code-string " > sam - mng - 1 </ span > < span class = " code-path " > composer install </ span ></ div >
</ div >
</ div >
{{ -- 문제 4 -- }}
< div class = " mb-4 " >
< div class = " cmd-card bg-red-50 rounded-lg p-4 border border-red-200 " >
< p class = " font-bold text-red-800 mb-2 " > 문제 4 : " Connection refused " ( MySQL 접속 실패 ) </ p >
< p class = " text-xs text-red-700 mb-3 " > 원인 : MySQL 컨테이너가 아직 시작되지 않았거나 , . env의 DB 설정이 잘못됨 </ p >
< p class = " text-xs font-semibold text-gray-800 mb-1 " > 해결 :</ p >
< div class = " code-block " >< span class = " code-comment " > # 1. MySQL 컨테이너 상태 확인</span>
< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > ps < span class = " code-flag " >- a </ span > | grep mysql
< span class = " code-comment " > # STATUS가 "Up"인지 확인</span>
< span class = " code-comment " > # 2. MySQL이 중지되어 있다면 시작</span>
< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > start < span class = " code-string " > sam - mysql - 1 </ span >
< span class = " code-comment " > # 3. MySQL 접속 테스트</span>
< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > exec < span class = " code-flag " >- it </ span > < span class = " code-string " > sam - mysql - 1 </ span > < span class = " code-path " > mysql - u root - proot samdb </ span ></ div >
</ div >
</ div >
{{ -- 문제 5 -- }}
< div class = " mb-6 " >
< div class = " cmd-card bg-red-50 rounded-lg p-4 border border-red-200 " >
< p class = " font-bold text-red-800 mb-2 " > 문제 5 : " Permission denied " ( 권한 오류 ) </ p >
< p class = " text-xs text-red-700 mb-3 " > 원인 : storage , bootstrap / cache 디렉토리의 쓰기 권한이 없음 </ p >
< p class = " text-xs font-semibold text-gray-800 mb-1 " > 해결 :</ p >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > exec < span class = " code-string " > sam - mng - 1 </ span > < span class = " code-path " > chmod - R 777 storage bootstrap / cache </ span >
< span class = " code-comment " > # storage와 bootstrap/cache에 모든 권한 부여</span></div>
</ div >
</ div >
{{ -- SAM 캐시 클리어 총정리 -- }}
< div class = " bg-emerald-50 border-2 border-emerald-300 rounded-xl p-5 " >
< h4 class = " font-bold text-emerald-900 mb-3 flex items-center gap-2 " >
< span class = " text-lg " > 🧹 </ span > SAM 캐시 클리어 총정리 ( 외우면 좋은 명령어 )
</ h4 >
< div class = " code-block " >< span class = " code-comment " > # === MNG 캐시 클리어 ===</span>
< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > exec < span class = " code-string " > sam - mng - 1 </ span > < span class = " code-path " > php artisan config : clear </ span > < span class = " code-comment " > # 설정 캐시</span>
< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > exec < span class = " code-string " > sam - mng - 1 </ span > < span class = " code-path " > php artisan cache : clear </ span > < span class = " code-comment " > # 앱 캐시</span>
< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > exec < span class = " code-string " > sam - mng - 1 </ span > < span class = " code-path " > php artisan view : clear </ span > < span class = " code-comment " > # 뷰 캐시</span>
< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > exec < span class = " code-string " > sam - mng - 1 </ span > < span class = " code-path " > php artisan route : clear </ span > < span class = " code-comment " > # 라우트 캐시</span>
< span class = " code-comment " > # === API 캐시 클리어 ===</span>
< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > exec < span class = " code-string " > sam - api - 1 </ span > < span class = " code-path " > php artisan config : clear </ span >
< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > exec < span class = " code-string " > sam - api - 1 </ span > < span class = " code-path " > php artisan cache : clear </ span >
< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > exec < span class = " code-string " > sam - api - 1 </ span > < span class = " code-path " > php artisan view : clear </ span >
< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > exec < span class = " code-string " > sam - api - 1 </ span > < span class = " code-path " > php artisan route : clear </ span ></ div >
< p class = " text-xs text-emerald-700 mt-2 " >
< strong > 팁 :</ strong > . env 파일을 수정했다면 반드시 < code class = " bg-emerald-100 px-1 rounded " > config : clear </ code > 를 실행해야 변경이 적용된다 .
</ p >
</ div >
</ div >
</ div >
</ section >
{{ -- ============================================================ -- }}
{{ -- 8. 위험한 명령어 -- }}
{{ -- ============================================================ -- }}
< section id = " danger-zone " class = " scroll-mt-20 " >
< div class = " bg-white rounded-xl shadow-sm border border-red-200 p-6 " >
< h2 class = " text-xl font-bold text-red-700 mb-6 flex items-center gap-3 " >
< span class = " w-8 h-8 bg-red-600 text-white rounded-lg flex items-center justify-center text-sm font-bold " > 8 </ span >
위험한 명령어
</ h2 >
< div id = " danger-commands " class = " scroll-mt-20 " >
< div class = " bg-red-50 border-2 border-red-300 rounded-xl p-5 mb-6 " >
< div class = " flex items-start gap-3 " >
< span class = " w-8 h-8 bg-red-500 text-white rounded-lg flex items-center justify-center text-sm font-bold shrink-0 " >!</ span >
< div >
< p class = " font-bold text-red-900 mb-1 " > 경고 : 아래 명령어는 데이터 손실을 유발할 수 있다 </ p >
< p class = " text-xs text-red-700 " >
의미를 정확히 이해하지 않은 채 실행하면 < strong > DB 데이터 전체 삭제 , 이미지 삭제 등 돌이킬 수 없는 피해 </ strong > 가 발생할 수 있다 .
반드시 팀장이나 담당 개발자에게 확인 후 실행하자 .
</ p >
</ div >
</ div >
</ div >
< div class = " space-y-4 " >
< div class = " cmd-card bg-gray-50 rounded-lg p-4 border-2 border-red-200 " >
< div class = " flex items-center gap-2 mb-2 " >
< span class = " danger-badge bg-red-100 text-red-800 " > 위험도 ★★★ </ span >
< span class = " text-sm font-bold text-gray-800 " > docker compose down - v </ span >
</ div >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker compose </ span > down < span class = " code-danger " >- v </ span >
< span class = " code-comment " > # -v = volumes. 컨테이너뿐만 아니라 볼륨(DB 데이터)까지 전부 삭제!</span>
< span class = " code-comment " > # MySQL 데이터가 완전히 사라진다. 절대 함부로 실행하지 말 것!</span></div>
< p class = " text-xs text-red-700 mt-2 " >
< strong > 안전한 대안 :</ strong > < code class = " bg-red-100 px-1 rounded " > docker compose down </ code > ( - v 없이 ) — 볼륨은 유지하면서 컨테이너만 종료
</ p >
</ div >
< div class = " cmd-card bg-gray-50 rounded-lg p-4 border-2 border-red-200 " >
< div class = " flex items-center gap-2 mb-2 " >
< span class = " danger-badge bg-red-100 text-red-800 " > 위험도 ★★★ </ span >
< span class = " text-sm font-bold text-gray-800 " > docker system prune - a </ span >
</ div >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > system prune < span class = " code-danger " >- a </ span >
< span class = " code-comment " > # 사용하지 않는 모든 이미지, 네트워크, 컨테이너를 일괄 삭제</span>
< span class = " code-comment " > # SAM 이미지까지 삭제되어 docker compose up 시 처음부터 빌드해야 함</span></div>
< p class = " text-xs text-red-700 mt-2 " >
< strong > 디스크 공간이 부족하다면 :</ strong > < code class = " bg-red-100 px-1 rounded " > docker image prune </ code > — 안 쓰는 이미지만 선별 삭제
</ p >
</ div >
< div class = " cmd-card bg-gray-50 rounded-lg p-4 border-2 border-red-200 " >
< div class = " flex items-center gap-2 mb-2 " >
< span class = " danger-badge bg-amber-100 text-amber-800 " > 위험도 ★★ </ span >
< span class = " text-sm font-bold text-gray-800 " > docker rm - f </ span >
</ div >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > rm < span class = " code-danger " >- f </ span > < span class = " code-string " > sam - api - 1 </ span >
< span class = " code-comment " > # -f = force. 실행 중인 컨테이너를 강제로 삭제</span>
< span class = " code-comment " > # 정상적인 종료 절차 없이 즉시 제거됨</span></div>
< p class = " text-xs text-red-700 mt-2 " >
< strong > 안전한 대안 :</ strong > < code class = " bg-amber-100 px-1 rounded " > docker stop sam - api - 1 </ code > — 먼저 안전하게 중지
</ p >
</ div >
< div class = " cmd-card bg-gray-50 rounded-lg p-4 border-2 border-red-200 " >
< div class = " flex items-center gap-2 mb-2 " >
< span class = " danger-badge bg-amber-100 text-amber-800 " > 위험도 ★★ </ span >
< span class = " text-sm font-bold text-gray-800 " > docker volume rm </ span >
</ div >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > volume rm < span class = " code-danger " > sam_mysql - data </ span >
< span class = " code-comment " > # MySQL 데이터 볼륨 삭제 = DB 데이터 완전 손실!</span>
< span class = " code-comment " > # 관련 컨테이너가 중지된 상태에서만 삭제 가능</span></div>
< p class = " text-xs text-red-700 mt-2 " >
< strong > 볼륨 삭제 전 반드시 :</ strong > < code class = " bg-red-100 px-1 rounded " > docker exec - it sam - mysql - 1 mysqldump ...</ code > 로 백업 먼저 !
</ p >
</ div >
< div class = " cmd-card bg-gray-50 rounded-lg p-4 border-2 border-red-200 " >
< div class = " flex items-center gap-2 mb-2 " >
< span class = " danger-badge bg-amber-100 text-amber-800 " > 위험도 ★★ </ span >
< span class = " text-sm font-bold text-gray-800 " > docker rmi </ span >
</ div >
< div class = " code-block " >< span class = " code-prompt " > $ </ span > < span class = " code-keyword " > docker </ span > rmi < span class = " code-danger " > sam - mng </ span >
< span class = " code-comment " > # SAM MNG 이미지 삭제. 다시 빌드하는 데 시간이 소요됨</span></div>
</ div >
</ div >
{{ -- 안전 체크리스트 -- }}
< div class = " bg-green-50 border border-green-200 rounded-xl p-5 mt-6 " >
< h4 class = " font-bold text-green-900 mb-3 flex items-center gap-2 " >
< span class = " text-lg " > ✅ </ span > Docker 사용 시 안전 수칙
</ h4 >
< ul class = " text-xs text-green-800 space-y-2 " >
< li class = " flex items-start gap-2 " >
< span class = " text-green-500 font-bold mt-0.5 " > 1. </ span >
< span >< code class = " bg-green-100 px-1 rounded " >- v </ code > , < code class = " bg-green-100 px-1 rounded " >- f </ code > , < code class = " bg-green-100 px-1 rounded " > prune </ code > 플래그가 보이면 한 번 더 생각하기 </ span >
</ li >
< li class = " flex items-start gap-2 " >
< span class = " text-green-500 font-bold mt-0.5 " > 2. </ span >
< span > 볼륨 삭제 전 반드시 DB 백업 </ span >
</ li >
< li class = " flex items-start gap-2 " >
< span class = " text-green-500 font-bold mt-0.5 " > 3. </ span >
< span >< code class = " bg-green-100 px-1 rounded " > docker compose down </ code > 은 안전 , < code class = " bg-green-100 px-1 rounded " > docker compose down - v </ code > 는 위험 </ span >
</ li >
< li class = " flex items-start gap-2 " >
< span class = " text-green-500 font-bold mt-0.5 " > 4. </ span >
< span > 모르는 명령어는 팀장에게 확인 후 실행 </ span >
</ li >
< li class = " flex items-start gap-2 " >
< span class = " text-green-500 font-bold mt-0.5 " > 5. </ span >
< span >< code class = " bg-green-100 px-1 rounded " > docker ps </ code > 로 현재 상태를 먼저 확인하는 습관 기르기 </ span >
</ li >
</ ul >
</ div >
</ div >
</ div >
</ section >
</ div >
</ div >
</ div >
{{ -- Lightbox -- }}
< div id = " lightbox " onclick = " closeLightbox() " >
< img id = " lightbox-img " src = " " alt = " " >
</ div >
2026-02-25 11:22:37 +09:00
@ include ( 'components.academy-glossary' , [ 'domain' => 'docker-commands' ])
@ endsection
2026-02-25 10:33:43 +09:00
@ push ( 'scripts' )
< script >
( function () {
// 도움말 풍선 토글
window . toggleBalloon = function ( el ) {
var wasActive = el . classList . contains ( 'is-active' );
document . querySelectorAll ( '.help-balloon-trigger.is-active' ) . forEach ( function ( t ) {
t . classList . remove ( 'is-active' );
});
if ( ! wasActive ) {
el . classList . add ( 'is-active' );
}
};
// 풍선 외부 클릭 시 닫기
document . addEventListener ( 'click' , function ( e ) {
if ( ! e . target . closest ( '.help-balloon-trigger' )) {
document . querySelectorAll ( '.help-balloon-trigger.is-active' ) . forEach ( function ( t ) {
t . classList . remove ( 'is-active' );
});
}
});
// Lightbox
window . openLightbox = function ( el ) {
var lb = document . getElementById ( 'lightbox' );
var img = document . getElementById ( 'lightbox-img' );
img . src = el . src ;
img . alt = el . alt ;
lb . classList . add ( 'is-open' );
document . body . style . overflow = 'hidden' ;
};
window . closeLightbox = function () {
var lb = document . getElementById ( 'lightbox' );
lb . classList . remove ( 'is-open' );
document . body . style . overflow = '' ;
};
document . addEventListener ( 'keydown' , function ( e ) {
if ( e . key === 'Escape' ) {
closeLightbox ();
}
});
})();
</ script >
2026-02-25 11:22:37 +09:00
@ endpush