dockerfile 문법 + 작성법

김성준·2022년 2월 23일
0

Docker

목록 보기
2/6

dockerfile이란?

  • docker 이미지를 작성할 수 있는 기능
  • 이미지는 스크립트를 기반으로 생성되는데, dockerfile은 이 스크립트가 dockerfile문법으로 이루어져 있다.
  • 이 dockerfile을 활용하여 나만의 이미지를 만들수 있고, 배포를 위해서 실제로 많이 사용하는 기술이다.

dockerfile 기본문법

  • dockerfile은 텍스트 파일 형식이기 때문에, 각자 사용하는 어떤 에디터로도 작성 할 수 있다.
  • dockerfile은 간단히
명령 인수

로 되어 있다. 명령은 소문자로 작성해도 괜찮지만, 통상적으로 개발자가 구별하기 쉽게 하기 위해서 대문자로 작성을 한다.

dockefile 주요명령

FROM

  • 베이스 이미지 지정 명령
  • Dockerfile에서 반드시 있어야 하는 명령어이다.
  • 도커는 계속해서 층으로 여러겹 이미지를 차곡차곡 쌓는 개념이다.
    베이스 이미지란, 그 층 중에서 가장 밑바닥의, 기본이 되는 이미지이고, FROM이 이 이미지를 지정해준다.

