Docker가 먼가요? - 5. Docker Image 만들기 2

1. .dockerignore

  • docker 이미지 빌드시 무시할 파일들을 입력합니다.
  • .gitignore 와 유사합니다.

2. FROM

  • 어떤 이미지를 기반으로 생성할지 기록합니다. 부모이미지가 됩니다.
  • 이미지 이름만 입력할 수도, 태그와 함께 입력할 수도 있습니다.
  • FROM은 항상 설정해야하고, 맨 첫 줄에 설정해야합니다.
  • FROM에 설정한 이미지가 로컬에 있으면 로컬을 우선 적용하고, 없으면 Docker Hub에서 받아 옵니다.
  • FROM은 여러개 설정할 수 있습니다.
FROM ubuntu
FROM ubuntu:14.07

3. MAINTAINER

  • MAINTAINER는 Dockerfile 작성자를 입력합니다. 생략 가능
MAINTAINER Suwoni <[email protected]>

4. WORKDIR

  • WORKDIR은 RUN과 CMD등의 Dockerfile에 사용되는 이미지 내부에서 실행할 명령어의 실행 디렉터리를 설정합니다.
WORKDIR /app/src

5. ADD

  • ADD는 파일을 이미지에 추가
  • 압축파일인 경우 해제 후 추가(tar.gz의 경우 gz만 해제하고 추가합니다.)
  • 인터넷 경로를 입력할 수 있습니다.
ADD test.sh /entrypoint.sh
ADD . /src-dir
ADD test.zip /test
ADD http://blog.news.com/a.txt /b.txt

6. COPY

  • ADD 와 비슷하게 파일을 이미지에 추가
  • 압축파일을 해제 하지 않음
  • URL 사용할 수 없음

7. RUN

  • FROM에서 설정한 이미지 위에서 스크립트 혹은 명령을 실행
  • 쉘로 실행하기(이미지에 /bin/sh 실행파일이 있는 경우)
RUN apt-get install -y  nginx
RUN git clone https://github.com/docker/docker.git
  • 쉘없이 바로 실행하기(이미지에 /bin/sh 실행파일이 없는 경우)
RUN ["apt-get", "install", "-y", "nginx"]
RUN ["git", "clone", "https://github.com/docker/docker.git"]

8. CMD

  • 이미지가 컨테이너로 실행이 시작될 때 실행(docker run 또는 docker start 시)
  • Dockerfile에서 한번 만 사용할 수 있음

  • 쉘로 실행하기(이미지에 /bin/sh 실행파일이 있는 경우)
CMD git clone https://github.com/docker/docker.git
  • 쉘없이 바로 실행하기(이미지에 /bin/sh 실행파일이 없는 경우)
CMD ["git", "clone", "https://github.com/docker/docker.git"]

9. ENTRYPOINT

  • CMD 와 마찬가지로 이미지가 컨테이너로 실행이 시작될 때 실행(docker run 또는 docker start 시)
  • Dockerfile에서 한번 만 사용할 수 있음
  • 실행 형식은 CMD와 동일

10. ENTRYPOINT와 CMD가 동시에 사용되는 경우

  • CMD는 ENTRYPOINT에 매개 변수만 전달하는 역할을 합니다.
ENTRYPOINT ["echo"]
CMD ["hello docker"]

11. CMD와 ENTRYPOINT 차이

  • CMD는 docker run 실행 시 바로 명령어를 입력하는 경우 Dockerfile에 CMD는 무시됩니다.
FROM ubuntu
CMD ["echo", "Hello, Docker"]
$ docker run ubuntuimage echo world
world
  • ENTRYPOINT의 경우 실행시 --entrypoint 옵션을 줄 경우 무시됩니다.
$ docker run --entrypoint="cat" 이미지명

12. EXPOSE

  • 노출시킬 port를 설정 docker run 명령어의 --expose옵션과 동일
  • 한꺼번에 작성 또는 여러줄 작성 가능
EXPOSE 80 443 21
EXPOSE 80
EXPOSE 443
EXPOSE 21

13. ENV

  • 환경변수 설정
  • 환경변수는 RUN, CMD, ENTRYPOINT에서도 적용가능
ENV ENV_VARIABLE aaaa
CMD echo $ENV_VARIABLE
  • ENV 에서 설정한 값을 docker run 시에 변경할 수 있습니다.
$ docker run -e ENV_VARIABLE=bbbb 이미지명
bbbb
  1. VOLUME
  • 디렉터리 내용을 컨테이너에 저장하지 않고 호스트에 저장하도록 설정
VOLUME /data
VOLUME ["data", "/var/log/hello"]
  • 위 처럼 설정할 경우 호스트(이미지를 실행한 os환경)에서 /var/lib/docker/volumes 아래의 임의의 난수로 저장된 디렉토리 안에 데이터가 들어가므로 좋은 방법이 아니다.

  • docker run -v <호스트디렉토리>:<컨테이너디렉토리> 형식으로 이미지 내부디렉토리를 호스트 디렉토리로 연결할 수 있다.

  1. ONBUILD
  • 생성한 이미지를 기반으로 다른 이미지가 생성될 때 명령을 실행