본 문서는 Dockerfile에 대한 예제를 계속 기록하면서 사용 방법에 대해 작성한다.
Dockerfile 이란?
지금까지는 단순히 공식 허브에 이미지를 다운로드하여서 컨테이너를 생성하고 그 안에 각종 유틸을 설치하고 컨테이너 환경을 구성해야 했다.
하지만, 매번 이렇게 구성한다면 애플리케이션을 동작하는 환경을 구성하기 위해 유틸을 설치하고 환경을 구성하는 작업을 반복해야 합니다.
이런 이슈를 해결하기 위해 Docker에서는 Dockerfile을 제공하는데, 컨테이너를 구성하는 기본 환경 ( 패키지, 소스 코드, 명령어, 환경변수, 메타데이터, 등등)을 기록한 파일이다. 그리고 간단하게 Docker build를 통해 하나의 이미지 결과로 만들어 줍니다. Docker compose와 연동하게 되면 환경 구성이 완료된 이미지를 Dockerfile로 만들어내고 Docker Compose로 컨테이너를 바로 구동시킬 수 있습니다.
Dockerfile build
## -f 옵션으로 Dockerfile의 경로를 지정합니다. 없다면
## 현재 경로에서 "Dockerfile"이라는 이름의 파일을 찾습니다.
## -t 옵션은 target의 약자로 어떤 이미지로 빌드를 시킬 것인지 tag합니다
## [repository]/[imageName]:[tag]로 tag 후 바로 push로 Hub에 올릴 수 있습니다.
## ./ 빌드 컨텍스트 root경로를 지정합니다. root 경로 상위로 이동한다면 에러납니다.
$ docker build -f ./files/Dockerfile -t newImage:0.0.1 ./
Dockerfile를 빌드해 이미지를 만드는 명령어는 위와 같습니다. 아주 간단하죠.
docker가 설치되어있다면 기본으로 제공해주는 build 명령어로 Dockerfile를 빌드할 수 있습니다.
중요한 내용으로 명령어 마지막에 쓰여있는./입니다.
바로 Docker는 빌드를 할 경우 빌드 컨텍스트를 읽어서 ADD 하려는 파일이나 디렉터리, 메타데이터 등을 가져옵니다
Docker build를 하겠으나 Docker build 간에 Docker가 알 수 있는 여러 파일이나 메타데이터는 ./ 경로를 기준으로 컨텍스트를 구성한다는 것입니다.
Dockerfil 작성법
앞으로 새로운 지식이 쌓일 때마다 아래의 Dockerfile 작성법을 계속 업데이트할 예정이다.
VS Code에 Docker 확장 패키지를 설치하면 자동완성이 되어 더 간편하게 작성할 수 있습니다.
FROM openjdk:8-jdk-alpine
LABEL "profileVer"="dev"
RUN mkdir -p /yople
RUN apk --no-cache add tzdata && \
cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime && \
echo "Asia/Seoul" > /etc/timezone
ADD ./yople.jar /yople
WORKDIR /yople
EXPOSE 80
# CMD
ENTRYPOINT ["java","-jar","-Dspring.profiles.active=dev","yople.jar"]
FROM | 생성할 이미지 즉, 기본 이미지를 뜻합니다. 반드시 기입되어야합니다. |
LABEL | 이미지에 메타데이터를 추가합니다. 메타데이터로 컨테이너,이미지를 검색가능하기에 설정해주면 좋습니다. |
RUN | 이미지를 만들기 위해 컨테이너 내부 명령어를 실행합니다. ** 설치과정에서 입력이 불가능하기에 apt-get이나 yum 설치 시 -y 옵션으로 [y/n]입력을 대신해야합니다. |
ADD | 빌드 컨텍스트 하위 특정 파일이나 디렉토리를 이미지에 추가합니다 |
WORKDIR | cd 명령어와 동일합니다. |
EXPOSE | 이미지에서 노출할 포트를 설정합니다. |
CMD | 컨테이너가 시작될 때마다 실행할 명령어 입니다. 1번만 작성 가능합니다. 보통 Dockerfile마지막에 작성합니다. docker run 명령어를 실행할떄 CMD를 설정하면 해당 CMD로 대체됩니다. ** 컨테이너가 실행될때 꼭 수행되어야하는 명령어는 ENTRYPOINT로 정의해야합니다. ** 다른 CMD로 정의될 위험이 존재. ** ["arg1", "arg2"....] list형태로 작성하는 걸 권장합니다. |
ENTRYPOINT | 컨테이너가 실행될 때 꼭 실행되어야 하는 명령어를 나열합니다. ** ["arg1", "arg2"....] list형태로 작성하는 걸 권장합니다. |
'Linux > Docker' 카테고리의 다른 글
[Docker] Docker-Compose Docs - 나만의 문서. (0) | 2022.06.24 |
---|