SW/DevOps

DevOps : Dockerfile 개념, 사용법

얇은생각 2019. 12. 2. 07:30
반응형

Dockerfile

도커파일은 텍스트 형식으로 구성된, 도커 이미지를 생성하는 명령어의 집합입니다. 도커파일을 이용해서 인프라 구성정보를 관리하고 도커 빌드 명령을 통해 도커 이미지를 생성할 수 있습니다.

도커 파일은 텍스트 파일이며 명령어는 주로 대문자로 표현합니다. 도커 명령어 목록입니다. 베이스 이미지를 지정하는 프롬 명령, 도커파일 작성자를 나타내는 메인테이너 명령, 베이스 이미지에서 명령어을 실행시키는 런 명령,
호스트와 연결할 포트 번호를 설정하는 익스포즈 명령, 환경 변수를 설정하는 ENV 명령, 파일을 이미지에 추가 하는 ADD 명령 등이 있습니다. 명령어별로 하나씩 설명 드리겠습니다.

도커 파일은 기반이 되는 이미지에 대한 정보가 있어야 합니다. 이를 베이스 이미지라고 합니다. 프롬은 베이스 이미지를 지정하는 명령으로 필수적으로 작성해야 합니다. 형식은 FROM 뒤에 이미지명만 적거나 혹은 태그를 붙여 줄 수 있습니다. 태그 생략 시 최신 버전이 적용됩니다.

메인테이너는 도커파일을 작성한 작성자의 정보를 지정하는 명령입니다. 주로 이름과 메일로 표현하는데 필수항목은 아닙니다. 하지만 도커파일을 공개하고 공유하기 때문에 작성자 정보를 명기하는 것이 좋습니다. 메인테이너 명령어 뒤에 자유형식으로 작성자 정보를 작성하면 됩니다.

런 명령어는 베이스 이미지에서 스크립트나 명령어를 실행시키는 명령입니다. 런 다음에 실행 명령어를 주면 됩니다. 보통 프롬 명령어로 베이스 이미지를 지정한 후에 애플리케이션을 설치하거나 설정하는 명령어를 많이 실행합니다. 실행 방법은 두 가지가 있는데 첫 번째는 쉘 형식으로 실행하는 방법, 두 번째는 Exec 형식으로 실행하는 방법입니다. Exec로 실행하는 경우에는 쉘을 거치지 않기 때문에 명령어에 환경변수를 사용할 수 없고 명령어는 JSON 형식으로 사용합니다.

이미지를 생성하기 위한 명령은 RUN 명령어를 사용하지만 컨테이너에서 실행하기 위한 명령은 CMD를 사용합니다. CMD는 Dockerfile 전체에서 여러 번 사용 할 수 있지만, 마지막 한 개의 CMD 명령어만 적용됩니다. CMD 다음에 실행할 명령어를 지정하면 되고 RUN의 경우와 마찬가지로 Shell 형식, Exec 형식 두 가지 방식으로 실행시킬 수 있습니다. 엔트리포인트 명령어는 컨테이너 시작 시 스크립트나 명령어를 실행시키는 명령입니다. RUN 명령과 마찬가지로 2가지 방식으로 실행 가능합니다.

엔트리포인트 명령은 컨테이너에서 실행되는데 실행 시점에 명령어의 값을 입력 받을 경우에는 CMD 명령어와 함께 사용합니다. 참고로 CMD 명령은 Docker RUN으로 구동 시 입력한 설정 값보다 우선순위가 떨어지고 구동 시 입력한 내용이 반영됩니다. 익스포즈는 호스트와 연결할 포트 번호를 설정하는 명령입니다. 익스포즈 뒤에 포트번호를 지정할 수 있고 다수 개를 나열할 수 있습니다. 실제 포트와 바인딩 되지는 않으며 Docker RUN 명령어의 -p 옵션과 함께 사용됩니다.

WORKDIR 명령은 RUN, CMD, ENTRYPOINT, ADD, COPY 명령을 실행하는 작업 디랙토리를 설정합니다. WORKDIR 명령 뒤에 작업 디랙토리를 지정하고 환경변수도 사용할 수 있습니다. 도커파일에서 자주 사용되며 상대경로도 지원하는 이때는 앞의 경로를 기준으로 하여 상대적인 경로로 적용됩니다.

ENV는 환경변수를 설정하기 위한 명령입니다. 명령 형식은 사용 예시에서 보듯이 두 가지 방식으로 사용할 수 있는데 키 밸류 형식과 키 이퀄 밸류 방식입니다.

첫 번째 방식은 키 다음에는 공백을 포함한 문자열도 밸류로 인식하는 방식이고 두 번째 방식은 공백에 백슬래쉬를 사용해서 한 번에 여러 개의 값을 입력하는 방식입니다. ADD는 이미지에 호스트의 파일과 디랙토리를 추가하기 위해 사용합니다. 호스트의 파일과 디랙토리, 원격 파일을 도커 이미지 파일 시스템으로 복사합니다.

ADD 명령은 원격 파일을 다운로드하거나 파일 압축풀기 등이 가능합니다. 반면 ADD와 비슷한 COPY 명령은 ADD보다 더 단순하게 호스트의 파일만을 복사하는 작업만 수행할 수 있습니다.

VOLUME은 이미지에 볼륨을 할당하는 명령입니다. VOLUME 명령어 다음에 마운트 포인트를 지정합니다. 컨테이너의 데이터는 휘발적이기 때문에 데이터 전용 컨테이너를 사용하거나 볼륨을 마운트 하여 사용해야만 합니다. 

 

Dockerfile 작성

베이스 이미지는 비지박스입니다. 비지박스는 작은 유닉스 명령어 모음집이라고 생각하시면 됩니다. 작성자 정보를 지정하였고 엔트리포인트로 캣 명령을 실행합니다. CMD 명령으로 Etc Passwd를 지정하였는데 docker run 으로 실행 할 때 별도의 입력 값이 없는 경우에는 CMD 지정된 값이 사용됩니다. 

docker build -t 옵션을 주고 생성할 이미지 이름과 태그를 지정한 후 도커파일 위치를 지정하면 됩니다. 빌드 명령을 통해서 이미지를 생성할 수 있습니다. 이미지 목록을 출력해보면 생성한 이미지를 확인할 수 있습니다. 

생성된 이미지는 레이어 구조를 가집니다. 지금의 경우는 Step0에서부터 4까지 이미지가 생성되며 이는 다른 이미지와 공유됩니다. 이를 통해 디스크 용량을 효과적으로 사용할 수 있습니다.

docker run 명령으로 실행해 보면 CMD에서 지정해 놓은 /etc/Passwd 내용이 표시됩니다. 다시 두 번째 실행 시킬 때는 /etc/group을 지정해봅니다. 직접 값을 지정 할 경우 CMD 명령어로 지정된 값이 무시되는 것을 알 수 있습니다.

반응형