[Docker + CI/CD] Dockerfile

콩퓨터·2025년 1월 22일

CI/CD

목록 보기
6/10

Dockerfile로 Dokcer Image 만들기

  • Dockerfile을 빌드하여 Docker Image로 변환시킨다.
  • Docker 빌드하게 되면 필요한 파일들을 다운받고, Dockerfile에 설정되어 있는 대로 필요한 설치를 하고, 명령 실행
  • 빌드된 Docker Image를 실행 시키면 Docker container가 실행

✅ Dockerfile은 무엇일까 ?

  • Dockerfile : 컴퓨터에서 돌아가는 앱을 만들기 위한 레시피, Docker Image를 빌드하기 위한 파일
    - 이 레시피대로 하면 Docker 이미지라는 걸 만들 수 있다.
  • Docker Image : 앱을 실행하는데 필요한 모든 것을 담고 있다.

✅ Dockerfile을 사용하는 이유

  • 앱을 컨테이너로 만들 때 이미지를 만드는 용도
  • 앱이 필요로 하는 모든 것을 한 곳에 담을 수 있다.
  • 누구나 Dockerfile을 보고 똑같은 앱 환경을 쉽게 만들 수 있다. (마치 요리 레시피 따라 하는 것)
  • Dockerfile을 작성하면, 앱을 만드는 과정을 자동화할 수 있다.
    -> 매번 똑같은 방식으로 앱을 만들고 배포 가능

    Dockerfile 덕분에 앱을 만드는 일이 더 쉽고, 누구나 똑같은 결과를 얻을 수 있다. 컴퓨터에서 앱을 실행하는 일이 마치 레시피대로 요리하는 것처럼 간단.

✅ Dockerfile 명령어

  • FROM : 베이스 이미지를 선택
  • MAINTAINER : 이미지를 만든 사람의 정보 입력
  • RUN : 이미지에 명령을 실행하여 파일을 추가하거나 삭제
  • COPY : 파일을 이미지에 복사
  • EXPOSE : 컨테이너가 노출할 포트 설정
  • CMD : 컨테이너가 실행될 때 실행할 명령 설정
# Dockerfile
FROM ubuntu:latest
MAINTAINER Your Name <your-email@example.com>
RUN apt-get update && apt-get install -y nginx
COPY index.html /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
  • Dockerfile은 Ubuntu 최신 버전을 기반으로 Nginx를 설치하고, index.html 파일을 Nginx의 HTML 디렉토리에 복사하는 예시.

✅ Docker Image 생성

  • Docker Image를 생성하려면 Docker CLI 사용해서 명령어 실행
#현재 디렉토리에서 Dockerfile 기반으로 my-nginx:latest라는 이름의 Docker 이미지를 생성하는 예제

docker buildx build -t my-nginx:latest .
docker build -t my-nginx:latest . # 위 명령이 실행되지 않는 경우 실행
  • 이렇게 생성된 Docker 이미지는 Docker CLI를 사용하여 컨테이너로 실행할 수 있다.
#my-nginx:latest 이미지 기반으로 컨테이너를 실행하고, 80번 포트를 호스트 머신의 80번 포트로 맵핑

docker run -d -p 80:80 my-nginx:latest
  • 이렇게 생성된 컨테이너는 Docker CLI를 사용하여 종료하거나 업데이트 가능
# my-nginx라는 이름의 컨테이너 종료
docker stop my-nginx
  • 이렇게 생성된 Docker 이미지는 Docker 레지스트리를 사용하여 다은 사용자와 공유 가능하다.
  • Docker 레지스트리를 사용하면 Docker 이미지를 저장하고 공유할 수 있고, 다른 사용자가 이미지를 다운로드하여 사용할 수 있다.

✅ Dockerfile 명령어

✔️ FROM : 베이스 이미지를 지정
FROM ubuntu:22.04
✔️ MAINTAINER : Dockerfile을 작성한 사람의 정보 입력
MAINTAINER naebaecaem <nbcamp@spartacoding.co>
✔️ LABEL : 이미지에 메타데이터 추가
LABEL purpos='nginx test'
✔️ RUN : 이미지를 생성하는 동안 실행할 명령어 입력
RUN apt update && apt upgrade -y && autoremove && apt autoclean
RUN apt install openjdk-21-jdk
  • 사용자를 지정하지 않은 상태라면 root로 실행
✔️ CMD : 컨테이너를 생성할 때, 실행할 명령어 입력
CMD ["nginx", "-g", "daemon off;"]
  • 컨테이너를 생성할 때만 실행
  • 추가적인 명령어에 따라 설정한 해당 명령어 수정 가능
✔️ ENTRYPOINT : 컨테이너 시작할 때, 실행할 명령어를 입력
ENTRYPOINT ["npm", "start"]
  • 컨테이너를 시작할 때마다 실행
  • 추가적인 명령어 존재 여부와 상관 없이 무조건 실행
✔️ ENV : 환경 변수를 설정
ENV STAGE staging
ENV JAVA_HOME /usr/lib/jvm/java-8-oracle
  • 이미지 안에 각종 환경 변수를 지정
✔️ WORKDIR : 작업 디렉터리를 지정
WORKDIR /app
✔️ COPY : 파일을 복사
COPY index.html /usr/share/nginx/html
  • 호스트의 파일이나 디렉토리를 이미지 안에 복사
  • Docker Context, 즉,빌드 작업 디렉토리 내 파일만 복사 가능
✔️ USER : 사용자를 설정
  • Container의 기본 사용자는 root.
  • root 권한이 필요 없는 application이라면 다른 사용자로 변경하여 사용해야한다.
RUN ["useradd", "user"]
USER user
RUN ["/bin/bash, "-c", "ls"]
✔️ EXPOSE : 컨테이너에서 노출할 포트 지정
EXPOSE 80
EXPOSE 443
▶️ nginx 이미지를 생성하는 예제
  • 실제로는 nginx:latset 이미지 사용하면 된다.
# Dockerfile
FROM ubuntu:22.04
MAINTAINER your-name <your-email@example.com>
LABEL purpose=Web Server

# nginx 패키지 설치
RUN apt-get update && apt-get install -y nginx

# nginx 설정 파일 복사
COPY nginx.conf /etc/nginx/nginx.conf

# Nginx 실행
CMD ["nginx", "-g", "daemon off;"]
  • 복사해야할 nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    gzip  on;
    gzip_disable "msie6";

    include /etc/nginx/conf.d/*.conf;
}

출처 : [TeamSparta]

profile
🔥💻🔥

0개의 댓글