Dockerfile이란?
•
Docker Image를 만들기 위한 설정 파일(스크립트)
•
배포판을 보완할 때 사용
•
Docker는 Dockerfile에 나열된 명령문을 차례대로 수행하며DockerImage를 생성
구조
$ vim Dockerfile
RUN apt-get update
FROM ubuntu:14.04
# app 디렉토리 생성
RUN mkdir -p /app
#Docker 이미지 내부에서 RUN, CMD, ENTRYPOINT의 명령이 실행될 디렉터리를 설정합니다.
WORKDIR /app
# 현재 디렉터리에 있는 파일들을 이미지 내부 /app 디렉터리에 추가함
ADD . /app
RUN apt-get update && apt-get install apache2
RUN service apache2 start
VOLUME ["/data", "/var/log/httpd"]
# 하기 포트를 외부로 노출합니다.
EXPOSE 80
# 쉘을 사용하지 않고 컨테이너가 시작되었을 때 logbackup 스크립트를 실행
CMD ["/app/log.backup.sh"]
YAML
복사
FROM
•
기반이 되는 이미지 레이어
•
<이미지 이름>:<태그> 형식으로 작성
•
AS로 별칭 지정 가능
•
ex) ubuntu:14.04
•
MAINTAINER
◦
이미지를 생성한 개발자 정보
RUN
•
도커이미지가 생성되기 전에 수행할 쉘 명령어
◦
RUN 명령을 실행할 때 마다 레이어가 생성되고 캐시됨.
◦
따라서 RUN 명령을 따로 실행하면 apt-get update는 다시 실행되지 않아서 최신 패키지를 설치할 수 없다.
◦
위 처럼 RUN 명령 하나에 apt-get update와 install을 함께 실행 필수.
VOLUME
•
VOLUME은 디렉터리의 내용을 컨테이너에 저장하지 않고 호스트에 저장하도록 설정합니다.
•
데이터 볼륨을 호스트의 특정 디렉터리와 연결하려면 docker run 명령에서 -v 옵션을 사용해야 합니다.
•
ex) -v /root/data:/data
WORKDIR
•
CMD에서 설정한 실행 파일이 실행될 디렉터리, 없으면 새로 생성 (작업 디렉토리)
◦
작업 디렉토리를 지정하면 그 이후 명령어는 해당 디렉토리를 기준으로 동작
◦
cd+mkdir 명령어와 동일
EXPOSE
•
호스트와 연결할 포트 번호
◦
호스트 머신과 컨테이너의 포트 매핑시에 사용
◦
컨테이너 생성 시 -p 옵션의 컨테이너 포트 값으로 EXPOSE 값을 적어야 함
CMD
•
컨테이너가 시작되었을 때 실행할 실행 파일 또는 셸 스크립트
•
해당 명령어는 DockerFile내 1회만 가능
◦
CMD
▪
컨테이너를 생성할 때만 실행됩니다. (docker run)
▪
컨테이너 생성 시, 추가적인 명령어에 따라 설정한 명령어를 수정 가능
◦
ENTRYPOINT
▪
컨테이너를 시작할 때마다 실행됩니다. (docker start)
▪
컨테이너 시작 시, 추가적인 명령어 존재 여부와 상관 없이 무조건 실행
◦
명령어 형식
▪
CMD ["<커맨드>", "<파라미터1>", "<파라미터2>"]
▪
CMD <커맨드> <파라미터1> <파라미터2>
▪
ENTRYPOINT ["<커맨드>", "<파라미터1>", "<파라미터2>"]
▪
ENTRYPOINT <커맨드> <파라미터1> <파라미터2>
COPY
•
파일 복사
COPY hello.html /var/www/html
# hello.html파일을 이미지의 /var/www/html 경로에 복사
YAML
복사
작성 된 Docker File로 Image 만들기
•
$ docker build -t [만들고싶은 이미지 이름]
◦
Docker File 경로에서 입력
예제 (아파치)
# server image는 ubunutu 18.04를 사용
FROM ubuntu:18.04
# image가 올라갔을 때 수행되는 명령어들
# -y 옵션을 넣어서 무조건 설치가 가능하도록 한다.
RUN \
apt-get update && \
apt-get install -y apache2
# 파일 복사
COPY hello.html /var/www/html
# 작업공간 이동 (=cd)
WORKDIR /var/www/html
# apache가 기본적으로 80포트를 사용하기 때문에 expose를 이용해 apache server로 접근이 가능하도록 한다.
EXPOSE 80
# 컨테이너가 생성 된 이후에 내부의 아파치 서버는 항상 실행중인 상태로 만들어준다.
# apachectl을 foreground(즉, deamon)상태로 돌아가도록 한다.
CMD ["apachectl", "-D", "FOREGROUND"]
YAML
복사