Docker란?
- 도커는 컨테이너 기반의 오픈소스 가상화 플랫폼
- 다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해줌
- 리눅스 운영체제 위에서 동작
이미지
- 이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것
- 도커 이미지는 Docker hub에 등록하거나 Docker Registry 저장소를 직접 만들어 관리할 수 있음
- 이미지는 url 방식으로 관리하며 태그를 붙일 수 있음
레이어
- 유니온 파일 시스템을 이용하여 여러개의 레이어를 하나의 파일시스템으로 사용할 수 있게 해줌
- 이미지는 여러개의 읽기 전용 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성
- 스토리지에 따라 레이어의 개수가 127개로 제한되어 있는 경우도 있음(명령어 최적화 필요)
Dockerfile
- 이미지를 만들기 위한 파일
DSL
(Domain-specific language) 언어를 이용
- 도커 레지스트리 등을 통해 배포할 때 이미지 대신 Dockerfile을 배포할 수 있음
1.기본 명령어
FROM
FROM <image>:<tag>
FROM ubuntu:16.04
- 베이스 이미지를 지정
- tag는 될 수 있으면 latest(기본값)보다 구체적인 버전(16.04등)을 지정하는 것이 좋음
MAINTAINER
MAINTAINER <name>
MAINTAINER subicura@subicura.com
- Dockerfile을 관리하는 사람의 이름 또는 이메일 정보
LABEL
LABEL <key>=<value>
- 이미지에 메타데이터를 추가할 때
- 키:값의 형태로 저장
- 추가된 메타데이터는
docker inspect
명령어로 확인
COPY
COPY <src>... <dest>
COPY . /usr/src/app
- 파일이나 디렉토리를 이미지로 복사
- 일반적으로 소스를 복사하는데 사용
ADD
ADD <src>... <dest>
ADD . /usr/src/app
- COPY와 유사
- src에 파일 대신 URL을 입력할 수 있고 src에 압축 파일을 입력하는 경우 자동으로 압축을 해제하면서 복사
RUN
RUN <command>
RUN ["executable", "param1", "param2"]
RUN bundle install
- 가장 많이 사용하는 구문(실행 명령어)
- 내부적으로
/bin/sh -c
뒤에 명령어를 실행하는 방식
CMD
CMD ["executable","param1","param2"]
CMD command param1 param2
CMD bundle exec ruby app.rb
- 컨테이너가 실행되었을 때 실행되는 명령어(빌드할 때는 실행X)
- 여러 개의 CMD가 존재할 경우 가장 마지막 CMD만 실행
- 한꺼번에 여러 개의 프로그램을 실행하고 싶은 경우에는
run.sh
파일을 작성하여 데몬으로 실행하거나 supervisord
나 forego
와 같은 여러 개의 프로그램을 실행하는 프로그램을 사용
WORKDIR
WORKDIR /path/to/workdir
- RUN, CMD, ADD, COPY등이 이루어질 기본 디렉토리를 설정
- 각 명령어의 현재 디렉토리는 매번 초기화되기 때문에
RUN cd /path
를 하더라도 다음 명령어에선 다시 위치가 초기화
EXPOSE
EXPOSE <port> [<port>...]
EXPOSE 4567
- 컨테이너가 실행되었을 때 요청을 기다리고 있는(Listen) 포트를 지정
- docker run 시, -P 옵션을 지정하면 이미지에 설정된 EXPOSE의 모든 포트를 호스트에 연결하도록 설정
VOLUME
VOLUME ["/data"]
- 컨테이너 외부에 파일시스템을 마운트 할 때 사용
ENV
ENV <key> <value>
ENV <key>=<value> ...
ENV DB_URL mysql
- 컨테이너에서 사용할 환경변수를 지정함
- run 명령어에서 -e 옵션을 사용할 경우 기존의 값은 overwrite
ARG
ARG <key>
ARG <key>=<value> ...
docker build --build-arg key=8080
CMD start.sh -h 127.0.0.1 -p ${key}
- build 명령어를 실행할 때 추가로 입력을 받아 Dockerfile 내에서 사용될 변수값을 설정
USER
USER <user_name>
- USER로 컨테이너 내부에서 사용될 사용자 계정의 이름을 설정하면 그 아래 명령어는 해당 사용자의 권한으로 실행
- 일반적으로 RUN으로 사용자의 그룹과 계정을 생성한 뒤 사용
- 루트 권한이 필요하지 않다면 USER를 사용하는 것을 권장
STOPSIGNAL
STOPSIGNAL SIGKIL
- 컨테이너가 정지될 때 사용될 시스템 콜의 종류 지정
HEALTHCHECK
HEALTHCHECK --interval=1m --timeout=3s --retries=3 {명령어}
- 애플리케이션의 상태를 체크하도록 하는 설정
- 상태체크에 실패하면 해당 컨테이너는 unhealthy 상태가 됨
SHELL
SHELL [경로]
ENTRYPOINT
ENTRYPOINT ["명령어"]
CMD
명령어와 유사하지만 커멘드를 인자로 받아 사용할 수 있다는 점에서 차이가 있음
ENTRYPOINT
가 설정되면 맨 마지막에 입력된 cmd를 인자로 받아 명령어를 출력
CMD
나 ENTRYPOINT
둘중 하나는 무조건 설정해야함
- 일반적으로 스크립트 파일을 인자로 입력해 컨테이너 실행 시, 해당 스크립트 파일을 실행하도록 함
2.Dockerfile 빌드
docker build -t {이미지명} {dockerfile 저장경로}
- -t 옵션을 사용하지 않으면 16진수 형태의 이름으로 이미지 저장
빌드과정
- 이미지 빌드를 시작하면 도커는 가장 먼저 빌드 컨텍스트를 읽음
- 빌드 컨텍스트는 이미지를 생성하는데 필요한 파일, 소스코드, 메타데이터 등을 담고 있는 디렉터리
- Dockerfile이 위치한 디렉터리가 빌드 컨텍스트가 됨
- 해당 저장소에 위치한 모든 파일을 읽어들이므로 필요한 파일만 있는 것이 바람직
- .dockerignore로 파일 제외 가능(Dockerfile과 같은 곳에 위치)
- 도커 빌드 과정
- 임시 컨테이너 생성 -> 명령어 수행 -> 이미지 레이어로 저장 -> 임시 컨테이너 삭제 -> 새로 만든 이미지 기반 임시 컨테이너 생성 -> 명령어 수행 -> 이미지 레이어로 저장 -> 임시 컨테이너 삭제 -> …
- 이미지 빌드가 완료되면 Dockerfile의 명령어 줄 수만큼의 레이어가 존재
- 이전에 빌드했던 Dockerfile 같은 내용이 있다면 캐시를 이용해 빌드
--no-cache
옵션을 통해 캐시 사용 선택 가능
--cache-from
옵션을 통해 캐시로 사용할 이미지 지정 가능
명령어 최적화
필요없는 로그 및 파일 무시
# before
RUN apt-get -y update
# after
RUN apt-get -y -qq update
# before
RUN bundle install
# after
RUN bundle install --no-rdoc --no-ri
--no-doc
과 --no-ri
옵션으로 필요 없는 문서를 생성하지 않음
레이어 수 줄이기
# before
RUN apt-get -y -qq update
RUN apt-get -y -qq install ruby
# after
RUN apt-get -y -qq update && \
apt-get -y -qq install ruby
- 비슷한 명령어끼리 묶어 레이어 수를 줄임
- 스토리지에 따라 레이어의 개수가 127개로 제한되어 있는 경우가 있음