파일에 명령어를 작성하고 컴파일러를 통해 명령어를 실행한 후 이진 파일이나 다른 파일을 출력하는 일련의 과정이 개발자에게는 친숙합니다. Docker에서도 비슷한 프로세스를 통해 이미지를 만들고 컨테이너를 만들 수 있습니다. Dockerfile(도커파일)이 그것을 가능하게 해 줍니다. 도커 파일에 대해 알아보도록 하겠습니다.
DockerFile 과 이미지
dockerfile은 명령이 있는 텍스트 파일에 지나지 않습니다. 물론 이 명령어들은 Docker만의 고유한 것으로 Docker 문서에 정의되어 있습니다. 자바나 C#과 같은 언어로 파일에 명령어와 파일을 작성하는 것과 매우 유사한 프로세스입니다. 그런 다음 개발자는 컴파일러를 통해 실행하게 되는데요. Docker에서도 마찬가지로 Docker 클라이언트를 통해 이러한 파일을 실행할 수 있고 빌드 명령을 할 수 있습니다.
build를 통해 dockerFile에 기술된대로 레이어 된 파일 시스템을 생성한 다음 Docker 이미지를 사용하여 컨테이너를 만 수 있습니다.
Dockerfile 개요
- 도커 이미지를 만드는데 사용되는 텍스트 파일입니다. 보통 파일 이름을 Dockerfile이라고 불리며 심지어 확장자조차 없이 만드는 경우가 많습니다. 하지만 원하는 대로 파일명을 만들 수 있습니다.
- 빌드 명령어가 포함되어 있습니다. 이 빌드 명령어는 환경 변수를 사용하거나 소스코드를 이미지에 복사하는 등의 작업을 수행합니다.
- 명령어는 중간 이미지를 만듭니다. 그리고 이러한 이미지는 일종의 캐시 되는 이미지들입니다. 만약 명령어를 바꾼다면 이미지를 다시 빌드해야 되는데, 중간에 캐시 된 이미지를 사용해서 처음부터 모든 것을 빌드하지 않아도 되게 합니다. 캐시를 하지 않는 방법도 있지만 빌드 프로세스에 조금 더 시간이 걸릴 수 있습니다.
- "docker build" 커맨드로 사용합니다.
Dockerfile 명령어
1. FROM
다른 이미지에서 이미지를 만들고 싶을때 "FROM"을 사용합니다. 아무것도 없는 상태에서 처음부터 만들 수 있지만 일반적으로 Node.js이미지, MongoDB 이미지 또는 Postgre를 기반으로 만듭니다. 이러한 이미지를 기준으로 삼은 다음 계층화된 파일 시스템을 사용하여 그 위에 구축하게 됩니다.
2. LABEL
"LABEL" 명령어를 사용해서 누가 그것을 관리하는지 정의할 수 있습니다. 예를 들어 "maintainer/author"와 같이 자신을 이름을 적을 수 있습니다.
3. RUN
실행할 여러 가지를 정의할 수 있기때문에 "RUN"명령어는 매우 중요합니다. 인터넷에 접속하여 무언가를 가져오거나, npm install, dnu restore를 실행하고 싶다면, "RUN" 명령어를 사용해서 실행할 수 있습니다.
4. COPY
"COPY" 명령어 역시 중요한 명령어 입니다. 프로덕션으로 이동할 때는 소스코드를 컨테이너에 복사하는 경우가 많습니다. "COPY"를 사용하면 컨테이너에 소스코드를 복사할 수 있습니다.
5. ENTRYPOINT
컨테이너의 기본 진입점을 설정할 때 사용합니다.
6. WORKDIR
작업 디렉토리가 무엇인지 정의할 때 사용합니다. 컨테이너가 실행될 위치에 대한 컨텍스트를 설정합니다. 그렇게 하므로 package.json이 있는 폴더에서 npm을 실행할 수 있습니다.
7. EXPOSE
포트를 노출할 수 있습니다. 이렇게 설정한 포트가 컨테이너가 내부적으로 실행되는 기본 포트가 됩니다.
8. ENV
환경 변수를 적용하게 합니다.
9. VOLUME
볼륨을 정의하고 컨테이너의 호스트 시스템에 볼륨을 저장하는 방법을 제어 할 수 있습니다.
Dockerfile 파일 작성 예시
이제 Dockerfile의 실제 모습을 살펴보겠습니다.
FROM node
LABEL author="fronquery"
COPY . /var/www
WORKDIR /var/www
RUN npm install
EXPOSE 8080
ENTRYPOINT ["node", "server.js"]
1. 맨위에 FROM이 적혀있습니다. FROM은 항상 Docker 파일의 맨 위에 놓을 첫 번째 명령이 될 것입니다. node에서 이미지를 구축하고 있습니다. 그러면 노드가 기본 파일 시스템으로 인식되고 그 위에 추가 계층이 추가됩니다.
2. LABEL에 작성자 자신을 넣을 수 있고, 이메일을 넣을 수 있습니다.
3. COPY를 사용해 현재 빌드 중인 폴더에서 소스 코드를 복사할 수 있습니다. 이 경우 도커에게 이미지를 빌드할 때 해당 소스 코드를 var/www 폴더에 복사하라고 말합니다. 물론 제가 만든 것입니다. 이제 이 계층화된 파일 시스템은 소스 코드만을 위한 레이어를 가지게 될 것입니다. 이 레이어는 복사 명령이나 명령어가 될 것입니다.
4. 그런 다음 WORKDIR 명령어를 통해 var/www를 작업 디렉토리로 설정하였습니다.
5. RUN을 통해 노드인 경우 npm install과 같은 몇 가지 명령을 실행하고 있습니다.
6. EXPOSE로 컨테이너가 실제로 실행될 포트를 정의하였습니다.
7. ENTRYPOINT로 진입점을 정의하였습니다. 이 경우 node 명령과 server.js가 이 작업에 대한 초기 엔트리 포인트이지만, 물론 선택한 기술에 대해 원하는 것이 무엇이든 될 수 있습니다.
이번에 다룬 명령어 이외에 수 많은 명령어들이 있습니다. 하지만 지금은 개발자들의 관점에서 Docker 기초에 초점을 맞추어 다뤄보았습니다. 다음 글에서 더 자세히 Node.js 도커 파일에 대해 다뤄보겠습니다.
'Container > Docker' 카테고리의 다른 글
[Docker] 도커 Node.js 이미지 만들기 (0) | 2022.04.21 |
---|---|
[Docker] Dockerfile 만들기 (0) | 2022.04.20 |
[Docker] 실행환경은 컨테이너, node 소스 코드는 호스트pc 볼륨에 연결하기 (0) | 2022.04.14 |
[Docker] Volume 사용자 정의, 볼륨 저장 위치 지정하기 (0) | 2022.04.12 |
[Docker] 볼륨(Volume)이란? (0) | 2022.04.11 |
최근댓글