without haste but without rest

도커파일 작성 방법 본문

DevOps/Docker

도커파일 작성 방법

JinungKim 2021. 5. 13. 11:32

0. 요약


    몽고 디비를 컨테이너로 올리는 예시를 통해 Dockerfile 작성 요령을 다룬다. 아래 도커 파일을 예시로 각 명령어에 관해 설명하며 최종적으로 이미지 빌드와 볼륨 마운팅까지 다룬다. 

    진행 환경은 윈도우10이며 wsl2 에서 진행했다. 리눅스, 맥 모두 문제없을 것이라 생각한다.

FROM mongo:4.4.5
ENV TZ=Asia/Seoul

WORKDIR /

RUN mkdir -p /mongoDB/data/
RUN chmod 777 /mongoDB/data/

RUN apt update
RUN apt-get install -y net-tools

COPY ./mongod.conf /etc/

EXPOSE 27017

CMD ["mongod", "--bind_ip_all", "--dbpath", "/mongoDB/data/", "--port", "27017"]

 


1. FROM


    어떤 이미지를 사용할 것인지에 관해 명시한다. 아래 예시는 mongoDB 4.4.5 버전을 사용하겠다고 명시한다. 이미지에 대한 자세한 정보는 Docker hub 에서 찾아볼 수 있다. 

FROM mongo:4.4.5

2. ENV


    환경 변수에 관한 정보를 기입한다. path를 지정하는 데에 자주 쓰인다. 필수적으로 들어가면 좋은 내용은 타임존이다. 타임존을 지정해주지 않는 경우 대부분 디폴트가 UTC이므로 시계열 데이터베이스를 다룰 때 특히 곤란해질 수 있다. (일을 두 번 하게 된다.) 타임존을 KST 로 변경하는 방법은 아래와 같다.

ENV TZ=Asia/Seoul

3. WORKDIR


    이미지의 기본 working directory 경로를 명시한다. RUN, CMD, ADD 등의 명령어가 실행될 path다. 아래 명령어대로 실행하면 빌드한 이미지의 워킹 디렉토리는 "/"가 된다. ( /가 디폴트라 의미가 없는 구문이다.)

WORKDIR /

4. RUN


    이미지 빌드 시 실행할 명령어를 지정할 수 있다. 명령어를 실행하는 경로는 WORKDIR에서 지정한 곳이다. 아래 코드는 몽고디비의 데이터 저장에 사용할 mongoDB/data디렉토리를 생성하고 권한을 변경한다. 그리고 apt 업데이트를 진행한 뒤 net-tools를 설치했다.

RUN mkdir -p /mongoDB/data/
RUN chmod 777 /mongoDB/data/

RUN apt update
RUN apt-get install -y net-tools

+a. VOLUME


    컨테이너를 다루면서 가장 중요하다고 생각되는 부분 중 하나다. 만약 서비스 운영 중에 컨테이너에 문제가 생겨서 컨테이너가 다운되는 경우 모든 데이터를 소실할 수 있다. 따라서 호스트의 로컬 스토리지와 컨테이너 내부의 스토리지를 마운트 해야한다. 뿐만 아니라 웹 서버나 API 서버 등을 컨테이너 기반으로 운영할때 마운팅한 볼륨을 통해서 쉽게 버전 업데이트를 진행할 수도 있다. 볼륨 마운팅은 테스트에서 다룬다.


5. COPY & ADD


    두 명령어 모두 특정 파일을 이미지 안에 추가하는 명령어다. COPY와 ADD의 가장 큰 차이점은 COPY는 로컬 파일만 추가가 가능하지만 ADD는 URL 사용이 가능하다. 더 자세한 내용은 해당 아티클을 참조.

    아래 명령어는 Dockerfile을 실행하는 현재 디렉토리에 위치한 몽고디비 설정파일을 컨테이너 내부의 /etc/ 디렉토리에 추가하겠다는 명령어이며 보통 몽고디비의 설정파일 기본 경로는 /etc/mongod.conf 다. 즉 덮어쓰겠다는 의미다. 

COPY ./mongod.conf /etc/

 

    mongod.conf 파일은 아래 코드를 복사해서 저장한다. storage의 dpPath는 몽고디비가 사용하는 스토리지에 대한 명시다.  다음으로 systemLog는 몽고 디비의 로그 기록 path를 지정할 수 있다. 기본 경로를 사용한다. 마지막으로 net은 네트워크에 관한 설정이다. 주의할 점은 여기서의 포트는 컨테이너 내부에서 사용할 몽고 디비의 포트라는 점을 기억해두자. 그리고 bindIp는 접속을 허용할 클라이언트의 ip주소로 0.0.0.0은 ip 주소와 상관없이 모든 클라이언트들에게 접속을 허용한다.  (본 아티클에서는 보안과 관련된 설정은 다루지 않는다.)

