오늘의 인기 글
최근 글
최근 댓글
Today
Total
11-22 00:08
관리 메뉴

우노

[Docker] Dockerfile 개념 및 작성법 본문

DevOps/Docker

[Docker] Dockerfile 개념 및 작성법

운호(Noah) 2020. 10. 6. 15:49

Dockerfile

  • Dockerfile은 DockerImage를 생성하기 위한 스크립트(설정파일)이다.
  • 여러가지 명령어를 토대로 Dockerfile을 작성한 후 빌드하면
  • Docker는 Dockerfile에 나열된 명령문을 차례대로 수행하며 DockerImage를 생성해준다.
  • Dockerfile을 읽을 줄 안다는 것은 해당 이미지가 어떻게 구성되어 있는지 알 수 있다는 의미이다.

Dockerfile의 장점

  • (1) 이미지가 어떻게 만들어졌는지를 기록한다.

    • 보통 사람들은 완성된 이미지를 가져다 쓰기 때문에 이미지가 어떻게 만들어졌는지에 대해서는 알 필요가 없다.
    • 그러나 개발자의 경우라면 조금 다르다. 어떠한 애플리케이션을 담고 있는 이미지가 설치 되기 위한 과정은 어떠한지, 중간에 어떠한 과정을 수정해야 하는지 등을 알아야 하는 경우가 있다.
    • 예를 들어 raw한 상태의 우분투 이미지에서 자신이 원하는 애플리케이션을 담은 이미지를 만들어내기까지, 그 과정들을 기록하고 수정하며 바꿔나갈 수 있다는 것이다.
    • 이는 Dockerfile이 자동화된 스크립트 형태이기 때문이다.
  • (2) 배포에 용이하다.

    • 어떠한 이미지를 배포할 때, 몇 기가씩이나 되는 이미지 파일 자체를 배포하기보다는 그 이미지를 만들 수 있는 스크립트인 Dockerfile만을 배포한다면 매우 편리할 것이다.
    • 사용자는 그 스크립트를 실행시키기만 하면 스스로가 그 Dockerfile에 해당하는 이미지를 얻을 수 있기 때문이다.
    • 실제로 Docker Hub에 가면, Dockerfile로 이미지를 배포하고 있는 사람들을 심심찮게 볼 수 있다. 물론 이미지로 배포하는 사람도 있지만.
  • (3) 컨테이너(이미지)가 특정 행동을 수행하도록 한다.

    • 컨테이너 환경에서 애플리케이션을 개발하다 보면, 특정 행동을 취하도록 하는 컨테이너를(이미지를) 만들어야 할 때가 있다.
    • 이는 사실 말로서 설명하기는 좀 어렵고, 실제 개발을 하다보면 '아, 이거 Dockerfile 쓰면 좀 간단해 지겠구나...' 라는 생각이 머릿속에서 불현듯 번개처럼 스칠때가 있다.

