Notice
Recent Posts
Recent Comments
Link
«   2025/12   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

백엔드 개발자 블로그

9. Dockerfile 본문

CI CD/Docker

9. Dockerfile

backend-dev 2025. 12. 24. 00:37

1. Dockerfile 명령어

Dockerfile 이란?

Docker Image 개발에 필요한 명령을 포함한 텍스트 파일

 

필요한 이유 

탄력성, 확장성, 재사용성을 부여하게 되어 동일한 환경을 보유한 서버를 운영, 관리를 쉽게 해준다.

 

Dockerfile 명령어

FROM

필수

생성하려는 이미지의 베이스 이미지 지정

 

MAINTAINER

선택

이미지를 빌드한 작성자 이름과 이메일을 작

 

LABEL

선택

이미지의 작성 목적, 버전, 타이틀, 설명, 라이선스

 

RUN

패키지 업데이트, 패키지 설치, 명령 실행

잔여물 제거, RUN 여러번 쓰지말고 &&이나 \ 써서 한번만 사용하자

 

CMD

생성된 이미지를 컨테이너로 실행할 때 실행되는 명령

ENTRYPOINT 명령문으로 지정된 커맨드에 디폴트로 넘길 파라미터를 지정할 때 사용

여러개의 CMD를 작성해도 마지막 하나만 처리됨

 

ENTRYPOINT

CMD와 똑같이 생성된 이미지를 컨테이너로 실행할 때 실행되는 명령

다른점은 컨테이너가 실행될 때 명령어 및 인자 값을 전달하여 실행한다.

여러개 실행가능

 

COPY

호스트 환경의 파일, 디렉토리를 이미지 안에 복사

ADD 보다는 에러율이 적음

 

ADD

호스트 환경의 파일, 디렉토리를 이미지 안에 복사 + URL 주소에서 다운로드하여 추가 + 압축 파일 지정한 경로에 압축을 풀어서 추가

 

ENV

환경변수 지정

환경변수 지정하면 linux처럼 $환경변수 로 바로 사용 가능

 

EXPOSE

리스닝 포트와 프로토콜을 지정 = 방화벽 열기

docker run 사용 시 -p 옵션을 통해 사용됨

 

VOLUME

VOLUME 마운트

 

USER

사용자 권한

 

WORKDIR

컨테이너 상에서 작업할 경로 전환

RUN, CMD, ENTRYPOINT, COPY, ADD 명령문은 해당 경로를 기준으로 실행

 

ARG

docker build 시점에서 변수 값을 전달하여 인자값이 노출되지 않도록 함


