[Docker] 3. 도커 파일

김주희's avatar
Jul 30, 2025
[Docker] 3. 도커 파일

1. Bind Mount

개념

notion image
Bind Mount
  • 호스트 컴퓨터가 존재 (윈도우 + 리눅스 하위 시스템)
  • 호스트 컴퓨터 아래에 컨테이너를 하나 띄움
  • 컨테이너는 리눅스 기반 파일시스템이므로 /(루트)에서 시작
  • nginx가 설치되면 아파치의 webapps처럼 웹 서버 폴더가 존재
    • 웹서버는 특정 폴더를 외부에 공개하는데 그럼 nginx의 폴더는 어디지?
  • 호스트 컴퓨터인 윈도우의 C:\hello 폴더 안에 index.html가 있고, 이 C:\hello 폴더를 /var/nginx 경로로 마운트
    • 컨테이너 입장에서 /var/nginx 디렉토리 아래C:\hello 폴더의 내용이 그대로 보임
 
호스트와 컨테이너가 같은 파일/디렉토리를 공유한다.
 
notion image
  • 다른 호스트 시스템에 있는 파일이 내 컨테이너에도 필요한 상황
    • 복사 (copy)
      • → ctrl + c, ctrl + v
      • 내 호스트 시스템에도 존재, 다른 호스트 시스템에도 존재
    • 소프트 링크 (심볼릭 링크)
      • 바로 가기
      • 실제 복사된 것 X, 외부를 참조
      • 내 호스트 시스템에 존재하는 파일 클릭 시 외부 호스트 시스템의 파일을 찾아냄
    • mount
      • 외부 host 시스템에 있는 폴더 통째로 올림 (호스트의 폴더를 컨테이너에 연결)
      • 따라서 mount된 4번째 섹터를 보면 내게 아닌 외부 호스트 시스템에 있는 것을 바라봄
      •  
      왜 마운트를 사용하는 걸까?
    • 컨테이너는 종료되면 상태를 잃지만 외부 호스트 시스템에 있는 것은 유지되므로
 

Bind Mount

바인드 마운트(호스트 시스템에 있는 것을 컨테이너로 bind)
 

실습 - Apache 웹서버의 index.html 교체하기

1. 이미지 실행

docker run -dit -p 8080:80 httpd
httpd 이미지를 기반으로 Apache 웹 서버 컨테이너를 백그라운드에서 실행
 
  • docker run : 새 컨테이너 생성 및 실행
  • -d : 백그라운드에서 실행
  • -p 8080:80 : 호스트의 포트 8080을 컨테이너의 포트 80에 연결 (포트 포워딩)
  • httpd : 사용할 이미지 이름 (여기서는 Apache HTTP Server)
 
notion image
 
식별자 요청도 아니고 특정 파일 요청을 하지도 않았기 때문에 index.html이 열린다.
notion image
 

2. 웹 서버 폴더 찾기

목적인 웹 서버의 index.html을 변경하기 위해서는 원래 apache의 기본 웹 서버 폴더 위치를 알아야 한다.
→ 직접 찾아봐도 되지만 GPT한테 요청 OR 도커 허브 문서 찾아보기
To.GPT : httpd가 리눅스 환경에 설치되면, 웹 서버 폴더 위치가 어디야?
 
아파치 서버의 웹서버 폴더 위치 = /usr/local/apache2/htdocs
notion image
 

3. 교체할 파일 생성

C:\workspace\docker-lab\ex01 디렉토리(경로는 자유) 안에 index.html 파일을 생성하고 내용을 작성한다. (이때 저장은 필수!)
notion image
 

4. 바인드 마운트

docker run -d -p 8000:80 -v c:\workspace\docker-lab\ex01:/usr/local/apache2/htdocs httpd
  • 아파치 웹 서버를 백그라운드로 실행
  • 호스트 컴퓨터에서 8000 포트로 컨테이너의 80 포트에 연결
  • 호스트 디렉토리(c:\workspace\docker-lab\ex01)를 컨테이너 내부(/usr/local/apache2/htdocs)에 바인드 마운트
 

+ powershell과 git bash의 경로 인식 차이

위의 명령어는 powershell에서 실행하는 경우 가능하다. git bash로 할 경우 경로 인식이 안되므로 아래와 같이 오류가 발생한다.
notion image
 
따라서 git bash로 터미널을 열었을 경우 경로를 쌍따옴표로 감싸거나 \이 아닌 /으로 실행한다.
docker run -d -p 8000:80 -v "c:/workspace/docker-lab/ex01:/usr/local/apache2/htdocs" httpd
 

5. 실행 결과

실행 중인 컨테이너 내부에서 내가 원하는 명령어를 새로 실행하기 위해 exec로 실행해서 컨테이너의 웹 서버 폴더를 확인해 본다.
docker exec -it dc66 bash
 
index.html을 cat 명령어를 통해 확인해보면 기존의 내용이 아닌 내가 새로 생성한 내용이 바운트 마운드 되어 보이는 것을 확인할 수 있다.
notion image
 
호스트 컴퓨터 상에서 localhost:8000을 실행해보면 기존의 index.html 파일이 아닌 내가 생성한 내용이 브라우저 상에 보이는 것을 확인할 수 있다.
notion image
 

6. 전체 코드

