맥북으로는 gui리눅스를 쓰기가 굉장히 불편하다,, 속도가 너무 느려서 안쓰는게.,
그리고 또 보안 실무에서는 리눅스를 CLI로 많이 쓴다고 해서,, CLI에 익숙해질 겸, 도커에도 익숙해질 겸
도커에서 리눅스를 사용해야겠다ㅏㅏ
Docker
- 컨테이너 기반 가상화 플랫폼으로, 응용 프로그램과 그 종속성을 격리된 환경인 컨테이너로 패키징하여 실행하는 기술
컨테이너?
- 가상화 기술을 이용하여 애플리케이션과 개발 환경을 격리된 공간에서 실행하는 단위
-> 내 로컬pc안에 격리된 리눅스 실행 공간을 만드는 도구
맥북 macOS
└─ Docker
└─ Ubuntu 컨테이너
└─ Flask / Python / Vim / 웹서버 실행
요런식으로 사용되는 것
- 이미지 : 컨테이너를 만들기 위한 설계도
- 컨테이너 : 실제 실행되는 리눅스 공간
- Docker run
- Docker compose
Docker run
docker run -it --name web_1 -p 31337:31337 ubuntu22.04 bash
-> 새 컨테이너 만들고 실행하는데 터미널로 직접 조작 가능하게 실행하고 컨터이너 이름은 web_1로 하고
맥북 31337 포트, 컨테이너 31337포트 연결ㄱㄱ 하고 ubuntu22.04 이미지 사용하고, 컨테이너 안에서 bash로 실행
Docker compose
앞에서 본 docker run 같은 경우에는 실행할 때 옵션을 길게 직접 작성해야하는 방식으로,,
예를들면
docker run -it --name web_1 \
-p 31337:31337 \
-p 31338:31338 \
-v /Users/w00n1/web_1/flask-app:/home/flask-app \
ubuntu: 22.04 bash
이런식으로 매번 쳐야하는데,,
이런 실행 설정들을
compose.yaml 파일에 저장해두는 방식
정리해보면
docker run -> 명령어로 직접 실행
docker compose -> compose.yaml 설정 파일 보고 실행 (약간 저장용 도면 느낌 ㅋ)
그럼, docker compose를 하려면 어떤 파일들이 필요하고, 어떻게 사용해야 할까,,?
먼저, 내 로컬 폴더 경로가
/Users/w00n1/web_docker/flask-app
그러면, Docker compose 구조는
/Users/w00n1/web_docker/flask-app
|- compose.yaml
|- Dockerfile
|- requirements.txt
|- app.py
|- login.py
|_ templates
|- form_login.html
|- form_text.html
...
이런식으로 가져가면 된다.
여기서,,
compose.yaml -> 컨테이너 실행 설정
service:
flask-study:
build: .
container_name: web_study
ports:
- "31337:31337"
- "31338:31338"
- "31339:31339"
- "8000:8000"
volumes:
- .:/home/flask-app
working_dir: /home/flask-app
stdin_open:true
tty: true
command: bash
이런식으로 작성
Dockerfile -> 이미지를 어떻게 만들지 적는 파일
-> 컨테이너 안에 기본으로 설치할 것들을 적어둠
FROM ubuntu:22.04
RUN apt update && apt install -y \
python3 \
python3-pip \
vim \
curl \
wget \
git \
net-tools \
iputils-ping
COPY requirements.txt /tmp/requirements.txt
RUN python3 -m pip install -r /tmp/requirements.txt
WORKDIR /home/flask-app
CMD ["bash"]
- ubuntu 22.04를 기반으로 하고
- python3, pip, vim, curl, git 등을 설치하고
- requirements.txt에 적힌 파이썬 라이브러리를 설치하고
- 기본 작업 폴더는 /home/falsk-app으로 하고
- bash를 실행해라
requirements.txt -> 파이썬 pip 패키지 목록
예를들면
Flask
requests
이런식으로 작성해두면,
위 Dockerfile의 RUN python3 -m pip install -r /tmp/requirements.txt
이 명령으로 Flask, requests를 자동 설치함
작성한 파일들은 어떻게,,?
- 컨테이너 안에만 파일을 만들어서 작업하면, 컨테이너를 삭제할 때 파일도 같이 사라질 수 있음
--> 그래서 나온 개념이 volume, 폴더연결!
예를들어서
-v /Users/w00n1/web_docker/flask-app:/home/flask-app
맥북의 /Users/w00n1/web_docker/flask-app 과
컨테이너의 /home/flask-app
을 연결한다는 뜻
이후에 docker compose를 이용해서 컨테이너를 생성할 수 있는데
one-off container(일회성 컨테이너)
service container
요런느낌 2가지로 사용할 수 있다
먼저, one-off container 를 보면
이렇게 compose에 필요한 파일들을 다 작성한 후
docker compose run --build --service-ports web_study
-> web_study 설정을 참고해서 일회성 컨테이너를 하나 만들어서 bash로 들어간다
일회성 컨테이너 같은 경우에는 컨테이너 이름도
flask-app-web_study-run-f59a18de78c5 이런식으로 생김
특징
- 코드 파일 수정 -> 로컬 폴더에 저장됨
- 컨테이너 안에서 직접 설치한 패키지 -> 유지 X
- 컨테이너가 계속 쌓일 수 있음
docker compose run 을 할때마다 새 일회성 컨테이너가 만들어진다고 보면 됨
그래서 보통
- 잠깐 명령어 실행
- 짧은 테스트
- 일회성 작업
-컨테이너 상태가 중요하지 않을 때
사용함
사용한 컨테이너를 삭제하고 싶을 땐,,
docker rm flask-app-web_study-run-f59a18de78c5
또는
docker rm ad552b4db0d6 -> 컨테이너 id로
만약에, 중지된 임시 컨테이너 싹 정리하고싶으면
docker container prune
반대로, service container를 보면
docker compose up -d --build
compose.yaml에 적힌 web_study 서비스를 고정 컨테이너로 만들어서 백그라운드에 계속 켜둔다
위 명령어로 실행을 한다
보통 service container를 사용할 때 yaml은
services:
web_study:
build: .
container_name: web_study
ports:
- "31337:31337"
- "31338:31338"
- "31339:31339"
- "8000:8000"
volumes:
- .:/home/flask-app
workin_dir: /home/flask-app
stdin_open: true
tty: true
command: sleep infinity
이렇게 작성하는데,
다른점은 command: sleep infinity 부분 -> 컨테어너가 바로 꺼지지 않고 계속 살아있게 하는 명령
사용 명령어
docker compose up -d --build --> 컨테이너 빌드
docker compose start -> 컨테이너 시작
docker exec -it web_study bash -> web_study이름의 컨테이너에 들어가기
exit -> 컨테이너에서 나오기
docker compose stop -> 컨테이너 끄기
정리하면,
일회성 컨테이너(one-off container)는 필요할 때마다 compose.yaml 설계도 보고 새 컨테이너 하나씩 찍어내는 것,,
서비스 컨테이너(service container)는 compose.yaml 설계도대로 컨테이너를 하나 만들어두고 그걸 계속 stop/start 하면서 쓰는 것
'web2' 카테고리의 다른 글
| Server-Side Request Forgery (SSRF) (0) | 2026.06.28 |
|---|---|
| CSRF(Cross-Site Request Forgery) (0) | 2026.06.04 |
| DOM-based XSS (0) | 2026.06.02 |
| 웹은 어떻게 동작하나요(HTML,JS,CSS,브라우저의 관계) (0) | 2026.05.31 |
| XSS (cross-site scripting) (0) | 2026.05.30 |