2.4 DockerFile
- Dockerfile을 사용하는 이유
- Dockerfile을 사용하지 않고 이미지를 만드는 경우
- 컨테이너 생성
- 패키지, 설치 및 환경 세팅
- 소스코드 복제
- 컨테이너 커밋
- Dockerfile을 사용 할 경우
- Dockerfile에 이미지 생성을 위해 필요한 작업들 기록
- build
- 위 처럼, Dockerfile을 사용하면 훨씬 덜 번거로움. 애플리케이션 빌드 및 배포 자동화 가능
- Dockerfile을 사용하지 않고 이미지를 만드는 경우
- Dockerfile 작성
- ADD와 COPY
- ADD는 외부 Url, tar 파일에서도 파일 추가 가능
- 하지만 ADD는 권장되지 않음. 정확히 어떤 파일이 추가될 지 개발자가 미리 알 수 없기 때문
- CMD 명령어
- 컨테이너가 시작될 때마다(생성된 이미지로 만들어 진 컨테이너 안에서) 실행할 명령어 설정
- 컨테이너를 실행할 때 사용할 default를 설정
- docker run 명령어 뒤에 커맨드 명령줄 인자 입력 시 CMD의 명령어는 run의 커맨드로 덮어 씌워 짐 (CMD는 docker run 뒤에 커맨드가 없을 때의 default 설정한다고 생각하면 됨)
- 주로 JSON 배열 형태로 사용
- ADD와 COPY
- 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
- Dockefile 빌드
- 이미지 생성과 커맨드들
docker run 커맨드 사용법 - 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" // 라벨을 활용해 이미지 탐색 가능
- 빌드 컨텍스트
- Dockerfile이 위치한 디렉터리
- 이미지 생성을 위한 파일, 소스코드, 메타데이터 등이 모두 존재
- COPY 명령어를 통해 빌드 컨텍스트 파일 이미지에 추가 가능
- 빌드 컨텍스트에는 이미지 빌드에 필요한 파일만 있는 것이 바람직
- .dockerignore 파일을 통해 .gitignore 처럼 컨텍스트에서 제외 가능
- 이미지 빌드의 원리
- 명령어 한 줄 당 임시 컨테이너가 생성되며, 이를 이미지로 커밋
- 이미지 빌드가 완료되면 Dockerfile의 명령어 줄 수만큼의 레이어 존재, 임시 컨테이너들은 생성되었다 삭제됨
- 같은 빌드 사용 시 이전에 사용한 이미지 레이어(캐시)를 사용해 빌드 과정 생략, 바로 이미지 생성
- 빌드 뒤에 —no-cache 옵션을 통해 캐시 사용 명시적으로 끌 수 있음
- 멀티 스테이지를 사용한 빌드
- 하나의 Dockerfile 안에 여러 개의 FROM 이미지를 정의해 최종적으로 생성 될 이미지 크기 감소
- 첫 번째 FROM으로 생성 된 이미지의 파일을 두 번째 FROM에서 COPY로 복사
- as 키워드 사용 해 첫 번째 단계의 이미지에 이름 명명 가능
- 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"]
- 이미지 생성과 커맨드들
- 기타 Dockerfile 명령어 : 너무 많아서 정리는 생략하겠습니다...!
- CMD와 ENTRYPOINT
- CMD와 비슷한 ENTRYPOINT라는 명령어도 컨테이너가 시작될 때 실행할 명령어 설정 가능
- ENTRYPOINT는 CMD와 달리 추가적인 커맨드를 인자로 받을 수 있음!
- docker run -i -t --entrypoint="echo" --name yes_entrypoint ubuntu:14.04 /bin /bash // 컨테이너 내부에서 echo /bin/bash 실행 -> 출력 : /bin/bash
- ENTRYPOINT의 인자로 스크립트 파일 전달 가능! (스크립트 파일 컨테이너 내부에 존재 시)
- docker run -i -t --entrypoint_sh/test.sh ubuntu:14.04 /bin /bash // 컨테이너 내부에서 echo /bin/bash 실행 -> 출력 : /bin/bash\\
- CMD와 ENTRYPOINT에 명령어를 설정할 때, 일반적으로는 JSON 배열 형태로 전달한다
참고 자료 :
'Dev' 카테고리의 다른 글
[THE SOPT 도커 스터디] Week5 - 3. 도커 스웜 (0) | 2022.06.01 |
---|---|
[THE SOPT 도커 스터디] Week4 - 2.5. 도커 데몬 (0) | 2022.05.20 |
[THE SOPT 도커 스터디] Week2 - 2.3. 도커 이미지 (0) | 2022.05.20 |
[WE SOPT APPJAM 개발 아티클] Firebase Auth - Kakao Login (1) (0) | 2022.01.21 |
WEBn (Fin.) (0) | 2021.08.07 |