web2

docker 사용하기 (run, compose)

maru_ 2026. 6. 17. 14:02

맥북으로는 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