![[Docker] 3. 도커 파일](https://image.inblog.dev?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog%3Ftitle%3D%255BDocker%255D%25203.%2520%25EB%258F%2584%25EC%25BB%25A4%2520%25ED%258C%258C%25EC%259D%25BC%26logoUrl%3Dhttps%253A%252F%252Finblog.ai%252Finblog_logo.png%26blogTitle%3Djay0628&w=2048&q=75)
1. Bind Mount
개념

Bind Mount
- 호스트 컴퓨터가 존재 (윈도우 + 리눅스 하위 시스템)
- 호스트 컴퓨터 아래에 컨테이너를 하나 띄움
- 컨테이너는 리눅스 기반 파일시스템이므로 /(루트)에서 시작
- nginx가 설치되면 아파치의 webapps처럼 웹 서버 폴더가 존재
⇒ 웹서버는 특정 폴더를 외부에 공개하는데 그럼 nginx의 폴더는 어디지?
- 호스트 컴퓨터인 윈도우의 C:\hello 폴더 안에 index.html가 있고, 이 C:\hello 폴더를 /var/nginx 경로로 마운트
⇒ 컨테이너 입장에서 /var/nginx 디렉토리 아래에 C:\hello 폴더의 내용이 그대로 보임
호스트와 컨테이너가 같은 파일/디렉토리를 공유한다.

- 다른 호스트 시스템에 있는 파일이 내 컨테이너에도 필요한 상황
- 복사 (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)

식별자 요청도 아니고 특정 파일 요청을 하지도 않았기 때문에 index.html이 열린다.

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

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

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로 할 경우 경로 인식이 안되므로 아래와 같이 오류가 발생한다.

따라서 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 명령어를 통해 확인해보면 기존의 내용이 아닌 내가 새로 생성한 내용이 바운트 마운드 되어 보이는 것을 확인할 수 있다.

호스트 컴퓨터 상에서 localhost:8000을 실행해보면 기존의 index.html 파일이 아닌 내가 생성한 내용이 브라우저 상에 보이는 것을 확인할 수 있다.

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를 찾아서 문서를 읽어보면 웹서버 폴더의 위치를 알 수 있다.

2. nginx 실행해보기
문서에서 찾은 웹서버 폴더 경로가 맞는지 확인해보자
docker run -dit -p 8080:80 nginx docker exec -it 5a09 bash

호스트 컴퓨터에서 localhost:8080으로 접속하면 컨테이너 내부의 80 포트로 연결되었고 웹서버 폴더의 index.html 파일이 보이게 된다.

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


2. 도커 파일
스크립트를 작성해서 파일을 실행하면 된다.
도커 파일 = 내가 원하는 이미지를 만들어내는 스크립트
순수한 이미지를 가지고 도커 파일에서 작성한 뒤 이미지를 구워서 실행하면 됨
프로비저닝 = 완성품을 만들기 위해 준비하는 과정
docker build = 도커 파일을 실행시키면서 굽는것?
순수한 애 만들고 cd 로 들어가서 작업 해서 이미지 구웠는데 이제는 그냥 파일로


docker build -t 생성할이미지이름 .
- build :
- -t :
- 생성할 이미지 이름 :
- . : 현재 디렉토리에 있는 Dockerfile을 기준으로 이미지를 빌드


docker run -d -p 8080:80 nginx

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

기존의 default.conf 파일을 수정해서 5000번 포트로 포트포워딩해보자
아래는 기존의 /etc/nginx/conf.d/default.conf 파일의 내용이다.

호스트 컴퓨터에서 덮어쓰기 할 conf.d/default.conf 파일과 html/index.html 파일을 생성한다.

80 포트에서 5000번 포트로 변경한 default.conf 파일

기존의 index.html 파일은 다음과 같지만

아래와 같이 만들어서 덮어쓰기 할 예정이다.

도커 파일에 다음과 같이 스크립트를 작성한다. 두 가지 파일을 다 덮어쓸거니까 두 번 COPY 해야 한다.

현재 디렉토리에 있는 도커 파일을 기준으로 nginxserver라는 이름의 이미지를 생성한다.
docker build -t nginxserver .

docker run -d -p 8080:5000 nginxserver





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"] ) |
CMD
와ENTRYPOINT
는 같이 쓰이면: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