
안녕하세요,,,
오늘도 모닝30? 없습니다
내일부터? 자리 바꿉니다.
그럼 레츠고.
오늘의 수업
| 교시 | 무엇 |
|---|---|
| 2교시 | 지속 검증 · 세션 만료 |
| 3교시 | 정책 로그 · 판단과 집행 맞춰 보기 |
| 4교시 | 점수 규칙 조정 · 점검 결과 정리하기 |
| 5교시 | 어제 명령 복습 · 서버 두 대 켜고 접속 기록 구분해 읽기 |
| 6교시 | 내 이미지 만들기 (Dockerfile) |
| 7교시 | 이미지 버전 다루기 · 되돌리기 · 정리 · 올리기 |
2교시 지속 검증 · 세션 만료
오늘 들어온 일
A사 보안 담당이 보낸 메시지:
「정산 포털에 로그인한 직원이 자리를 비워도 접속이 계속 유지됩니다. 로그인할 때만 확인하지 말고 접속하는 동안에도 확인하고, 시간이 지나면 허용을 취소할 수 있나요?」
이번에는 자원마다 접속 유지 시간을 다르게 두고 세션 상태를 판정하는 함수를 만들었다.
접속 중에 상태가 바뀌었을 때 유지 · 재인증 · 종료 중 어떤 조치를 해야 하는지도 확인했다.
왜 필요한가
어제 만든 판단 함수는 요청이 들어오는 순간만 판단했다.
로그인한 뒤 기기 상태가 바뀌거나 직원이 퇴사 처리돼도 기존 접속이 그대로 유지된다면 문제가 될 수 있다.
접속이 오래 유지되면 사용자가 자리를 비운 사이 다른 사람이 사용할 수도 있고, 탈취된 세션이 계속 사용될 수도 있다.
그래서 위험한 자원일수록 접속 유지 시간을 짧게 두는 방법을 사용했다.
최소권한을 접근 범위뿐 아니라 시간에도 적용한 것이다.
2.1 세션과 지속 검증
세션
로그인한 뒤 서버가 해당 접속의 상태를 저장해 두는 것이다.
누가 언제부터 접속했는지 등을 서버가 기억한다.
서버가 발급한 토큰을 요청할 때마다 보여 주면 로그인된 접속으로 판단할 수 있다.
지속 검증
Continuous Verification
로그인할 때 한 번만 확인하는 것이 아니라 접속 중에도 계속 상태를 다시 확인하는 방식이다.
세션 만료
정해진 유지 시간이 지나면 기존 허용이 끝나고 다시 로그인해야 하는 것이다.
재인증
사용자가 실제 본인인지 다시 확인하는 것이다.
예를 들어 비밀번호나 MFA를 다시 요구할 수 있다.
회수
이미 허용된 접속을 중간에 취소하고 세션을 끝내는 것이다.
접속 중에 상황이 바뀌면 다음 세 가지 중 하나를 선택했다.
| 조치 | 언제 | 예 |
|---|---|---|
| 유지 | 허용했던 근거가 그대로인 경우 | 평소와 같은 기기 · 위치 · 업무 |
| 재인증 | 근거가 불확실해졌지만 본인 확인으로 해결할 수 있는 경우 | 만료 시각이 가까워짐 |
| 종료(회수) | 허용 근거가 사라졌고 재인증으로도 해결할 수 없는 경우 | 계정이 비활성화됨 |
실제 서비스에서도 비슷한 기능을 사용한다.
Microsoft Entra 조건부 액세스에는 다시 로그인하기 전까지 접근을 유지할 시간을 정하는 로그인 빈도 기능이 있다.
Cloudflare Access에서도 앱마다 세션 지속 시간을 설정할 수 있다.
2.2 자원마다 다른 유지 시간
이번에는 자원마다 세션 유지 시간을 다르게 설정했다.
| 자원 | 유지 시간 | 이유 |
|---|---|---|
| 정산 내역 조회 | 30분 | 읽기 중심이라 위험이 중간 |
| 계정 권한 변경 | 5분 | 계정을 직접 변경할 수 있어 위험이 큼 |
세션 상태는 접속한 뒤 지난 시간과 유지 시간을 비교해서 판단했다.
| 상태 | 조건 |
|---|---|
| 종료 | 경과 시간이 유지 시간보다 큼 |
| 재인증 | 경과 시간이 유지 시간의 0.8배 이상 |
| 유지 | 위 두 조건에 해당하지 않음 |
정산 조회의 유지 시간이 30분이라면 0.8배는 24분이다.
| 경과 시간 | 비교 | 상태 |
|---|---|---|
| 10분 | 24보다 작음 | 유지 |
| 24분 | 24 이상, 30 이하 | 재인증 |
| 30분 | 30보다 크지 않음 | 재인증 |
| 31분 | 30보다 큼 | 종료 |
조건을 확인할 때는 종료를 먼저 확인하고 그다음 재인증을 확인했다.
31분은 재인증 조건에도 해당할 수 있지만 종료 조건을 먼저 확인했기 때문에 종료가 적용됐다.
함수는 return을 만나면 그 자리에서 끝나는 방식이었다.
2.3 파일 만들기
이번부터 파일을 만드는 방법은 세 가지 중 하나를 선택했다.
방법 1 · VS Code
VS Code에서 network_zt 폴더를 선택한 뒤 새 파일을 만들었다.
day07_2-1_session_state.py
파일을 열고 코드를 붙여 넣은 뒤 저장했다.
방법 2 · touch
먼저 현재 위치를 확인했다.
pwd
network_zt 폴더가 아니라면 이동했다.
cd network_zt
빈 파일을 만들었다.
touch day07_2-1_session_state.py
그다음 VS Code에서 파일을 열어 내용을 작성했다.
방법 3 · vim
vim day07_2-1_session_state.py
순서는 다음과 같았다.
vim 파일이름
→ i
→ 내용 입력 또는 붙여넣기
→ Esc
→ :wq
→ Enter
붙여넣은 코드의 들여쓰기가 계속 밀리면 :q!로 저장하지 않고 나와 VS Code나 touch 방식을 사용했다.
2교시 한눈에
| 하려는 일 | 방법 |
|---|---|
| 세션 상태 판정 | 경과 분 > 유지 시간 → 종료 / 경과 분 ≥ 유지 시간 × 0.8 → 재인증 / 그 외 → 유지 |
| 자원별 유지 시간 | SESSION_LIMITS[session["resource"]] |
| 접속 중 변화에 대한 조치 | 근거가 그대로면 유지, 본인 확인으로 해결되면 재인증, 해결되지 않으면 종료 |
3교시 정책 로그 · 판단과 집행 맞춰 보기
오늘 들어온 일
A사 보안 담당이 보낸 메시지:
「제보가 들어왔습니다. 정책 로그에는 거부라고 적혀 있는 요청이 앱 기록에는 성공으로 남아 있다고 합니다. 결정이 제대로 집행됐는지 확인해 주세요.」
이번에는 정책 로그와 앱 접근 기록을 요청 번호로 맞춰 보고, 서로 일치하지 않는 요청을 찾아 유형별로 구분했다.
왜 필요한가
PDP가 요청을 거부했다고 결정해도 PEP가 그 결정을 제대로 집행하지 않으면 실제 요청은 통과할 수 있다.
정책 로그만 보면 거부된 것처럼 보여도 실제 앱에서는 정상 처리됐을 수 있다.
그래서 정책 로그와 앱 접근 기록을 같은 요청 번호로 맞춰 확인해야 했다.
요청이 많아지면 사람이 하나씩 비교하기 어려우므로 문제가 발생한 유형별로 개수도 세었다.
3.1 정책 로그와 앱 접근 기록
PDP
Policy Decision Point
요청을 확인하고 점수를 계산해 허용 · 추가확인 · 거부 중 하나를 결정했다.
결정만 할 뿐 실제 요청을 막거나 통과시키지는 않았다.
PEP
Policy Enforcement Point
PDP가 내린 결정대로 요청을 실제로 허용하거나 차단했다.
앱에 요청이 전달되기 전에 위치했다.
요청 번호
RID, Request ID
요청마다 하나씩 붙는 번호이다.
정책 로그와 앱 접근 기록의 같은 요청에는 같은 RID가 들어 있었다.
따라서 RID를 기준으로 두 기록을 비교할 수 있었다.
정책 로그
PDP가 요청마다 남긴 결정 기록이다.
주요 항목은 다음과 같았다.
rid
time
user
decision
score
reasons
앱 접근 기록
앱이 요청을 실제로 처리한 결과이다.
주요 항목은 다음과 같았다.
rid
time
user
status
응답 번호는 다음처럼 사용했다.
| 응답 번호 | 뜻 |
|---|---|
| 200 | 처리됨 |
| 401 | 추가 확인 필요 |
| 403 | 차단됨 |
PDP의 결정과 앱의 응답 번호는 다음처럼 맞아야 했다.
| PDP 결정 | 앱에서 나와야 하는 응답 |
|---|---|
| 허용 | 200 |
| 추가확인 | 401 |
| 거부 | 403 |
두 기록을 비교하면 결과를 네 가지로 나눌 수 있었다.
| 유형 | 모양 | 뜻 | 위험 |
|---|---|---|---|
| 일치 | 결정과 응답이 같음 | 결정대로 집행됨 | 없음 |
| 집행 누락 | 앱이 결정보다 약한 응답 | 결정이 제대로 적용되지 않음 | 높음 |
| 과집행 | 앱이 결정보다 강한 응답 | 정상 요청까지 막음 | 업무 불편 |
| 우회 | 앱 기록에만 있고 정책 로그에는 없음 | PDP를 거치지 않은 경로 | 높음 |
예를 들어 요청 번호 101은 다음과 같았다.
| 기록 | 값 |
|---|---|
| 정책 로그 101 | 거부 → 원래 403이어야 함 |
| 앱 접근 기록 101 | 200 |
| 판정 | 200 ≠ 403 → 집행 누락 |
PDP에서는 거부했지만 실제 앱에서는 요청이 정상 처리됐기 때문에 집행 누락으로 판단했다.
코드에서는 딕셔너리를 이용해 요청 번호별 값을 저장했다.
d[키] = 값
값을 꺼낼 때는 .get()을 사용할 수 있었다.
d.get(키)
키가 없으면 None이 나왔다.
유형별 개수는 다음과 같은 방식으로 셌다.
counts[kind] = counts.get(kind, 0) + 1
3교시 한눈에
| 하려는 일 | 방법 |
|---|---|
| 두 기록을 요청 번호로 맞추기 | access_status[a["rid"]] = a["status"] |
| 요청 번호로 값 꺼내기 | access_status.get(p["rid"]) |
| 결정과 응답 대조 | EXPECTED[p["decision"]]와 앱의 status 비교 |
| 어긋난 유형 | 집행 누락 · 과집행 · 우회 |
| 약한지 강한지 비교 | STRENGTH[status]와 STRENGTH[expected] 비교 |
| 유형별 개수 세기 | counts[kind] = counts.get(kind, 0) + 1 |
4교시 점수 규칙 조정 · 점검 결과 정리하기
오늘 들어온 일
A사 보안 담당이 보낸 메시지:
「재무팀 junho 가 정산 마감 주간이라 추가 확인이 계속 떠서 일을 못 한다고 합니다. 점수 규칙을 어떻게 조정하면 좋은지 숫자로 알려 주시고, 3교시에 찾은 문제와 함께 임원 보고용 한 장으로 정리해 주세요.」
이번에는 점수 규칙을 세 가지 방식으로 바꿔 보고 오탐과 미탐이 얼마나 발생하는지 비교했다.
그 결과와 3교시에서 찾은 문제를 같이 정리해 문서로 만들었다.
왜 필요한가
정상 직원에게 추가 인증이나 차단이 계속 발생하면 업무에 불편이 생긴다.
이런 상황이 반복되면 결국 보안 규칙 자체를 무시하거나 꺼 버릴 수도 있다.
하지만 정상 요청을 덜 막으려고 기준을 너무 완화하면 위험한 요청을 놓칠 수 있다.
그래서 규칙을 바꿀 때는 오탐과 미탐을 같이 확인해야 했다.
4.1 오탐 · 미탐과 점수 규칙 조정
오탐
False Positive
실제로는 정상 요청인데 규칙이 추가확인이나 거부로 판정한 경우이다.
정상 사용자의 업무가 막히거나 느려질 수 있다.
예를 들어 정산 마감 기간에 재무팀 직원이 평소보다 많은 데이터를 조회했는데 이를 이상 행동으로 판단하면 오탐이 된다.
미탐
False Negative
실제로는 위험한 요청인데 허용하거나 너무 약하게 판정한 경우이다.
위험한 요청이 차단되지 않을 수 있다.
예를 들어 대량 조회 기준을 너무 높이면 위험한 요청이 대량 조회 점수를 받지 못할 수 있다.
| 규칙 판정 | 실제 정상 | 실제 위험 |
|---|---|---|
| 허용 | 맞음 | 미탐 |
| 추가확인 · 거부 | 오탐 | 거부면 맞음, 추가확인이면 미탐 |
이번 실습에서는 위험한 요청의 올바른 결정은 거부로 정했다.
junho의 요청은 모두 등록 기기를 사용하고 MFA도 통과했기 때문에 두 가지 점수만 확인했다.
| 조건 | 점수 |
|---|---|
| 해외 접속 | +30 |
| 20건 이상 조회 | +30 |
결정 기준은 다음과 같았다.
50점 이상 → 거부
20점 이상 → 추가확인
그 아래 → 허용
규칙을 세 가지 방식으로 바꿔 봤다.
| 안 | 바꾸는 것 |
|---|---|
| A | 대량 조회 기준을 20건에서 50건으로 올림 |
| B | 대량 조회 점수를 +30에서 +10으로 낮춤 |
| C | 정산 마감 주간에는 재무팀 계정의 대량 조회 점수를 0으로 함 |
각 안을 같은 요청에 적용한 뒤 오탐과 미탐의 개수를 비교했다.
코드에서는 튜플을 세 변수로 나눠 받는 방법도 사용했다.
for name, threshold, points in PLANS:
두 조건을 같이 확인할 때는 and를 사용했다.
조건1 and 조건2
보고서 정리
점검 결과는 다음 순서로 작성했다.
결론
→ 근거
→ 권고
결론에는 확인된 사실을 적었다.
근거에는 요청 번호와 실제 숫자를 적었다.
권고에는 어떤 규칙을 조정할지와 추가로 확인할 자료를 적었다.
전문용어를 그대로 나열하는 것보다 처음 등장할 때 쉬운 말로 같이 설명하는 방식이 좋았다.
새 문서는 다음 세 가지 방법 중 하나로 만들 수 있었다.
VS Code 새 파일
touch day07_log_summary.md
vim day07_log_summary.md
저장된 내용은 다음 명령으로 확인했다.
cat day07_log_summary.md
4교시 한눈에
| 하려는 일 | 방법 |
|---|---|
| 점수 규칙 조정 비교 | 같은 요청에 각각 적용해서 오탐 · 미탐 개수 비교 |
| 조정안 꺼내기 | for name, threshold, points in PLANS: |
| 보고서 구조 | 결론 → 근거 → 권고 |
| 전문용어 | 처음 나올 때 쉬운 말로 같이 설명 |
| 문서 만들기 | VS Code · touch · vim 중 하나 |
| 저장 내용 확인 | cat day07_log_summary.md |
5교시 어제 명령 복습 · 서버 두 대 켜고 접속 기록 구분해 읽기
오늘 들어온 일
A사 보안 담당이 보낸 메시지:
「고객용 안내 페이지와 직원용 안내 페이지를 서버 두 대로 따로 켜 주세요. 고객용(site-three)은 8082번, 직원용(site-four)은 8083번입니다. 이상한 접속이 생기면 어느 페이지에 온 요청인지 바로 가려야 하니, 접속 기록이 서버마다 따로 남는지 확인해 주세요.」
어제 사용했던 Docker 명령으로 nginx 서버 두 대를 실행하고, 각각의 서버에 로그가 따로 남는지 확인했다.
왜 필요한가
Docker 명령은 처음에는 옵션이 많아서 헷갈렸다.
같은 명령을 한 번 더 사용하면서 서버 실행 · 확인 · 로그 조회 · 종료 · 삭제 순서를 다시 익혔다.
같은 이미지로 여러 서버를 실행할 때는 컨테이너 이름과 PC 포트 번호를 다르게 설정했다.
서버가 여러 대라면 로그도 서버별로 구분해서 확인해야 했다.
5.1 어제 명령 한눈에
| 명령 | 필요한 상황 | 결과 |
|---|---|---|
docker run -d --name 이름 -p 내포트:80 이미지 |
서버 실행 | 컨테이너가 백그라운드로 실행됨 |
-v "$(pwd)/폴더:/usr/share/nginx/html:ro" |
내 PC 파일 연결 | 내 폴더의 페이지를 서버가 보여 줌 |
docker ps |
실행 중인 서버 확인 | 실행 중인 컨테이너만 표시 |
docker ps -a |
종료된 서버까지 확인 | Exited 상태까지 표시 |
docker logs 이름 |
한 서버의 로그 확인 | 해당 컨테이너의 기록만 표시 |
docker exec 이름 명령 |
서버 안에서 명령 하나 실행 | 명령 실행 후 바로 돌아옴 |
docker stop 이름 |
서버 종료 | 컨테이너가 Exited 상태가 됨 |
docker rm 이름 |
컨테이너 삭제 | 목록에서도 사라짐 |
5.2 서버가 두 대일 때 구분
같은 nginx 이미지를 사용해 서버 두 대를 만들었다.
nginx:1.28
|
├─ web-three
| ├─ 내 PC 포트: 8082
| └─ 폴더: site-three
|
└─ web-four
├─ 내 PC 포트: 8083
└─ 폴더: site-four
두 서버가 공통으로 사용하는 것은 이미지였다.
nginx:1.28
서버마다 달랐던 것은 다음 세 가지였다.
- 컨테이너 이름
- 내 PC 포트
- 연결한 폴더
그래서 같은 이미지로 실행했어도 고객용과 직원용 화면을 서로 다르게 만들 수 있었다.
로그도 컨테이너별로 따로 남았다.
docker logs web-three
에는 8082번으로 접속한 요청이 남고,
docker logs web-four
에는 8083번으로 접속한 요청이 남았다.
여러 컨테이너 이름을 한 명령에 같이 적을 수도 있었다.
docker stop web-three web-four
5교시 한눈에
| 하려는 일 | 명령 · 옵션 |
|---|---|
| 서버 켜기 | docker run -d --name 이름 -p 내포트:80 -v "$(pwd)/폴더:/usr/share/nginx/html:ro" nginx:1.28 |
| 서버 여러 대 구분 | 이름 · 내 PC 포트 · 연결 폴더 |
| 한 서버의 로그 확인 | docker logs 이름 |
| 서버 안에서 명령 하나 실행 | docker exec 이름 명령 |
| 여러 서버 한 번에 종료 | docker stop 이름1 이름2 |
| 여러 서버 삭제 | docker rm 이름1 이름2 |
6교시 내 이미지 만들기 (Dockerfile)
오늘 들어온 일
A사 보안 담당이 보낸 메시지:
「안내 페이지 서버를 다른 PC에도 똑같이 넘기고 싶습니다. 5교시처럼 -v 로 폴더를 연결하면 폴더도 같이 보내야 하는데, 폴더 없이 이미지 하나만 보내도 서버가 똑같이 켜지게 할 수는 없나요?」
이번에는 웹 페이지 파일을 Docker 이미지 안에 직접 넣어서 내 이미지를 만들었다.
파일을 수정한 뒤에는 이미지를 다시 만들어야 변경 내용이 적용된다는 것도 확인했다.
왜 필요한가
-v 방식은 nginx 이미지뿐 아니라 연결할 폴더도 같이 있어야 했다.
다른 PC에서 똑같은 서버를 실행하려면 이미지와 폴더를 모두 전달해야 했다.
반대로 웹 페이지 파일을 이미지 안에 넣어 두면 이미지 하나만 있으면 같은 화면을 실행할 수 있었다.
이미지를 만드는 방법을 적는 파일이 Dockerfile이었다.
6.1 Dockerfile → build → image → run → container
전체 흐름은 다음과 같았다.
Dockerfile
|
├─ FROM nginx:1.28
└─ COPY site-three/index.html /usr/share/nginx/html/index.html
|
| docker build
v
이미지 my-nginx:1
|
| docker run
v
컨테이너
Dockerfile은 이미지를 만드는 방법을 적어 둔 텍스트 파일이다.
파일 이름은 정확히
Dockerfile
로 사용했다.
대문자 D로 시작하고 확장자는 없었다.
6.2 Dockerfile 두 줄의 뜻
| 명령 | 형식 | 하는 일 |
|---|---|---|
| FROM | FROM 이미지:태그 |
기존 이미지를 기반으로 새 이미지를 만듦 |
| COPY | COPY 내PC경로 이미지안경로 |
내 파일을 이미지 안에 복사 |
예를 들면 다음과 같았다.
FROM nginx:1.28
COPY site-three/index.html /usr/share/nginx/html/index.html
FROM nginx:1.28은 nginx 프로그램과 기본 파일을 새 이미지의 기반으로 사용했다.
COPY는 내 PC의 index.html을 nginx가 사용하는 위치로 복사했다.
nginx가 기본으로 보여 주는 페이지는 다음 위치에 있었다.
/usr/share/nginx/html/index.html
같은 위치에 내 파일을 복사하면 기본 nginx 화면 대신 내가 만든 페이지가 보였다.
COPY 앞쪽의 경로는 Dockerfile이 있는 폴더를 기준으로 했다.
6.3 이미지 만들기
Dockerfile을 만든 뒤 이미지로 빌드했다.
docker build -t my-nginx:1 .
각 부분의 뜻은 다음과 같았다.
| 부분 | 뜻 |
|---|---|
docker build |
Dockerfile을 읽어 이미지 생성 |
-t my-nginx:1 |
이미지에 이름과 태그 지정 |
. |
현재 폴더의 Dockerfile 사용 |
마지막의 .도 필요한 값이었다.
점을 빼면 Dockerfile을 찾을 위치가 지정되지 않아 오류가 발생했다.
만든 이미지는 다음 명령으로 확인했다.
docker images
새 이미지로 서버도 실행할 수 있었다.
docker run -d --name 이름 -p 포트:80 my-nginx:1
6.4 -v 방식과 이미지에 넣는 방식
두 방법에는 차이가 있었다.
-v 방식
내 PC
site-three/index.html
|
| 연결
v
컨테이너
내 PC의 파일을 컨테이너에서 계속 읽고 있기 때문에 파일을 수정하면 바로 반영됐다.
이미지에 COPY
내 PC 파일
|
| docker build 시 COPY
v
이미지
|
v
컨테이너
파일은 이미지를 만드는 순간 복사됐다.
이미지를 만든 뒤 내 PC의 파일을 수정해도 기존 이미지는 바뀌지 않았다.
| 구분 | -v 연결 |
이미지에 COPY |
|---|---|---|
| 서버를 넘길 때 | 이미지 + 폴더 필요 | 이미지 하나만 필요 |
| 파일 수정 | 새로 고침하면 반영 | 다시 build 해야 반영 |
| 잘 맞는 경우 | 자주 바뀌는 설정 · 페이지 | 내용이 자주 바뀌지 않는 서버 |
6교시 한눈에
| 하려는 일 | 명령 · 파일 |
|---|---|
| 이미지를 만드는 파일 | Dockerfile |
| 기존 이미지 지정 | FROM |
| 내 파일 넣기 | COPY |
| 이미지 만들기 | docker build -t 이름:태그 . |
| 이미지 확인 | docker images |
| 내 이미지로 서버 실행 | docker run -d --name 이름 -p 포트:80 이름:태그 |
| 파일 수정 후 반영 | 새 태그로 다시 build |
7교시 이미지 버전 다루기 · 되돌리기 · 정리 · 올리기
오늘 들어온 일
A사 보안 담당이 보낸 메시지:
「안내 문구를 바꿨는데 서버에 반영이 안 됩니다. 반영해 주세요. 그리고 새 버전에 문제가 있으면 이전 버전으로 바로 돌아갈 수 있어야 하고, 쓰지 않는 이미지는 정리해 주세요.」
파일을 수정한 뒤 새 이미지로 반영하고, 문제가 생긴 상황을 가정해 이전 버전으로 되돌리는 방법을 확인했다.
사용하지 않는 이미지도 정리하고 마지막에는 GitHub에 올렸다.
왜 필요한가
Docker 이미지는 이미지를 만들 당시의 파일을 그대로 가지고 있다.
따라서 원본 파일을 수정한다고 이미 만들어진 이미지가 자동으로 바뀌지는 않았다.
수정 내용을 반영하려면 다시 빌드해야 했다.
이미지에 :1, :2처럼 버전을 나타내는 태그를 붙여 두면 새로운 버전에서 문제가 생겼을 때 이전 이미지로 다시 실행할 수 있었다.
사용하지 않는 이미지는 계속 디스크 공간을 사용하기 때문에 필요 없는 이미지는 삭제했다.
새 버전 만들기
파일을 수정한 뒤 새로운 태그를 붙여 이미지를 다시 만들었다.
예:
docker build -t my-nginx:2 .
기존 서버를 삭제하고 새 이미지로 다시 실행했다.
docker rm -f 이름
docker run -d --name 이름 -p 포트:80 my-nginx:2
이렇게 해야 수정한 파일이 실제 서버에 반영됐다.
이전 버전으로 되돌리기
새 이미지에 문제가 생겼다면 현재 컨테이너를 지우고 이전 태그의 이미지로 다시 실행했다.
docker rm -f 이름
docker run -d --name 이름 -p 포트:80 my-nginx:1
이미지 버전을 따로 남겨 두면 이전 상태로 빠르게 되돌릴 수 있었다.
이미지 정리하기
현재 이미지는 다음 명령으로 확인했다.
docker images
사용하지 않는 이미지는 다음 명령으로 삭제했다.
docker rmi 이름:태그
컨테이너와 이미지를 삭제하는 명령은 서로 달랐다.
docker rm → 컨테이너 삭제
docker rmi → 이미지 삭제
rmi의 i를 image의 i로 기억하면 구분하기 쉬웠다.
현재 컨테이너가 사용하는 이미지는 바로 삭제할 수 없었다.
이 경우 먼저 컨테이너를 삭제해야 했다.
docker rm -f 이름
그다음 이미지를 지웠다.
docker rmi 이름:태그
GitHub에 올리기
마지막으로 오늘 만든 파일을 확인했다.
git status
변경한 파일을 추가했다.
git add .
커밋했다.
git commit -m "..."
원격 저장소에 올렸다.
git push
7교시 한눈에
| 하려는 일 | 명령 · 방법 |
|---|---|
| 파일 수정 후 반영 | 새 태그로 다시 build → 컨테이너 교체 |
| 이전 버전으로 되돌리기 | 현재 컨테이너 삭제 → 이전 태그 이미지로 실행 |
| 이미지 목록 확인 | docker images |
| 컨테이너 삭제 | docker rm |
| 이미지 삭제 | docker rmi 이름:태그 |
| 사용 중인 이미지 삭제가 안 될 때 | 컨테이너부터 삭제 |
| GitHub에 올리기 | git status → git add . → git commit → git push |
오늘은 좀 덥네요,,, 강의실이 창문도 없고 오직 벽뿐인데 컴퓨터가 많아서 더운가봐요,,,
겨울에는 따뜻하겠다.. 겨울을 기대해 봐야겠어요..
그럼 아됴
'공부 > SKT ALEPH' 카테고리의 다른 글
| 네트워크·ZT(Zero Trust) 운영 기초 - 6 (0) | 2026.10.19 |
|---|---|
| 네트워크·ZT(Zero Trust) 운영 기초 - 5 (0) | 2026.10.16 |
| 네트워크·ZT(Zero Trust) 운영 기초 - 4 (0) | 2026.10.15 |
| 네트워크·ZT(Zero Trust) 운영 기초 - 3 (0) | 2026.10.14 |
| 네트워크·ZT(Zero Trust) 운영 기초 - 2 (0) | 2026.10.13 |


