🧩 경로를 지정할 땐 절대경로를 정확히 확인하고, bash는 슬래시(/), powershell은 백슬래시임(\)을 기억
확인
실습 2 - Nginx
Nginx 실행 확인
docker run -d -p 8000:80 nginx
Nginx의 index.html 위치 확인
docker exec -it 7ec6 bash
→ index.html은 /usr/share/nginx/html 폴더에 위치함
c:/workspace/docker_lab/ex01 로 마운트
docker run -d -p 8000:80 -v c:/workspace/docker_lab/ex01:/usr/share/nginx/html nginx
Copy
💡
마운트 보다 Copy 가 더 편하다
✅ Copy란?
Dockerfile에서 호스트 시스템의 파일이나 디렉토리를 도커 이미지에 복사하는 명령어
✅ 특징 요약
항목
설명
사용 위치
Dockerfile 내부
복사 대상
현재 Dockerfile 기준의 build context 내 파일만 가능
경로 끝 슬래시 /
생략해도 되고, 붙이면 "디렉토리로 복사" 의미가 더 명확함
비교 vs ADD
COPY는 복사만, ADD는 복사 + 압축 해제 기능 있음
🧠 참고
Dockerfile과 같은 디렉토리에서 빌드할 때만 복사 가능
외부 경로(ex. ../)는 사용할 수 없다
실습 3 - apache
html 폴더 생성 후 index.html 파일 추가
<h1>ex03 test</h1>
Dockerfile 생성
스크립트 작성해서 실행시킬 수 있음
내가 원하는 이미지를 만들어내는 스크립트
내 애플리케이션을 실행하기 위한 환경을 어떻게 만들지?를 정의한 설계도
프로비저닝 - 완성품을 만들기 위한 준비과정 (서버가 만들어질 때 도커 파일을 읽어서 실행 후 만들어짐)
이전에 작성한 Dockerfile
# 기반 이미지 설정# eclipse-temurin은 OpenJDK 공식 이미지 중 하나# 21-jdk는 Java 21 버전의 JDK 환경FROM eclipse-temurin:21-jdk
# 작업 디렉토리 설정# 이후 모든 명령은 /app 디렉토리 안에서 실행됨# COPY, CMD, RUN 등 경로 기준이 /app이 됨WORKDIR /app# 호스트의 JAR 파일 복사# 현재 빌드 컨텍스트에서 build/libs/ 폴더에 있는 JAR 파일을 app.jar 이름으로 컨테이너에 복사COPY build/libs/*.jar app.jar# 환경 변수 선언# 추후 Java 실행 시 옵션을 커스터마이징할 수 있도록 환경변수 JAVA_OPTS 설정# 예: -Xmx512m 같은 JVM 옵션을 런타임에 주입 가능ENV JAVA_OPTS=""# 컨테이너 시작 시 실행할 명령어 설정# 쉘에서 명령 실행: java $JAVA_OPTS -jar app.j# 실제 실행 -> java -jar app.jar ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]
✅ 요약
명령어
설명
FROM
Java 21 JDK가 설치된 베이스 이미지 사용
WORKDIR /app
작업 디렉토리를 /app으로 설정
COPY
빌드된 .jar 파일을 이미지에 복사
ENV
JVM 옵션을 환경변수로 설정 (필요 시 확장 가능)
ENTRYPOINT
컨테이너 실행 시 Spring Boot 앱을 시작
JAR 파일 기반의 자바 서버 애플리케이션을 도커 이미지로 만들어 실행
실행 흐름:
Java 21 환경에서
JAR 파일 복사하고
java -jar 명령으로 실행
FROM httpd
COPY ./htdocs /usr/local/apache2/htdocs
CMD ["httpd-foreground"]
🧱 Dockerfile 핵심 구조
# 1. 베이스 이미지 설정FROM node:18-alpine
# 2. 작업 디렉토리 설정WORKDIR /app# 3. 필요한 파일 복사COPY package*.json ./RUN npm install# 4. 소스 코드 복사COPY . .# 5. 앱 실행 포트 지정 (옵션)EXPOSE3000# 6. 컨테이너 시작 시 실행될 명령어CMD ["npm", "start"]
🔍 각 명령어 설명
명령어
의미
FROM
어떤 이미지를 기반으로 만들 것인지 (ex: ubuntu, node, nginx 등)
WORKDIR
이후 명령어들이 실행될 작업 디렉토리 설정
COPY
호스트(내 컴퓨터) → 이미지로 파일 복사
RUN
이미지 빌드 과정에서 실행할 명령어 (예: RUN npm install)
EXPOSE
컨테이너가 사용하는 포트를 문서화 (실제 포트 개방 아님)
CMD
컨테이너가 실행될 때 자동으로 실행할 명령어
📦 사용 흐름
Dockerfile 작성
docker build -t my-app .
→ Dockerfile 기반으로 이미지 생성
docker run -p 8080:3000 my-app
→ 이미지로 컨테이너 실행
→ 기존 순수한 이미지에 docker build 명령어를 통해 이미지를 구워내면서 실행됨
Docker image build
docker build -t webserver .
→ -t webserver: 생성될 이미지에 태그(tag) 로 webserver라는 이름을 붙임
→ include /etc/nginx/conf.d/*.conf; : etc/nginx/conf.d/ 경로에 있는 모든 .conf 파일을 읽는다 / 개별 서버 설정들을 불러오는 구조
→ default.conf 같은 파일을 conf.d 폴더에 넣으면 자동으로 포함 됨
default.conf
NGINX에서 기본으로 제공하거나, 사용자가 정의하는 서버 블록(server block) 설정 파일
보통 도메인이나 포트에 따라 요청을 처리하는 규칙을 여기에 정의
위치: /etc/nginx/conf.d/default.conf
server {
listen 80;
listen [::]:80;
server_name localhost; // -> 기본 도메인 이름 설정 (보통 개발 환경에서 사용)
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html; // -> 웹서버가 요청에 응답할 때 기준이 되는 디렉토리 (여기서는 html 파일들이 있는 경로)
index index.html index.htm; // -> 루트 경로(/) 요청 시 우선적으로 찾을 기본 파일 리스트. 첫 번째로 index.html을 찾고 없으면 index.htm
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500502503504 /50x.html; // -> 에러 발생 시 보여줄 HTML 파일 지정
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}