Dockerfile 기본 사용법 - 1

SummerToday·2024년 2월 8일

도커, 서버 기술

목록 보기
13/34
post-thumbnail

Dockerfile

  • Docker 이미지를 작성할 수 있는 기능이다.
  • Dockerfile을 통해 해당 이미지의 구성에 대해 알 수 있다.
  • 나만의 커스텀 이미지를 생성할 수 있고, 배포를 위해서도 많이 사용된다.

Dockerfile 기본 문법

  • Dockerfile은 텍스트 파일이므로, 어떤 에디터로든 작성 가능하다.
  • Dockerfile의 문법은 기본적으로 명령과 인자로 이루어져 있다.

    [명령] [인자]

  • 명령은 보통 대문자로 작성한다. (소문자도 가능하지만 가독성을 위해 대문자로 작성.)

Dockerfile 주요 명령

  • FROM
    베이스 이미지 지정 명령 (ex. FROM httpd:alpine)

  • LABEL
    작성자, 버전 정보와 같은 이미지의 설명을 작성하기 위한 명령 (LABEL version="1.0.0")

  • CMD
    docker 컨테이너가 시작할 때 실행하는 쉘 명령을 지정하는 명령.
    Run은 이미지 작성시 실행하는 명령이지만, CMD는 컨테이너를 시작할 때 실행하는 명령이다.

  • RUN
    쉘 명령을 실행하는 명령어. RUN은 이미지 작성 시 실행되며 새로운 이미지 layer를 만드는 역할.
    ex. RUN ["apt-get", "install", "nginx"]

  • ENTRYPOINT
    docker 컨테이너가 시작할 때, 실행하는 쉘 명령을 지정하는 명령. docker run 커멘드를 실행 할 때 별도 명령어를 넣을 시, 해당 명령어로 CMD 명령은 덮어씌워진다.
    하지만 ENTRYPOINT로 지정한 명령은 docker run 커멘드 실행시 별도로 작성된 명령어가 존재하더라도 덮어씌워지지 않고 실행된다.

  • EXPOSE
    docker 컨테이너 외부에 열어놓을 포트 설정 (ex. EXPORT 8080)

  • ENV
    docker 컨테이너 내부에서 사용할 환경 변수 지정 (ex. ENV PATH /usr/bin:$PATH)

  • WORKDIR
    docker 컨테이너에서의 작업 디렉토리 설정

  • COPY
    파일 또는 디렉토리를 docker 컨테이너에 복사. ADD와 달리 URL은 지정할 수 없으며, 압축 파일을 자동으로 풀어주지 않는다.


Dockerfile 참고 명령

  • ADD
    파일, 디렉토리, 특정 URL의 데이터를 docker 이미지에 추가 (ex. ADD file/var/www/html).
    추가할 파일이 tar 압축 파일일 경우, 자동으로 압축을 풀어준다.
    동일한 이름의 파일 또는 디렉토리가 이미 docker 이미지에 있을 시에는 덮어 씌우지 않는다.

  • SHELL
    쉘프로그램 지정 명령어이다. (ex. SHELL['/bin/bash','-c'])

  • ARG
    dockerfile 내에서 필요한 변수를 설정한다. docker 이미지/컨테이너에서 사용하는 환경 변수를 설정하는 ENV와 달리, dockerfile 스크립트 작성을 위해 필요한 변수를 설정하는 것이다.

  • USER
    docker 이미지 및 컨테이너에서 작업을 하는 사용자 ID를 지정한다. (USER kim)

  • ONBUILD
    생성한 이미지를 기반으로, 새로운 이미지를 생성시 실행하는 명령을 지정 (ex. ONBUILD ADD myweb.tar/var/www/html)

  • VOLUME
    이미지를 위한 볼륨 생성.

cf. # : Dockerfile 내에서 주석 작성

cf. mv [파일명] [변경할 파일명] : 파일명 변경


FROM

  • 베이스 이미지 지정 명령

    FROM alpine


Dockerfile로 이미지 작성

