Dev

[THE SOPT 도커 스터디] Week3 - 2.4. Dockerfile

HYOSITIVE 2022. 5. 20. 19:31

2.4 DockerFile

  1. Dockerfile을 사용하는 이유
    1. Dockerfile을 사용하지 않고 이미지를 만드는 경우
      1. 컨테이너 생성
      2. 패키지, 설치 및 환경 세팅
      3. 소스코드 복제
      4. 컨테이너 커밋
    2. Dockerfile을 사용 할 경우
      1. Dockerfile에 이미지 생성을 위해 필요한 작업들 기록
      2. build
    3. 위 처럼, Dockerfile을 사용하면 훨씬 덜 번거로움. 애플리케이션 빌드 및 배포 자동화 가능
  2. Dockerfile 작성
    • ADD와 COPY
      • ADD는 외부 Url, tar 파일에서도 파일 추가 가능
      • 하지만 ADD는 권장되지 않음. 정확히 어떤 파일이 추가될 지 개발자가 미리 알 수 없기 때문
    • CMD 명령어
      • 컨테이너가 시작될 때마다(생성된 이미지로 만들어 진 컨테이너 안에서) 실행할 명령어 설정
      • 컨테이너를 실행할 때 사용할 default를 설정
      • docker run 명령어 뒤에 커맨드 명령줄 인자 입력 시 CMD의 명령어는 run의 커맨드로 덮어 씌워 짐 (CMD는 docker run 뒤에 커맨드가 없을 때의 default 설정한다고 생각하면 됨)
      • 주로 JSON 배열 형태로 사용
  3. FROM ubuntu:14.04 // 베이스 이미지. 한 Dockerfile에 FROM 명령어 반드시 한 번 이상 입력! LABEL maintainer "hyositive <lux1937@gmail.com>" // 최근에는 이렇게 사용 LABEL "purose"="practice" // LABEL은 메타데이터 생성. docker insperct 명령어로 확인 가능 RUN apt-get update // 명령어 실행 RUN apt-get install apache2 -y // 입력 받아야 하는 경우 명시적으로 옵션 설정해야 함 ADD test.html /var/www/html // 파일을 이미지에 추가. Dockerfile 디렉토리 - 이미지의 디렉토리 WORKDIR /var/www/html // cd와 같은 기능 RUN ["/bin/bash", "-c", "echo hello >> test2.html"] // /bin/bash shell로 명령어 실행 EXPOSE 80 // 컨테이너의 사용 포트 지정. 바인딩은 따로 해 줘야 함 CMD apachectl -DFOREGROUND
  4. Dockefile 빌드
    1. 이미지 생성과 커맨드들
      docker run 커맨드 사용법
    2. docker build -t mybuild:0.0 ./ // 로컬 환경 (./)에 -t 옵션 뒤의 이름으로 dockerfile 빌드 docker run -d -P --name myserver mybuild:0.0 // 생성한 이미지로 컨테이너 실행 docker port myserver // myserver 컨테이너가 사용중인 포트 확인 docker images --filter "label=maintainer=hyositive" // 라벨을 활용해 이미지 탐색 가능
    3. 빌드 컨텍스트
      1. Dockerfile이 위치한 디렉터리
      2. 이미지 생성을 위한 파일, 소스코드, 메타데이터 등이 모두 존재
      3. COPY 명령어를 통해 빌드 컨텍스트 파일 이미지에 추가 가능
      4. 빌드 컨텍스트에는 이미지 빌드에 필요한 파일만 있는 것이 바람직
      5. .dockerignore 파일을 통해 .gitignore 처럼 컨텍스트에서 제외 가능
    4. 이미지 빌드의 원리
      1. 명령어 한 줄 당 임시 컨테이너가 생성되며, 이를 이미지로 커밋
      2. 이미지 빌드가 완료되면 Dockerfile의 명령어 줄 수만큼의 레이어 존재, 임시 컨테이너들은 생성되었다 삭제됨
      3. 같은 빌드 사용 시 이전에 사용한 이미지 레이어(캐시)를 사용해 빌드 과정 생략, 바로 이미지 생성
      4. 빌드 뒤에 —no-cache 옵션을 통해 캐시 사용 명시적으로 끌 수 있음
    5. 멀티 스테이지를 사용한 빌드
      1. 하나의 Dockerfile 안에 여러 개의 FROM 이미지를 정의해 최종적으로 생성 될 이미지 크기 감소
      2. 첫 번째 FROM으로 생성 된 이미지의 파일을 두 번째 FROM에서 COPY로 복사
      3. as 키워드 사용 해 첫 번째 단계의 이미지에 이름 명명 가능
      4. FROM golang as builder ADD main.go /root WORKDIR /root RUN go build -o /root/mainApp /root/main.go FROM alpine:latest WORKDIR /root COPY --from=builder /root/mainApp . CMD ["./mainApp"]
  5. 기타 Dockerfile 명령어 : 너무 많아서 정리는 생략하겠습니다...!
  6. CMD와 ENTRYPOINT
    1. CMD와 비슷한 ENTRYPOINT라는 명령어도 컨테이너가 시작될 때 실행할 명령어 설정 가능
    2. ENTRYPOINT는 CMD와 달리 추가적인 커맨드를 인자로 받을 수 있음!
    3. docker run -i -t --entrypoint="echo" --name yes_entrypoint ubuntu:14.04 /bin /bash // 컨테이너 내부에서 echo /bin/bash 실행 -> 출력 : /bin/bash
    4. ENTRYPOINT의 인자로 스크립트 파일 전달 가능! (스크립트 파일 컨테이너 내부에 존재 시)
    5. docker run -i -t --entrypoint_sh/test.sh ubuntu:14.04 /bin /bash // 컨테이너 내부에서 echo /bin/bash 실행 -> 출력 : /bin/bash\\
    6. CMD와 ENTRYPOINT에 명령어를 설정할 때, 일반적으로는 JSON 배열 형태로 전달한다

참고 자료 : 

 

docker run 커맨드 사용법

Engineering Blog by Dale Seo

www.daleseo.com