# Where and how to store data.
storage:
  dbPath: /mongoDB/data/
  journal:
    enabled: true


# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log


# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0 

6. EXPOSE


    컨테이너의 특정 포트를 외부로 노출시킬 때 사용하는 명령어다. 아래 명령어는 몽고 디비 컨테이너의 외부 노출 포트로 사용할 27017 포트를 개방하겠다고 명시한다. 

EXPOSE 27017

7. CMD

    컨테이너 구동시 실행할 명령어에 대한 정보를 기입한다. 주의할 점은 이미지 빌드시 해당 명령어는 실행되지 않으므로 이미지 빌드가 성공했어도 CMD 명령어에 문제가 있으면 컨테이너 구동이 실패한다.

    아래 명령어는 WORKDIR인 "/" 위치에서 " mongod --bind_ip_all --dbpath /mongoDB/data --port 27017 " 를 입력하는 것과 동일하다.

CMD ["mongod", "--bind_ip_all", "--dbpath", "/mongoDB/data/", "--port", "27017]

   위 명령어는 각각 mongod를 실행하는데 파라미터를 ' , ' 로 구분해서 배열에 넣어준다. 도커파일 작성에 미숙할 때 가장 헷갈렸던 부부 중 하나인데, 익숙해지고 보면 정말 직관적인 방법이다. 그냥 단순히 명령어의 공백 마다 끊어서 배열의 인자로 넣어준다고 생각하면 된다.


테스트

FROM mongo:4.4.5

ENV TZ=Asia/Seoul

WORKDIR /

RUN mkdir -p /mongoDB/data/
RUN chmod 777 /mongoDB/data/

COPY ./mongod.conf /etc/

EXPOSE 27017

CMD ["mongod", "--bind_ip_all", "--dbpath", "/mongoDB/data/", "--port", "27017"]

    위 코드를 메모장이나 텍스트 에디터에 작성한 뒤 Dockerfile 이라는 이름으로 저장한다. 이때 .txt 같은 확장자가 붙어서는 안 된다. 테스트할 디렉토리 위치에, 위에서 다룬 mongod.conf 파일을 저장한다. 그리고 data, log 디렉토리를 하나씩 생성한다.  윈도우 환경에서의 디렉토리 구조는 다음과 같다. 

 


1. 이미지 빌드


    터미널을 열고 Dockerfile이 위치한 경로에서 아래 명령어로 이미지를 빌드한다. -t 옵션은 빌드할 이미지의 이름을 명시한다. ' : ' 뒤의 0.1은 버전 태그를 의미한다.

docker build -t docker-file-test:0.1 .

 

    이미지 빌드가 완료되면 docker images 명령어로 생성된 이미지를 확인한다.


2. 컨테이너 구동


   아래 명령어로 컨테이너를 구동한다. -d 옵션은 데몬 실행, -it는 입출력이 가능한 옵션, --name은 컨테이너의 이름, -p는 포트를 의미한다. 이때 포트의 37017:27017의 의미는 호스트의 37017포트를 mongo-test 컨테이너의 27017포트로 접속하겠다는 것을 의미한다.

   -v 옵션은 볼륨 마운팅에 대해 정의한다. 아래 명령어에서 -v ${pwd}/data:/mongoDB/data 는 ' : ' 을 기준으로 왼쪽이 호스트 우측이 컨테이너다. 터미널을 실행한 현재의 호스트 경로에서 data 디렉토리와 컨테이너 내부의 mongoDB/data 디렉토리를 마운팅 시키겠다는 의미이다.

docker run -it -d --name mongo-test -v ${pwd}/data:/mongoDB/data/ -v ${pwd}/log:/var/log/mongodb/ -p 37017:27017 docker-file-test:0.1

 

    브라우저를 열고 아래 주소로 접속해본다.

http://localhost:37017/

 

    아래와 같이 몽고디비의 HTTP 드라이버 포트에 접근했다고 확인할 수 있다.

 

 


3. 마운트 볼륨 작동 체크


    호스트 OS에서 data, log 디렉토리를 체크하면 아래와 같이 컨테이너 내부 저장소 디렉토리와 호스트 디렉토리가 바인딩된 것을 확인할 수 있다.


 

Comments