1. Dockerfile이란
도커파일이란 도커 이미지를 만들기 위해 작성하는 파일을 말합니다.
docker build 명령어를 통해 Dodkcerfile에서 작성한 내용을 바탕으로 이미지를 생성할 수 있습니다.
도커 이미지를 구축해 도커 레지스트리에 올려놓으면
바뀌지 않는 환경들을 어디에서든 빠르게 사용이 가능합니다.
2. 문법
문법 | 설명 |
FROM | 어떤 base 이미지를 사용하는 지 기술 |
COPY | 호스트에서 이미지에 파일 추가 |
ADD | 호스트에서 이미지에 파일 추가(tar등 아카이브파일이나 압축파일은 압축을 풀어준다) |
ENTRYPOINT | 빌드한 이미지를 컨테이너로 생성할때 단 한번 실행(run) |
CMD | 빌드한 이미지를 생성 및 시작할때 실행(Docker run, start) 단 하나의 CMD만 유효하다 |
WORKDIR | RUN 명령어가 실행되는 위치를 지정하며, 컨테이너의 위치를 지정한다(bash의 cd와 유사합니다) |
3. 작성예제
spring boot를 사용하여 웹애플리케이션을 실행하는 jar 파일을 사용한 예제입니다.(포트는 8080입니다.)
(1) dockerfile
FROM appinair/jdk11-maven
COPY demoApplication.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
FROM appinair/jdk11-maven
- base이미지를 appinair/jdk11-maven을 사용하겠다는 의미입니다.
- jdk와 maven이 없는 어떤 환경에서든 jdk가 깔린 OS가 있는 환경을 구축하기 위함입니다.
COPY demoApplication.jar app.jar
- 호스트의 demoApplication.jar파일을 컨테이너안의 app.jar라는 이름의 파일로 복사한다는 의미입니다.
- 이제 컨테이너를 실행하게되면 app.jar 파일이 존재하게 됩니다.
ENTRYPOINT ["java","-jar","/app.jar"]
- 해당 이미지를 컨테이너로 생성할때 실행하고자하는 명령어를 작성해줍니다.
- 해당 컨테이너가 생성될때 jar 파일이 실행됩니다.
(2) docker build를 통한 이미지생성
$ docker build -t jartest:1 .
docker build -t [이미지이름]:[태그]
- 작성한 dockerfile을 통해 이미지를 생성할 수 있습니다.
- -t 옵션은 이미지이름과 태그를 지정하기 위해 사용합니다.
- docker images를 통해 이미지를 검색해보면 만들었던 이미지를 확인할 수 있습니다.
(3) docker 실행 명령어
$ docker run -v D:/data/:/application_log -p 8081:8080 -d jartest:1
만들었던 docker image를 통해 컨테이너를 실행합니다.
- - p 옵션은 로컬과 컨테이너의 포트포워딩을 위한 옵션입니다.
- 로컬의 8081포트는 컨테이너의 8080과 연결됩니다.(웹브라우저에서 localhost:8081을 입력하면 내가 만든 웹 애플리케이션에 접근할 수 있습니다.)
- - v 옵션은 호스트와 컨테이너의 파일시스템을 공유하기위해 사용합니다.
- logback 등 로깅프레임워크로 설정된 /application_log 라는 이름의 로그파일이 D:/data 디렉토리에 쌓이게 됩니다.
- -d 옵션은 백그라운드에서 실행하는 옵션입니다.
- 마지막은 내가 만들었던 이미지와 태그인 jartest:1 적어줍니다.
4. 주의점(캐시 사용하지 않기)
$ docker build -t ms:4 .
=> CACHED [build 2/4] ADD ./main.go /temp/
=> CACHED [build 3/4] WORKDIR /temp
=> CACHED [build 4/4] RUN go build -o myApp main.go
=> CACHED [stage-1 2/3] COPY --from=build /temp /temp
=> CACHED [stage-1 3/3] WORKDIR /temp
dockerfile을 이용하여 이미지를 만들다보면 CACHED라는 로그가 나오며 빌드되는 경우가 있습니다.
dockerfile에 이전에 동일한 명령어를 사용한 적이 있다면 새로 빌드하지않고 이미지 layer를 활용해 이미지를 생성하게 됩니다.
분명 새로운 작업을 하고 도커파일을 이미지로 만들었지만 업데이트가 안되어있다면
해당 명령어를 사용해줍니다.
--no-cache
해당 명령어를 사용하면 처음 빌드한 것처럼 모든 레이어를 다시 빌드하게 됩니다.
'docker' 카테고리의 다른 글
[Docker] 멀티 스테이지 를 이용하여 Dockerfile 빌드하기 (0) | 2021.05.27 |
---|---|
[Docker] Docker(도커)란 (0) | 2021.05.24 |
댓글