2. Dockerfile 최적화

  1. 불필요한 바이너리를 모두 제거하여 이미지 크기 경량화
    • autoremove, clean 등으로 패키지 설치를 위한 파일들을 제거 
    • 불필요한 패키지 종속성 설치 방지 (apt install -y --no-install-recommends <패키지명>
    • dockerignore 사용으로 빌드와 관련없는 파일을 이미지 내부에 넣지 않는다.
  2. Docker에서 제공하는 최소 기본 이미지인 alpine Linux 또는, scratch를 사용한다.
  3. multi-stage build를 사용하여 최종 이미지 크기를 최소화한다.
    • FROM 명령어가 2개 이상 사용되어 분리된 작업 공간을 제공
    • 첫 번째 stage(빌드도구)에서 생성된 실행파일 등을 두 번째 stage(배포이미지)에 제공, 마지막에 실행된 stage 작업이 Docker image로 최종 생성되어 이미지 크기가 감소
  4. Layer 수를 최소화한다.
    • FROM, RUN, COPY, ADD, ENV, LABEL은 layer를 생성하는 명령어이다. 다른 명령어는 build 과정에서 임시로 이미지를 생성하고 삭제된다.
    • RUN 사용 시 가능하면 명령을 그룹화하여 사용한다.
  5. 하나의 컨테이너에 하나의 애플리케이션을 설정
    • 독립성, 버전관리, 소스코드 모듈화 장점 제공
    • Frontend-backend-DB 분리해서 관리하는 것을 권장
  6. 캐시 사용
    • Dockerfile을 통해 이미지를 빌드하면 자동으로 명령어 단위로 캐싱한다.
    • 캐싱 효과를 높이기 위해 명령어의 위치를 명확히 하자.
    • 위쪽은 설치, 아래쪽은 배치하면 기존 캐시를 부정할 가능성이 줄어든다.
  7. 보안강화
    1. root 사용자 금지
      1. 디폴트가 root 사용자이다. 조심하자
    2. 이미지 서명
      • Docker Signer
      • Notary
      • DCT
    3. 인증된 이미지만 사용하기

3. Dockerfile build

명령어

docker build -t IMAGE_NAME:TAG [-f DOCKERFILE_NAME] DOCKERFILE_LOCATION

 

# 이름이 Dockerfile 그대로인 경우

$ vi Dockerfile
$ docker build -t [이미지명]:버전 .

 

# 이름이 Dockerfile 그대로가 아닌 경우

$ vi conf/dockerfile2
$ docker build -t [이미지명]:[버전] –f conf/dockerfile2 .

 

dockerfile 빌드 과정

Dockerfile 빌드 > image 생성 > image run > Docker container 생성 (Image layer x n + Container Layer)

 

설치파일 제거 + alpine을 통한 이미지 경량화

220MB > 205MB > 13MB 

ubuntu에 고집할 필요가 없다면 고려해보자

 

scratch을 통한 이미지 경량화

73MB > 900KB

정적 파일 실행만 한다면 고려해보자

 

multi-stage build를 통한 이미지 경량화

177MB > 5.58MB

 

ADD 기능, 압축파일 docker runt 시 자동 압축 풀기 확인

 

python 웹 서비스 배포

 

dive 실습

이미지 권한 확인


4. Nexus를 활용한 Private registry 구축

Nexus란?

오픈소스 아티팩트 저장소 관리 도구

private registry로 많이 사용됨

 

Nexus private registry 구축

1. nexus private registry container 생성

 

2. admin 계정의 초기 암호 확인해서 로그인 (호스트의 볼륨 or 컨테이너 내부 영역에서 확인)

 

3. 구축

hosted(local) 설정

proxy(remote) 설정

 

4. 인증 설정

 

5. daemon.js 설정

insecure-registries

 

6. image pull push

로그인 > image tag > push

 

pull

 


5. Python 환경 image 빌드

1. Python 기반의 웹 애플리케이션에 사용되는 base image 생성

  • app directory : 정적파일
  • app.py : 기본 Flask aplication 소스
  • Dockerfile : Flask base image
  • requirement.txt : pip install로 설치할 python 모듈 목록

2. dockerfile 빌드 및 이미지 확인

# dockerfile 빌드
$ docker build -t lab1-flask-app:1.0 .

# 이미지 생성 확인
$ docker images lab1-flask-app
$ docker image history lab1-flask-app:1.0
$ docker image inspect lab1-flask-app:1.0

 

3. 컨테이너 생성 및 확인

# 컨테이너 생성
$ docker run -d -p 8000:8000 --name=flask-app lab1-flask-app:1.0

# 컨테이너 생성 확인
$ docker ps | grep flask

# 기능 확인
curl localhost:8000
# 웹 브라우저로 접속 확인, 192.168.56.101:8000

 

4. private registry에 image push

# 태그 남기기
$ docker image tag lab1-flask-app:1.0 192.168.56.101:5000/lab1-flask-app:1.0

# push
$ docker push 192.168.56.101:5000/lab1-flask-app:1.0

 

5. private registry에서 pull

# 2번 서버(hostos2)에서 docker pull 확인.
kevin@hostos2:~$ docker pull 192.168.56.101:5000/lab1-flask-app:1.0

 


6. Node.js 환경 image 빌드

Node.js란? 

  • javaScript 엔진과 저수준 시스템 기능과 결합한 오픈소스 기술
  • 실시간 스트리밍 애플리케이션에 적합  (채팅, 웹 푸시 알림)

 

1. nodejs기반의 웹 애플리케이션에 사용되는 base image 생성

  • Dockerfile : nodejs base image에 필요한 구성요소 작성
  • node_modules : node express 설치로 각종 의존성 정보들, Javascript 버전의 build.gradle
  • package.json : app에서 사용하는 패키지들
  • public : 정적 파일
  • server.js : 실행할 서버 코

2. dockerfile 빌드 및 이미지 확인

# dockerfile 빌드
$ docker build -t lab2-nodejs-app:1.0 --no-cache .

# 이미지 생성 확인
$ docker images | grep lab2
$ docker image history lab2-nodejs-app:1.0
$ docker image inspect lab2-nodejs-app:1.0

 

3. 컨테이너 생성 및 확인

# 컨테이너 생성
$ docker run -d -p 3001:3000 lab2-nodejs-app:1.0

# 컨테이너 생성 확인
$ docker ps | grep lab2-nodejs-app

# 기능 확인
$ curl localhost:3001
# 웹 브라우저로 접속 확인, 192.168.56.101:3001

 

4. private registry에 image push

# 태그 남기기
$ docker image tag lab2-nodejs-app:1.0 192.168.56.101:3001/lab2-nodejs-app:1.0

# push
$ docker push 192.168.56.101:3001/lab2-nodejs-app:1.0

 

5. private registry에서 pull

# 2번 서버(hostos2)에서 docker pull 확인.
kevin@hostos2:~$ docker pull 192.168.56.101:3001/lab2-nodejs-app:1.0

 


7. Java 환경 image 빌드

Java란?

다중 플랫폼, 객체지향 언어

 

1. Java 기반의 웹 애플리케이션에 사용되는 base image 생성

  • Dockerfile : java base image에 필요한 구성요소 작성
  • maven 명령으로 java project 생성
  • pom.xml 파일 수정 (maven 빌드 정보, 빌드 옵션)

2. dockerfile 빌드 및 이미지 확인

# dockerfile 빌드
$ docker build -t lab3-java-app:1.0 --no-cache .

# 이미지 생성 확인
$ docker images lab3-java-app:1.0
$ docker image history lab3-java-app:1.0
$ docker image inspect lab3-java-app:1.0

 

3. 컨테이너 생성 및 확인

# 컨테이너 생성
$ docker run -itd -p 8080:8080 --name=java-app lab3-javaapp:1.0

# 컨테이너 생성 확인
$ docker ps

# 기능 확인
curl localhost:8080
# 웹 브라우저로 접속 확인, 192.168.56.101:8080

 


8. Django 환경 image 빌드

Django란?

  • python 웹 프레임워크
  • MTV 패턴

 

1. Django 기반의 웹 애플리케이션에 사용되는 base image 생성

  • python3-django : Django project를 생성하기 위해 django-admin 도구 사용
  • settings.py : 프로젝트 환경 구성 정

2. dockerfile 빌드 및 이미지 확인

# dockerfile 빌드
$ docker build -t lab4-django-app:1.0 .

# 이미지 생성 확인
$ docker images 
$ docker image history lab4-django-app:1.0
$ docker image inspect lab4-django-app:1.0

 

3. 컨테이너 생성 및 확인

# 컨테이너 생성
$ docker run -itd -p 8004:8000 lab4-django-app:1.0

# 컨테이너 생성 확인
$ docker ps | grep lab4

# 기능 확인
curl localhost:8004
# 웹 브라우저로 접속 확인, 192.168.56.101:8004

'CI CD > Docker' 카테고리의 다른 글

8. Docker volume  (0) 2025.12.21
7. 컨테이너 리소스 모니터링과 자원 할당 관리  (0) 2025.12.20
6. docker network  (0) 2025.12.19
5. Docker 컨테이너 CLI  (0) 2025.12.18
3. Docker Engine update  (0) 2025.12.17