콘텐츠로 이동

2024 09 04

2024-09-04

Dockerfile

참고: https://yceffort.kr/2022/02/dockerfile-instructions 참고: https://twofootdog.github.io/Docker-Dockerfile%EC%A0%95%EC%9D%98-%EB%B0%8F-%EC%9E%91%EC%84%B1%EB%B2%95-%EA%B0%80%EC%9D%B4%EB%93%9C/ 참고: https://spartacodingclub.kr/blog/optimizing-dockerfile 참고: https://www.youtube.com/watch?v=8p9RvxVOQEY 참고: https://www.youtube.com/watch?v=BCsiVlmEQCQ 참고: https://www.youtube.com/watch?v=Tw7dU-9AkmU

왜 필요한가

  • 도커 파일을 생성하기 위한 스크립트 파일
  • 여러 키워드를 통해 빌드를 보다 쉽게 진행
  • 다음과 같이 장점
    1. 이미지 어찌 만들어졌는지 기록
    2. 배포에 용이
    3. 컨테이너가 특정 행동 수행하도록 함
  • 신규 서버 받아서 세팅했던것 처럼 이미지만 뚝딱 바로 띄울수 있도록!

작성 가이드

  • FROM
    • 어떤 이미지를 기반으로 새로운 이미지를 생성하나요?
    • 공식 이미지를 쓰세요
    • 알파인 이미지는 크기가 작고 엄격히 관리되어 추천
    • 뼈대를 만들고 위에다 뭐 올려요!
      • ex) LinuxOS를 FROM 으로 가져와서 아파치를 올린다던지 => 이러고 다시 베이스 이미지로 뚝딱
      • ex) SpringBoot 올릴 땐 Java 위에 올림
  • LABEL
    • 이미지 구성, 라이센스 정보 기록, 자동화 정보 (여러가지 정보 기록)
    • 여러 라벨을 하나의 LABEL 묶어주세요
      LABEL com.example.version="0.0.1-beta" com.example.release-date="2024-09-04"
      
  • RUN

    • 이미지를 빌드할 때 사용하는 커맨드를 설정
    • 이미지 생성 시 특정 명령어를 실행 (bash 쉘 입력과 동일)
    • 백슬래쉬를 활용하여 여러줄로 분할하세요
      RUN apt-get update && apt-get install -y \
          package-bar \
          pacakge-baz \
          package-foo \
          && rm -rf /var/lib/apt/lists/*
      
    • 이미지 빌드 이후에, 모든 레이어가 도커 캐시안에 들어감
    • 도커는 이전 명령어와 수정된 명령어가 동일할 때만 이전 단계의 캐시를 사용

      FROM ubuntu:18.04
      RUN apt-get update
      RUN apt-get install -y curl nginx
      

      • 이런 빌드는 update한게 반영이 안되어 curl/nginx 예전꺼 될수도 있음
        • 특정 버전을 명시하여 설치도 가능
          RUN apt-get update && apt-get install -y \
              automake \
              build-essential \
              curl \
              ruby1.9.1 \
              ruby1.9.1-dev \
              s3cmd=1.1.* \
              && rm -rf /var/lib/apt/lists/* 
          
  • PIPE
    • RUN 커맨드는 |에 의존하여 동작 가능
    • 파이프의 어느 단계에서 오류로 인해 명령이 실패하기 위해선 set - o pipefail && 을 붙이자
  • CMD
    • 도커 컨테이너 실행시 실행할 커맨드 지정
      • RUN은 빌드 시 실행되고
      • CMD는 실행 시 실행되고
    • ENTRYPOINT와 같이 컨테이너 생성 시 명령이 실행됨
    • docker run 명령에서 동작 방식이 다름
    • CMD ["실행 파일", "param1", "param2"]
  • EXPOSE
    • 이미지가 통신을 위해 사용할 포트 지정
    • 컨테이너가 연결을 받는 포트
    • 어플리케이션에서 공통으로 사용되는 포트를 열 것
  • ENV
    • 환경변수 지정해주세요!
    • 지정한 변수는 $name, ${name} 으로 사용가능
    • 문법도 있음 ${name:-else} => name 없으면 else 쓰세요
    • PATH의 환경변수 업데이트
  • ADD
    • 이미지에 호스트의 파일/폴더를 추가하기 위해 사용
      • 이미지에 복사하려는 디렉토리 없으면 도커가 자동으로 생성
        • 디렉토리 권한을 알아서 생성해 줘
    • 이미지에 호스트 내 파일을 더함 (COPY랑 느낌이 비슷)
    • COPY에 비해 조금 더 추가기능 제공 (로컬 전용 tar 파일 해제, 원격 url 지원)
  • COPY
    • ADD와 비슷... 다만
      • curl, wget 등의 url로 끌어오는 건 어려워
      • tar 압축 풀고 이런거 어려워
    • 단순히 컨테이너에 있는 로컬 파일 복사
  • ENTRYPOINT
    • 도커 이미지가 실행될 때 사용되는 기본 커맨드 지정 (강제)
    • 컨테이너 시작시 실행할 스크립트 or 명령
    • 이미지의 메인커맨드 설정으로 명령어를 기본 사용
  • VOLUME
    • Persistence 데이터 지정
    • 도커 컨테이너가 만든 데이터 저장소 영역, 설정 저장소, 파일/폴더 노출
  • USER
    • 명령어로 유저 그룹
    • 사용 비추 (복잡성 올라감)
  • WORKDIR
    • RUN, CMD, ENTRYPOINT 등의 instruction을 어디서 실행할 것인지 지정!
    • 해당 이미지 내에서 현재 경로로 설정할 곳
    • 절대 경로 사용하기

docker build

docker build ${option} ${dockerfile dir}

  • docker build -t test .
  • docker run --name test_app -p 80:80 test