Dockerfile 작성 및 명령어

  • Dockerfile을 작성 할 땐 실제 파일의 이름을 'Dockerfile'로 해야합니다.

  • ubuntu에 아파치 서버를 설치하는 Dockerfile을 작성해보도록 하겠습니다.

  • Dockerfile을 담을 디렉토리를 생성 한 후 Dockerfile을 생성합니다.

      mkdir apache-dockerfile && cd apache-dockerfile
      vi Dockerfile
  • Dockerfile의 내용은 아래와 같습니다.

      # server image는 ubunutu 18.04를 사용
      FROM ubuntu:18.04 
      # Dockerfile 작성자
      MAINTAINER Wimes <yms04089@kookmin.ac.kr> 
    
      # image가 올라갔을 때 수행되는 명령어들
      # -y 옵션을 넣어서 무조건 설치가 가능하도록 한다.
      RUN \
          apt-get update && \
          apt-get install -y apache2
    
      # apache가 기본적으로 80포트를 사용하기 때문에 expose를 이용해 apache server로 접근이 가능하도록 한다.
      EXPOSE 80 
    
      # 컨테이너가 생성 된 이후에 내부의 아파치 서버는 항상 실행중인 상태로 만들어준다.
      # apachectl을 foreground(즉, deamon)상태로 돌아가도록 한다.
      CMD ["apachectl", "-D", "FOREGROUND"]
    • FROM : 베이스 이미지
      • 어느 이미지에서 시작할건지를 의미한다.
    • MAINTAINER : 이미지를 생성한 개발자의 정보 (1.13.0 이후 사용 X)
    • LABEL : 이미지에 메타데이터를 추가 (key-value 형태)
    • RUN : 새로운 레이어에서 명령어를 실행하고, 새로운 이미지를 생성한다.
      • RUN 명령을 실행할 때 마다 레이어가 생성되고 캐시된다.
      • 따라서 RUN 명령을 따로 실행하면 apt-get update는 다시 실행되지 않아서 최신 패키지를 설치할 수 없다.
      • 위 처럼 RUN 명령 하나에 apt-get update와 install을 함께 실행 해주자.
    • WORKDIR : 작업 디렉토리를 지정한다. 해당 디렉토리가 없으면 새로 생성한다.
      • 작업 디렉토리를 지정하면 그 이후 명령어는 해당 디렉토리를 기준으로 동작한다.
      • cd 명령어와 동일하다.
    • EXPOSE : Dockerfile의 빌드로 생성된 이미지에서 열어줄 포트를 의미한다.
      • 호스트 머신과 컨테이너의 포트 매핑시에 사용된다.
      • 컨테이너 생성 시 -p 옵션의 컨테이너 포트 값으로 EXPOSE 값을 적어야한다.
    • USER : 이미지를 어떤 계정에서 실행 하는지 지정
      • 기본적으로 root에서 해준다.
    • COPY / ADD : build 명령 중간에 호스트의 파일 또는 폴더를 이미지에 가져오는 것
      • ADD 명령문은 좀 더 파워풀한 COPY 명령문이라고 생각할 수 있다.
      • ADD 명령문은 일반 파일 뿐만 아니라 압축 파일이나 네트워크 상의 파일도 사용할 수 있다.
      • 이렇게 특수한 파일을 다루는 게 아니라면 COPY 명령문을 사용하는 것이 권장된다.
    • ENV : 이미지에서 사용할 환경 변수 값을 지정한다.
      • path 등
    • CMD / ENTRYPOINT : 컨테이너를 생성 및 실행 할 때 실행할 명령어
      • 보통 컨테이너 내부에서 항상 돌아가야하는 서버를 띄울 때 사용한다.
      • CMD
        • 컨테이너를 생성할 때만 실행됩니다. (docker run)
        • 컨테이너 생성 시, 추가적인 명령어에 따라 설정한 명령어를 수정할 수 있습니다.
      • ENTRYPOINT
        • 컨테이너를 시작할 때마다 실행됩니다. (docker start)
        • 컨테이너 시작 시, 추가적인 명령어 존재 여부와 상관 없이 무조건 실행됩니다.
      • 명령어 형식
        • CMD ["<커맨드>", "<파라미터1>", "<파라미터2>"]
        • CMD <커맨드> <파라미터1> <파라미터2>
        • ENTRYPOINT ["<커맨드>", "<파라미터1>", "<파라미터2>"]
        • ENTRYPOINT <커맨드> <파라미터1> <파라미터2>
      • 참고

생성한 Dockerfile을 Image로 빌드

  • 이미지 빌드 명령어

      docker build -t [이미지 이름:이미지 버전] [Dockerfile의 경로]
      docker build -t apache-image .
  • 생성된 이미지 확인

      docker images

웹에 띄울 html 파일 생성

  • 보통 웹으로 띄울 html 파일을 아파치 서버에 추가하고 싶을 땐

  • Dockerfile의 ADD / COPY를 통해 호스트의 파일을 아파치 서버 옮기는 명령어를 작성 후 빌드합니다.

  • 하지만 이렇게 하면 호스트의 html 파일과 아파치 서버의 html 파일이 동기화 되어 있지 않기 때문에 매번 build를 해줘야합니다.

  • 우리는 그럴 시간이 없습니다.

  • 따라서 도커 볼륨을 사용해 호스트의 html 파일을 만들어놓고, 도커 컨테이너에서 그 파일에 접근해서 사용하는 방법으로 동기화 할 것입니다.

  • 우선 호스트에 index.html 파일을 생성 및 수정합니다.

      cd ~
      mkdir html && cd html
      vi index.html
      Hello world

Image로 Container를 생성

  • 이제 컨테이너 생성 시 도커 볼륨을 통해 host와 도커 컨테이너의 html 폴더를 동기화 하겠습니다.

      docker run --name apache-container -d -p 80:80 -v ~/html/:/var/www/html apache-image
    • --name : 컨테이너 이름
    • -d : 백그라운드모드로 실행
    • -p : [호스트포트][컨테이너포트] 포트 연결
    • -v : 로컬과 컨테이너 파일 연동

접속 확인

  • Public DNS를 80번 포트로 접속해 접속을 확인합니다.
Comments