안경잡이개발자

728x90
반응형

도커파일(Dockerfile)을 이용해 nginx 웹 서버 도커 이미지 만들어보기

나동빈


  지난 시간에는 윈도우(Windows) 운영체제에서 도커(Docker)와 특정한 폴더를 공유하는 방법에 대해 알아보는 시간을 가져보았습니다. 이후에 파이썬을 이용해 공유된 폴더의 특정 파이썬 스크립트(Python Script)를 실행하는 것까지 해보았습니다. 다만, 지금까지 이용한 헬로우 월드(Hello World) 이미지나, 파이썬(Python) 이미지 등은 이미 다른 사람이 만들어 놓은 이미지(Image)입니다.


  그렇다면 우리가 직접 도커 이미지(Image)를 만들고자 한다면 어떻게 할 수 있을까요? 그 때 사용할 수 있는 것이 바로 도커파일(Dockerfile)입니다. 도커 파일의 이름은 'Dockerfile'로 만들며, 당장 도커 파일을 만들어보면서 사용 방법을 익혀 보겠습니다.



cd (도커 파일 경로): 도커 파일을 만들 경로로 이동합니다.

vi Dockerfile: 도커 파일을 생성해 작성합니다.


  사실 도커 파일은 그냥 윈도우에서 메모장 등을 실행해서 작성할 수도 있는데, 이왕이면 위와 같이 vi 에디터 같은 리눅스 전용 도구에 익숙해지도록 하세요. (이미 리눅스에 매우 익숙하신 분이라면 편하신 대로 작성하셔도 됩니다.)



FROM ubuntu:14.04 #기반으로 할 이미지를 설정합니다.

MAINTAINER Dongbin Na "ndb796@naver.com" # 작성자의 정보를 기입합니다.


RUN apt-get update # RUN을 이용해 쉘 스크립트를 실행합니다.

RUN apt-get install -y nginx # nginx를 설치합니다.


WORKDIR /etc/nginx # 이후의 CMD 명령어가 실행될 경로를 찾습니다.


CMD ["nginx", "-g", "daemon off;"] # nginx를 백그라운드에서 돌아가도록 실행합니다.


EXPOSE 80 # 80번 웹 서버 포트를 열어 웹 서버에 정상적으로 접근할 수 있도록 합니다.


  위와 같은 명령어를 입력하면 결과적으로 ubuntu 이미지에 nginx가 포함되는 방식으로 동작하게 됩니다. 리눅스 명령어에서 apt-get 명령어를 사용하면 그 리눅스 안에 설치가 이루어집니다. 이러한 형태는 이미지 위에 이미지가 쌓이는 방식을 적나라하게 보여줍니다. FROM 명령어로 이미 존재하는 다른 이미지 위에 추가적으로 어떠한 모듈을 설치하는 과정임을 이해하시면 됩니다. 레이어(Layer)가 쌓이는 겁니다.


  그래서 특정한 이미지를 만들 때는 베이스로 삼고 있는 이미지가 우수한 이미지여야 한다는 가정이 있는 겁니다.



docker build --tag myubuntu:0.1 .


  위 명령어는 특정한 태그(Tag) 이름으로 이미지를 빌드(Build)하는 명령어입니다. 저는 myubuntu라는 이름으로 이미지를 만들어 보았습니다. 여기서 주의할 점은 빌드 명령어의 마지막에는 온점(.)을 찍어주어야 합니다. 원래 온점 대신 URL 등 다양한 내용이 들어갈 수 있는데, 단순히 온점만 찍어서 명령어를 마무리해주는 겁니다.



  이후에 위와 같이 이미지 목록을 확인해보면 베이스 이미지가 되는 우분투(Ubuntu)가 먼저 설치되고, 그것을 기반으로 하여 myubuntu라는 이름의 이미지가 만들어진 것을 알 수 있습니다. 보면 이미지의 크기가 188MB -> 230MB로 겹겹히 쌓인 것을 알 수 있습니다. 다양한 기능이 추가될 수록 이미지가 더 커지는 겁니다. 근데, 커져봤자 200MB 정도인 걸 보면 역시 갓도커라는 생각이 드는 군요.



docker run --name (컨테이너 이름) -d -p 80:80 (이미지 이름):(버전 정보)


  위 명령어를 응용해서 우리가 방금 만든 nginx 웹 서버 전용 우분투를 데몬(Daemon)으로 실행해보았습니다. 데몬 명령어는 -d 옵션으로 줄 수 있으며 웹 서버나 데이터베이스 서버와 같이 계속해서 실행이 되고 있어야 하는 서비스에 주로 적용합니다. 버전 정보는 우리가 만들 때 적어 주었던 0.1 버전으로 적어주었습니다. 또한 -p 옵션을 이용해 호스트 서버의 80번 포트와 도커 서버의 80번 포트를 연결해주었습니다.


  이후에 docker ps 명령어도 넣어보니까 위 그림과 같이 새로운 컨테이너가 돌아가고 있으며 포트 번호가 0.0.0.0:80->80/tcp로 매핑이 되어있는 것을 알 수 있습니다. 여기에서 0.0.0.0은 로컬(Local)이라고 이해하시면 됩니다.



  이제 돌아가고 있는 웹 서버에 접속하기 위해 docker-machine ip 명령어를 입력해 아이피 주소를 확인해봅시다. 아이피 주소는 도커 머신의 기본 주소인 192.168.99.100이군요.



  이제 바로 브라우저를 실행하여 192.168.99.100:80으로 접속합니다. 그럼 바로 위와 같이 웹 서버에 접속이 된 것을 알 수 있습니다. 이렇게 아주 간단하게 직접 우분투 이미지에 nginx를 설치한 새로운 '이미지'를 생성하는 방식으로 웹 서버를 띄워보았습니다.



  이렇게 웹 서버를 만들게 되면 데몬으로 계속 돌아가기 때문에 컨테이너를 바로 지우거나 할 수 없습니다. 그래서 먼저 컨테이너의 동작을 중지시키고, 컨테이너를 제거한 뒤에 비로소 이미지 파일까지 안정적으로 지울 수 있습니다.


docker stop (컨테이너 ID): 현재 작동 중인 컨테이너를 정지(Stop) 시킵니다.

docker rmi (이미지 ID): 현재 도커 머신에 저장된 특정한 이미지를 삭제합니다.


  저는 방금 만들어보았던 myubuntu 이미지를 제거해보았습니다. 그랬더니 Deleted가 여러 번 수행되는 것을 알 수 있습니다. 정확히 일치하지는 않지만 제거되는 횟수는 일반적으로 도커 파일(Docker File)을 작성할 때 사용했던 명령어 라인의 수와 비례합니다.

728x90
반응형