docker build [옵션] Dokcerfile_경로

  • 주요 옵션

    • -t / -tag
      이미지 이름 설정, '저장소(DockerHub ID)/이미지이름:태그'와 같이 작성할 수 있다.

      docker build --tag test .

      • . 은 현재 파일의 경로를 의미한다.

        cf. cd ~ : 홈으로 이동

    • -f
      이미지 빌드시 디폴트로 Dockerfile 파일명으로 된 파일을 찾아 이미지를 빌드한다. 그 외의 파일명으로 이미지를 빌드할 경우 해당 옵션을 사용해 파일명을 지정해줄 수있다.

      • -f 옵션 활용
        cp dockerfile test_dockerfile   # dockerfile의 내용을 test_dockerfile로 복사
        docker build --tag test2 -f test_dockerfile .   # 현재 폴더의 test_dockerfile로 test2 이미지 빌드
    • --pull
      FROM으로 지정된이미지는 초기 한번만 다운로드 받고, 이후에는 다운을 받지 않고 기존의 이미지를 사용한다. 해당 옵션은 --pull=true와 같이 사용하며, 이미지 생성시마다 새로 다운로드를 받도록 한다.


LABEL

  • < key > = < value > 형식으로 메타 데이터를 작성할 수 있다.

    LABEL maintainer="~"
    LABEL version="~"
    LABEL description="~"


COPY

COPY [기존 파일 경로] [새로운 파일 경로]

기존 파일의 내용을 다른 파일에 복사한다.

  • 활용

    COPY ./custom /usr/local/apach2/htdocs

    custom 파일에 있는 내용을 아파치 서버 실행시 기본 실행 경로인 /usr/local/apach2/htdocs에 붙여넣어 서버 실행시 custom 파일에 있는 내용을 실행하게 한다.

cf. docker inspect [컨테이너 / 이미지] : 컨테이너/이미지의 상세 정보 확인하기.


CMD

다음과 같이 세가지 형태로 작성할 수 있다.

  1. 명령어, 인자를 리스트 처럼 작성하는 형태 (Docker 추천)

    CMD ["executable", "param1", "param2", ...]

    ex. CMD ["/bin/sh", "-c", "echo", "Hello"]
    -> bin 디렉토리에 있는 sh(기본 쉘 프로그램)을 실행 하되, 쉘 명령을 터미널상에서 받지 않고 해당 인자들("echo", "Hello")을 바로 쉘 상에서 실행 시킨다. (-c 옵션)

    cf. 인자들은 쌍따옴표로 적어주어야 한다.

    cf. echo : 인자의 내용들을 출력. 또한 echo의 실행 파일은 bin내에 존재하여 /bin/echo와 같이 사용할 수 있다.

  2. ENTRYPOINT 명령어에 인자를 리스트처럼 작성하여 넘겨주는 형태

    CMD ["param1", "param2", ...]

  3. 쉘 명령처럼 작성하는 형태

    CMD [command] [param1] [param2] ...

    CMD는 하나의 Dockerfile에서 한가지만 설정되며, 만약 CMD 설정이 여러개일 경우, 맨 마지막에 설정된 CMD설정만 적용된다.

  • Dockerfile 작성 예시

    FROM httpd:alpine
    LABEL maintainer="qlql7748@gmail.com"
    LABEL version="1.0.0"
    LABEL description="A test docker image to understand Docker"

    COPY ./2021_DEV /usr/local/apachweb2/htdocs

    CMD ["/bin/sh", "-c", "httpd-foreground"]

    • 이미지 빌드

      docker build --tag [생성될 이미지 이름]

    • 컨테이너 생성 (백그라운드 실행 및 포트 오픈)

      docker run -d -p 9999:80 --name [컨테이너 이름] --rm [빌드한 이미지 이름]


    • 참고 Docker 명령

      • 컨테이너 에러 또는 출력 결과 확인하기

        docker logs [컨테이너ID/컨테이너 이름]

      • 컨테이너 즉시 중지하기

        docker kill [컨테이너ID/컨테이너 이름]

        docker stop은 현재 컨테이너가 실행중인 단계 까지는 기다린 후 중지한다.

      • CMD 명령 덮어씌우기

        ex. docker run -dit -p 9999:80 --name [컨테이너 이름] --rm
        [빌드한 이미지 이름] /bin/sh -c httpd-foreground

        • 컨테이너와 이미지 조사하기

          docker inspect [컨테이너 이름/이미지 이름]




해당 글은 다음 강의의 내용을 참고한 글임을 밝힙니다. 자세한 내용은 다음 강의에서 확인해볼 수 있습니다. 인프런, 잔재미 코딩, ⌜풀스택을 위한 도커와 최신 서버 기술(리눅스, nginx, AWS, HTTPS, flask 배포) [풀스택 Part3]⌟
profile
블로그 이관했습니다.

0개의 댓글