[Docker] Dockerfile 기본 명령어에 대해 알아보자

뚜비·2023년 8월 12일
0

Docker

목록 보기
1/1

초보를 위한 도커 안내서 - 이미지 만들고 배포하기
가장 빨리 만나는 Docker
Dockerfile reference
를 참고하였습니다.



FROM

FROM <이미지 이름>:<태그>
  • 어떤 Base 이미지를 기반으로 할지 설정(반드시 설정해야 함)
  • FROM에서 설정한 이미지가 로컬에 있으면 해당 이미지를 사용하고 없다면 Docker hub에서 확인
  • 태그 값은 latest(기본값)보다 구체적인 버전을 지정하는 것이 좋다.

    🤔 왜 항상 BASE 이미지를 설정해줘야 하는 걸까?
    Docker 이미지는 항상 기존에 만들어진 이미지를 기반으로 생성하기 때문, 즉 Docker는 이미지를 만들기 위해 컨테이너의 상태를 그대로 이미지로 저장하는 방법을 사용한다.


MAINTAINER

MAINTAINER <name> <email>
  • 이미지를 생성한 사람의 정보를 설정
  • 이름 또는 이메일 정보를 적는다.
  • 생략가능

RUN

RUN <command>
RUN ["executable", "param1", "param2"]
  • FROM에서 설정한 이미지 위에서 스크립트 혹은 명령을 실행함
  • 여기서 RUN으로 실행한 결과가 새 이미지로 생성되고, 실행 내역은 이미지의 히스토리에 기록됨

🤔 RUN 명령 실행 방식이 왜 2가지인가?
1. 셸(/bin/sh)로 명령 실행

RUN apt-get install -y nginx
RUN echo "Hello Docker" > /tmp/hello
RUN curl -sSL https://golang.org/dl/go1.3.1.src.tar.gz | tar -v -C /usr/local -xz
  • RUN <명령> 형식
  • 셸 스크립트 구문을 사용할 수 있음
  • FROM으로 설정한 이미지에 포함된 /bin/sh 실행 파일을 사용하게 되며 /bin/sh 실행파일이 없으면 사용할 수 없음


    2. 셸 없이 바로 실행
RUN ["apt-get", "install", "-y", "nginx"]
RUN ["/usr/local/bin/hello", "--help"]
  • RUN ["<실행파일>", "<매개변수1>", "<매개변수2>"] 형식
  • FROM으로 설정한 이미지의 /bin/sh 실행 파일을 사용하지 않는 방식
  • 셸 스크립트 문법이 인식되지 않으므로 셸 스크립트 문법과 관련된 문자를 그대로 실행 파일에 넘겨줄 수 있음
  • RUN으로 실행한 결과는 캐시되고 다음 빌드 때 재사용
  • 캐시된 결과를 사용하지 않으려면 docker build 명령에서 --no-cache 옵션을 사용하면 됨

CMD

#1. 셸 없이 바로 실행할 때 
CMD ["executable", "param1", "param2"]
#2. 셸로 명령 실행
CMD command param1 param2
  • 도커 컨테이너가 시작되었을 때 실행되는 스크립트 혹은 명령어(빌드할 때는 실행되지 않음)
  • docker run 명령으로 컨테이너를 생성하거나 docker start로 정지된 컨테이너를 시작할 때 실행
  • Dockerfile 내에 한 번만 사용할 수 있음

COPY

COPY <src> <dest>
  • <src> 파일 혹은 디렉토리를 이미지의 <dest>에 복사
  • 일반적으로 소스를 복하사는 데 사용

ADD

ADD <src> <dest>
  • <src> 파일 혹은 디렉토리를 이미지의 <dest>에 복사
  • 일반적으로 소스를 복하사는 데 사용
  • COPY와 유사

🤔 COPY VS ADD
1. 공통점
: <src>는 Context 아래를 기준으로 하며, Context 바깥의 파일, 디렉터리 경로, 절대경로는 사용 못 함
: <src>파일 뿐만 아니라 디렉터리를 지정할 수 있는데, 디렉터리 지정시 디렉터리의 모든 파일을 복사
EX) 와일드 카드를 사용하여 특정 파일만 복사 가능 - ADD *.txt /root/ txt파일만 /root 디렉 내에 복사해라!
: <dest>는 항상 절대 경로로 설정해야 하며, 마지막이 /로 끝나면 디렉터리가 생성되고 파일은 그 아래로 복사
: .dockerignore 파일에 설정한 파일과 디렉토리는 제외됨


2. 차이점
: ADD는 src에 압축파일이 있는 경우 자동으로 압축을 해제하면서 복사하지만 COPY는 압축파일 그대로 복사
: ADD는 src에 파일 대신 URL을 입력할 수 있지만 COPY는 사용할 수 없음
EX) ADD http://example.com/hello.txt /home/hello/와 같이 설정시 /home/hello/hello.txt에 파일이 복사


WORKDIR

WORKDIR <path>
  • RUN, CMD, `ADD', 'COPY' 명령이 실행될 기본 디렉터리를 설정
  • 각 명령어의 현재 디렉터리는 한 줄 한 줄마다 초기화되기 때문에 다음 명령어에선 다시 위치가 초기화 됨! 따라서 같은 디렉토리에서 계속 작업하기 위해 WORKDIR을 사용

EXPOSE

EXPOSE <port> [<port>...]
  • 도커 컨테이너가 실행되었을 때 요청을 기다리고 있는(Listen) 포트를 지정
  • 즉, 호스트와 연결할 컨테이너 포트 번호를 설정한다.
    EX) EXPOSE 3000 -> docker run -p 80:3000 이미지 이름으로 외부포트 80포트에서 컨테이너 3000 포트로 접속
  • default는 TCP 프로토콜
  • 호스트와 연결만 할 뿐 외부에 노출되 않는다. 포트를 외부에 노출하려면 docker run 명령의 -p, -P 옵션을 사용해야 함

🤔 포트 포워딩?
[사진출처 : 생활코딩]

  • docker는 컨테이너를 생성하고 주체인 host 컴퓨터의 포트와 컨테이너가 가진 포트와 연결하는 역할을 한다. 즉, host 8080포트에 들어온 신호를 컨테이너에게 전달하여 컨테이너를 운영할 수 있고, 이를 포트 포워딩이라고 한다.
  • 컨테이너는 가상 IP주소를 할당 받기 때문에 외부에서 컨테이너 접근은 불가능하다. 따라서 포트 포워딩을 통해 외부와 연결 통로를 뚫어야 함.

ENV

ENV <key> <value>
  • 환경변수를 설정한다.
  • 설정한 환경 변수는 RUN, CMD 등에 적용된다.
    EX) ENV GOPATH /go


이 밖의 추가 명령어는 수정 중..

profile
SW Engineer 꿈나무 / 자의식이 있는 컴퓨터

0개의 댓글