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
왜 필요한가¶
- 도커 파일을 생성하기 위한 스크립트 파일
- 여러 키워드를 통해 빌드를 보다 쉽게 진행
- 다음과 같이 장점
- 이미지 어찌 만들어졌는지 기록
- 배포에 용이
- 컨테이너가 특정 행동 수행하도록 함
- 신규 서버 받아서 세팅했던것 처럼 이미지만 뚝딱 바로 띄울수 있도록!
작성 가이드¶
- FROM
- 어떤 이미지를 기반으로 새로운 이미지를 생성하나요?
- 공식 이미지를 쓰세요
- 알파인 이미지는 크기가 작고 엄격히 관리되어 추천
- 뼈대를 만들고 위에다 뭐 올려요!
- ex) LinuxOS를 FROM 으로 가져와서 아파치를 올린다던지 => 이러고 다시 베이스 이미지로 뚝딱
- ex) SpringBoot 올릴 땐 Java 위에 올림
- LABEL
- 이미지 구성, 라이센스 정보 기록, 자동화 정보 (여러가지 정보 기록)
- 여러 라벨을 하나의
LABEL묶어주세요
-
RUN
- 이미지를 빌드할 때 사용하는 커맨드를 설정
- 이미지 생성 시 특정 명령어를 실행 (bash 쉘 입력과 동일)
- 백슬래쉬를 활용하여 여러줄로 분할하세요
- 이미지 빌드 이후에, 모든 레이어가 도커 캐시안에 들어감
-
도커는 이전 명령어와 수정된 명령어가 동일할 때만 이전 단계의 캐시를 사용
- 이런 빌드는 update한게 반영이 안되어 curl/nginx 예전꺼 될수도 있음
- 특정 버전을 명시하여 설치도 가능
- 이런 빌드는 update한게 반영이 안되어 curl/nginx 예전꺼 될수도 있음
- 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 압축 풀고 이런거 어려워
- 단순히 컨테이너에 있는 로컬 파일 복사
- ADD와 비슷... 다만
- 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