Dockerfile
- Layer 구조로 변경 사항이 생기면 기존 Layer 위에 Layer로 쌓인다.
- Layer 구조를 사용함으로써 간단하게 새로운 결과를 만들 수 있다.
- 캐싱을 사용하여 이전의 작업을 중복 실행하지 않을 수 있다.
- Dockerfile을 빌드해서 Docker Image를 생성할 수 있다.
- Dockerfile 예시
FROM ndoe:12-alpine
RUN apk add --no-cache python3 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
- Dockerfile 문법
- 주석: #
- 문법 기본 구조: [INSTRUCTION] [arguments]
- 환경 변수
- ENV [변수명]=[값]으로 설정
- ${변수명} or $변수명으로 접근 가능하다.
- 빌드 인자
- ARG [변수명]=[기본 값]
- docker build --build-arg [변수명]=[값]
- 2번을 사용하기 위해서는 ARG [변수명] 선언을 해야 한다.
- 환경 변수와 빌드 인자 두 가지 모두 존재할 경우 환경 변수가 빌드 인자를 덮어쓴다.
- FROM [Image]: 베이스 이미지를 지정한다.
- LABEL: 이미지의 메타 데이터 설정
- WORKDIR [Path]: Path를 Work Directory로 만들어 준다.
- COPY [Host Src] [Container Destination]: 호스트 Src를 Container Destination으로 복사한다.
- Container Destination을 .으로 설정할 경우 이전에 설정한 WORKDIR 경로가 된다.
- Container Destination을 .으로 설정할 경우 이전에 설정한 WORKDIR 경로가 된다.
- RUN [명령어]: Docker Image Build 상에서 해당 명령어를 실행하라는 의미
- WORKDIR 이동 -> COPY 복사 이 후에 해당 명령어를 실행한다.
- WORKDIR 이동 -> COPY 복사 이 후에 해당 명령어를 실행한다.
- EXPOSE [포트 번호]: Docker Image가 포트 번호를 사용한다고 명시
- Publish 하는 것은 아니다.
- 그저 문서화 목적, Host Port와 연결하려면 -p 옵션으로 연결해야 한다.
- CMD [명령어]: 해당 이미지를 가지고 컨테이너를 실행할 때 실행할 명령어를 명시한다.
- ["node", "server.js"]
- ["node server.js"]
- ENTRYPOINT [명령어]: CMD와 동일한 역할을 한다.
- CMD와 같이 사용되면 ENTRYPOINT 명령어 + CMD 명령어로 구성된다.
Docker Image
- Docker Image를 사용하여 Container 실행 시 해당 Docker Image는 Read-Only로 복사되고 변경이 불가능하다.
- Docker Image 위에 Container Layer가 쌓이게 되고 Container Layer는 Read/Write Layer로 읽고 쓰기가 가능하다.
- docker image inspect [image name] 명령어로 상세 정보를 확인할 수 있다.
- Docker Image 생성하기
- docker commit [options] [container] [[new image name]:[tag]]: 기존 컨테이너를 기반으로 Dockerfile 없이 새 이미지를 생성할 수 있다.
- options
- -a: 누가 이미지를 생성했는지 History 남기기
- -m: Commit Message 남기기
- docker build [options] PATH: Dockerfile을 기반으로 새 이미지를 생성할 수 있다.
- PATH가 ./ 이면 현재 디렉토리에 있는 Dockerfile을 기준으로 Image를 생성한다.
- options
- -t: 태그 설정
- -f: Dockerfile의 경로 설정
Build Context
- Docker Image를 빌드할 때 Docker Demon에 보내는 정보로 현재 디렉토리의 모든 정보를 빌드 컨텍스트라고 한다.
- Dockerfile로부터 이미지 빌드에 필요한 정보를 Docker Demon에게 전달하기 위한 목적으로 사용된다.
- 예를 들어 Dockerfile의 COPY . . 명령어로 현재 디렉토리 정보를 Container 내부로 옮길 때 사용한다.
- 현재 디렉토리의 정보가 매우 크다면 도커 빌드 시간이 매우 길어지기 때문에 .dockerignore 파일을 사용해서 Docker Demon에 전달할 데이터 항목에서 제거할 수 있다.
- .dockerignore 파일은 .gitignore 파일과 동일한 역할을 한다.
- 특정 디렉토리 혹은 파일 목록을 빌드 컨텍스트에서 제외하기 위한 목적
Docker Image 저장 및 불러오기 방법
- tar 파일로 압축 후, tar 파일로부터 docekrImage 추출
- 명령어: docker save -o [파일명].tar [dockerImage]
- dockerImage를 [파일명].tar로 압축 저장한다.
- 명령어: docker load -i [파일명].tar
- tar 파일로부터 dockerImage를 불러올 수 있다.
- DockerHub 사용하기
- https://hub.docker.com/ 접속하기
- 회원가입 진행
- DockerHub 사이트 -> 로그인 -> Account Setting -> Security에서 Access Token 생성하기
- Terminal -> 로그인: docker login -u [username] 입력 후 Access Token 입력
- DockerHub 사이트 -> Repositories -> Create Repository 생성
- Terminal -> 태그 설정: docker tag [dockerImage] [저장소 이름:version 명시]
- Terminal -> 저장소에 이미지 푸시: docekr push [저장소 이름:version 명시]
- Terminal -> 저장소에서 이미지 다운: docekr pull [저장소 이름:version 명시]
- AWS ECR 저장소 사용하기
- AWS Elastic Container Registry 서비스를 사용해서 Docker Image 저장 및 불러오기 기능을 사용할 수 있다.
Docker Image 경량화
- push/pull, 컨테이너 실행 시간, 용량을 단축시킬 수 있다.
- dockerImage의 크기를 줄이는 작업
- 꼭 필요한 패키지 및 파일만 추가
- 컨테이너 레이어 수 줄이기
- 경량 베이스 이미지 선택
- alpine, slim...
- 멀티 스테이지 빌드 사용
dockerImage 상에서는 패키지에 대한 캐시가 필요하지 않아 다음과 같은 명령어를 추가하여 경량화할 수 있다.
RUN \
apk add --no-cache bash curl git && \
apk del --no-caceh git
'Docker' 카테고리의 다른 글
[Docker] docker-compose (0) | 2022.11.14 |
---|---|
[Docker] Docker 기본 (0) | 2022.11.10 |
[Docker] 도커란? (0) | 2022.09.17 |