LABEL

  • LABEL은 = 형식으로 메타 데이터를 넣을 수 있는 기능이다.

  • 보통 저자, 버전, 설명, 작성일자 등을 각각 key로 정하고, 그 오른쪽에 설명값을 넣는다.

    CMD

  • 해당 dockerfile로 만든 이미지를 기반으로 컨테이너를 만들었을 때, 해당 컨테이너가 실행될때 가장 먼저 실행될 프로그램을 기술

  • CMD를 기술하는 방식은 크게 세가지이다.

    • (추천) 명령어, 인자를 리스트처럼 작성하는 형태
      	```
      	예) 
      		CMD ["bin/sh", "-c", "echo", "Hello"]
      	-> sh 프로그램에서 명령을 실행하되(bin/sh), 쉘 명령을 터미널 상에서 받지 않고, 인자로 받는다(-c).
      	"echo Hello" 라는 명령어를.
      	-> 만약 이렇게 쓰지 않고 단순히 CMD["echo"]라고 쓸 경우, 쉘에서 echo 명령이 실행되는 것이 아니라, 직접 해당 명령이 실행된다.
      	따라서, 정확하게 쉘(bin/sh)까지 지정을 해서 명령을 실행하는 것이 좋다.
      		->반드시 홑따옴표가 아닌, 쌍따옴표를 적어야 한다.
    • ENTRYPOINT 명령어에 인자를 리스트처럼 작성하여 넘겨주는 형태.
      (작성하는 방식은 위와 동일하지만, 실행되는 방식은 상이하다.)
    • 쉘 명령처럼 작성하는 형태
    CMD <command1> <param1> <param2>...
  • CMD는 하나의 Dockerfile에서 한 가지만 설정되며, 만약 CMD 설정이 여러개일 경우, 맨 마지막에 설정된 CMD 설정만 적용됨.

    RUN

  • 도커 명령어의 run(이미지로 컨테이너 만들고 실행할때 쓰는 그거)와 다른 명령어이다.

  • 이 항목의 기능을 알기 위해서는 docker 이미지의 구성방식을 알아야 한다.

    • docker는 이미지를 생성 할 때, 하나의 layer만 쓰는 것이 아니라, 여러 단계의 layer를 층층이 쌓아 작성한다.

    • RUN 명령은 이미지 생성시, 일종의 layer를 만들 수 있는 단계로, 보통 베이스 이미지에 패키지(프로그램)을 추가로 설치하여 새로운 이미지를 만들 때 사용한다.(이렇게 한다면 특정 단계를 변경 할 때, 전체 이미지를 다시 다운로드 받는 번거로움을 해결할 수 있다.)
      예)

    ENTRYPOINT

  • 만약 Dockerfile로 이미지를 만든 다음 컨테이너를 docker run으로 생성/ 실행하면서 명령문을 같이 적으며 실행한다면, 기존 이미지에 있던 CMD 명령이 터미널 명령으로 덮어씌워진다.
    하지만, 이미지에 Entrypoint 항목이 있다면, docker run으로 명령을 실행 하더라도 Entrypoint의 명령에 영향을 끼치지 못하고, Entrypoint의 명령 뒤에 쭉 인자로 나열을 하게 된다.

  • 예를 들어,
    (저는 실수해서 bin/bash라고 적었는데, bin/sh가 맞습니다. alpine에는 bash 안써요 ㅎ;;)
    다음과 같이 Entrypoint에 "bin/bash"가 있는 Dockerfile을 만들었다고 가정하자.
    이 도커파일로 myweb1이라는 이미지를 생성하자.
    생성한 이미지로 httpweb1이라는 컨테이너를 /bin/sh -c http-foreground라는 명령어와 함께 생성한다.

    docker inspect 명령어로 생성한 컨테이너를 살펴보면

    ENTRYPOINT의 명령이 그대로 남아있는 것을 볼 수 있다.
    CMD가 ENTRYPOINT의 뒤에 인자처럼 붙게 되므로, 다음 컨테이너는

  1. /bin/bash
  2. /bin/sh
  3. -c
  4. httpd-foreground
    의 순서대로 실행이 될 것이다.

    EXPOSE

  • docker 컨테이너의 특정 포트를 외부에 오픈하는 설정.
  • docker run -p옵션과 유사하다. 차이점은, -p옵션은 컨테이너의 특정 포트를 외부에 오픈하고, 해당 포트를 호스트 PC의 특정 포트와 매핑시키는 것까지 알아서 해주지만, EXPOSE는 걍 단순히 포트를 열어주기만 한다는 것이다.
    결국, 도커파일에 EXPOSE로 포트를 열어주었더라도, docker run을 할 때, p옵션을 쓰긴 쓰게 된다.
docker run -P -d myweb

↑과 같이, -p를 대문자로 써준다면, EXPOSE로 열어준 포트로 호스트 PC의 랜덤 포트가 매핑된다.(따라서, 할때만다 달라진다.)

ENV

  • 컨테이너 내의 환경변수 설정
  • 설정한 환경변수는 RUN, CMD, ENTRYPOINT 명령에도 적용된다.
ENV MYSQL_ROOT_PASSWORD=password # mysql 슈퍼관리자인 root ID에 대한 password란에 패스워드 설정하기
ENV MYSQL_DATABASE=dbname # DB 지정해주기
ENV MYSQL_USER=user
ENV MYSQL_PASSWORD=pw #mysql 추가 사용자 ID, 패스워드 설정

더 구체적인 설정사항은 관련 이미지의 도커 허브 사용 설명서를 참고하자.

WORKDIR

  • 이미지 내에서 특정 폴더로 이동하기 위해서 쓰는 명령
    • RUN, CMD, ENTRYPOINT 명령이 실행될 디렉토리 설정
      예)

작성한 dockerfile로 이미지 만들기

docker build --tag <짓고싶은 이미지명> .
docker build --tag <짓고싶은 이미지명> -f <Dockerfile명> .

둘다 Dockerfile이 있는 폴더내에서 이미지를 빌드한다는 조건이다.
단, Dockerfile명이 그냥 Dockerfile이라면 -f 옵션이 없어도 되지만, 그 이외의 이름일 경우에는 -f 옵션으로 파일명을 명시해 줄 수 있다.

그 이외의 명령

docker logs

docker logs <컨테이너 ID 혹은 이름>

log란? http 아파치 웹서버에서 접속기록이나 요청기록을 기록해 놓기 위해서 특정 log라는 파일에 저장해 놓는 기록.

docker kill

docker kill <컨테이너ID 또는 이름>

docker stop은 즉시 컨테이너를 중단하지 않고, 현재 실행중인 단계까지는 기다린 후에 중지를 하지만, docker kill은 즉시 컨테이너를 중지한다.
-> 따라서 조금 더 빨리 중단을 할 수 있다.

docker insepct

docker inspect <이미지명>

Lables, Cmd, entrytable과 같은 이미지 설정을 확인해 볼 수 있다.

0개의 댓글