docker run -dit -p 8080:80 httpd docker exec -it 9b80 bash 바인드 마운트 (호스트 시스템 -> 컨테이너로 bind) docker run -d -p 8000:80 -v c:\workspace\docker-lab\ex01:/usr/local/apache2/htdocs httpd
 

실습 - nginx 서버 가동 후 index 파일 교체하기

1. 도커 허브에서 기본 이미지 찾기

도커 허브에서 official images를 찾아서 문서를 읽어보면 웹서버 폴더의 위치를 알 수 있다.
notion image
 

2. nginx 실행해보기

문서에서 찾은 웹서버 폴더 경로가 맞는지 확인해보자
docker run -dit -p 8080:80 nginx docker exec -it 5a09 bash
notion image
 
호스트 컴퓨터에서 localhost:8080으로 접속하면 컨테이너 내부의 80 포트로 연결되었고 웹서버 폴더의 index.html 파일이 보이게 된다.
notion image

3. 바인드 마운트

호스트 디렉토리(c:\workspace\docker-lab\ex01)를 컨테이너 내부(/usr/share/nginx/html)에 바인드 마운트
docker run -d -p 8080:80 -v "c:/workspace/docker-lab/ex01:/usr/share/nginx/html" nginx
 

4. 실행 결과

내가 생성한 index.html 파일로 변경된 것을 확인할 수 있다.
docker exec -it 2983 bash
notion image
notion image
 

2. 도커 파일

스크립트를 작성해서 파일을 실행하면 된다.
 
도커 파일 = 내가 원하는 이미지를 만들어내는 스크립트
 
순수한 이미지를 가지고 도커 파일에서 작성한 뒤 이미지를 구워서 실행하면 됨
 
프로비저닝 = 완성품을 만들기 위해 준비하는 과정
 
docker build = 도커 파일을 실행시키면서 굽는것?
순수한 애 만들고 cd 로 들어가서 작업 해서 이미지 구웠는데 이제는 그냥 파일로
 
 
notion image
notion image
 
docker build -t 생성할이미지이름 .
  • build :
  • -t :
  • 생성할 이미지 이름 :
  • . : 현재 디렉토리에 있는 Dockerfile을 기준으로 이미지를 빌드
 
notion image
notion image
docker run -d -p 8080:80 nginx
notion image

실습 : conf 파일 수정(포트 80→ 5000) & index.html 파일 수정

nginx 실행
notion image
 
기존의 default.conf 파일을 수정해서 5000번 포트로 포트포워딩해보자
 
아래는 기존의 /etc/nginx/conf.d/default.conf 파일의 내용이다.
notion image
 
호스트 컴퓨터에서 덮어쓰기 할 conf.d/default.conf 파일과 html/index.html 파일을 생성한다.
notion image
 
80 포트에서 5000번 포트로 변경한 default.conf 파일
notion image
 
기존의 index.html 파일은 다음과 같지만
notion image
아래와 같이 만들어서 덮어쓰기 할 예정이다.
notion image
 
도커 파일에 다음과 같이 스크립트를 작성한다. 두 가지 파일을 다 덮어쓸거니까 두 번 COPY 해야 한다.
notion image
 
현재 디렉토리에 있는 도커 파일을 기준으로 nginxserver라는 이름의 이미지를 생성한다.
docker build -t nginxserver .
 
notion image
 
docker run -d -p 8080:5000 nginxserver
notion image
 
notion image
notion image
 
notion image
notion image
 
 

3. 도커 파일 키워드

🧱 기본 구조 키워드

키워드
설명
FROM
베이스 이미지 지정 (ex: FROM ubuntu, FROM node:18-alpine)
LABEL
이미지에 메타데이터 추가 (작성자, 버전 등)
ARG
빌드 타임 변수 선언 (예: ARG VERSION=1.0)
ENV
환경 변수 설정 (예: ENV PORT=3000)

📂 파일 복사 및 작업 디렉토리 설정

키워드
설명
COPY
호스트 → 이미지로 파일 복사 (예: COPY ./app /app)
ADD
COPY와 비슷하지만, 압축 해제 기능, URL 다운로드 가능
WORKDIR
이후 명령어가 실행될 작업 디렉토리 설정 (ex: WORKDIR /app)

🛠️ 명령 실행

키워드
설명
RUN
이미지 빌드 시 명령 실행 (패키지 설치 등) (ex: RUN apt-get install)
CMD
컨테이너 실행 시 기본 명령어 (ex: CMD ["node", "app.js"])
ENTRYPOINT
컨테이너 실행 시 고정된 명령어 설정 (ex: ENTRYPOINT ["python3"])
  • CMDENTRYPOINT는 같이 쓰이면: ENTRYPOINT + CMD의 조합으로 실행됨.

🔥 네트워크 및 포트

키워드
설명
EXPOSE
컨테이너가 사용할 포트 정의 (ex: EXPOSE 80) – 실제 포트를 여는 건 아님, 문서적 의미

🧽 캐시 최적화 및 정리

키워드
설명
SHELL
RUN 명령어가 실행될 쉘 지정 (윈도우 이미지에서 주로 사용)
USER
명령어를 실행할 사용자 지정 (ex: USER node)
VOLUME
볼륨 마운트 지점 설정 (ex: VOLUME /data)

✅ 예시

FROM node:18-alpine WORKDIR /app COPY . . RUN npm install EXPOSE 3000 CMD ["npm", "start"]
 
키워드별 예제 및 사용 순서에 따른 템플릿 예시
 
Share article

jay0628