[Docker] Dockerfile 을 사용한 구성 관리

Woong·2022년 6월 16일
0

Docker, k8s

목록 보기
6/8

Dockerfile

  • 파일명은 소문자여도 빌드되지만 Dockerfile로 쓰는게 원칙
    • DockerFile 같은 식으로 쓰면 인식안됨
    • 파일명이 Dockerfile이 아닌 경우 -f 옵션으로 빌드는 가능

명령어

  • 명령은 대문자 사용
    • 필수는 아니지만 관례상

FROM

  • 베이스 이미지 지정

RUN

  • 명령 실행
    • 빌드시에만. 컨테이너 실행이 아님

ENTRYPOINT, CMD

  • ENTRYPOINT : 컨테이너 실행 명령.
  • CMD : 컨테이너 실행 명령
    • ※ 빌드시엔 실행되지 않음
    • ENTRYPOINT, CMD 둘다 ★★★1개만 허용됨★★★
      • 여럿 있을 경우 맨 마지막 1개만 사용됨
        * 단, ENTRYPOINT 1개, CMD 1개는 가능. ENTRYPOINT 로 명령, CMD로 디폴트 인자 보내는 식
    • ENTRYPOINT 는 변경 불가, CMD는 컨테이너 실행시 변경 가능
      * ex) docker run -d myalpine:2.0 /bin/sleep 300s 이런 식으로 하면 CMD가 무시되고 300s sleep 이 시행됨

ADD, COPY

  • ADD : 로컬파일을 컨테이너로 복사
    • ※ 압축파일을 풀어버리고 복사한다는 문제가 있음
  • COPY : 로컬파일을 컨테이너로 복사
    • 압축파일을 그상태 그대로 복사함
ADD myfile /var/tmp/
COPY myfile2 /var/tmp/

WORKDIR

  • 컨테이너 내의 작업 디렉토리를 지정
  • WORKDIR /var/tmp/

EXPOSE

  • 컨테이너에서 listen 할 포트 지정
    • Docker에 알려주는 역할
      EXPOSE 80

ENV

  • Dockerfile 내 환경변수 지정
  • ENV var1="hello"

LABEL

  • 버전 정보나 코멘트 등 기입
    • LABEL 이름은 마음대로 쓸 수 있음
    • -> 만들어진 image에서 볼 수 있는 정보
    • inspect 했을 때 "Labels" 라는 키로 들어감
LABEL maintainer "Jinung Ahn<anjinwoong@naver.com>"
LABEL title="mynginx"
LABEL vers="1.0"
LABEL description="...."

ONBUILD

  • 생성한 이미지를 기반으로 다른 이미지가 생성될 때 명령을 실행(trigger)
    • 다음 번에 이미지가 FROM으로 사용될 때 실행할 명령을 예약하는 기능
    • 최초에 ONBUILD를 사용한 상태에서는 아무 명령도 실행 안함
      • 이 이미지를 기반으로 새 이미지를 만들 때 실행되도록 예약
      • (손자 이미지에는 상속 X)
ONBUILD ADD world.txt /world.txt

Dockerfile 예시

# 베이스 이미지 지정. 빌드시 메모리에 올라가게됨
FROM centos:7

# RUN 으로 명령 실행. 달력 실행
RUN cal
RUN echo "test" > /var/sample.txt

Dockerfile 빌드하기

  • docker build --tag 새이미지명:버전 Dockerfile디렉토리
    • ex) docker build --tag myimage:v1.0 /home/devops/test
    • 빌드하여 도커 이미지로 등록됨
      * Dockerfile 디렉토리 경로는 상대경로도 가능
  • 베이스 이미지로 컨테이너 실행
    • -> 명령어 실행
    • -> 이미지를 생성하기 위해 베이스 이미지의 컨테이너를 삭제, 도커 이미지 생성
    • -> 만들어진 도커 이미지를 컨테이너로 다시 올림
    • -> 명령어 실행
    • -> (반복)
    • -> 컨테이너 삭제, 도커 이미지 생성
    • -> 최종적으로 만들어진 도커 이미지가 작성됨

ex) alpine 리눅스 기반 Dockerfile

FROM alpine
RUN echo "test" > /tmp/testfile
RUN cal
RUN cal > /tmp/cal.txt
#RUN /bin/sleep 3600s 
# RUN에 sleep 을 길게 넣어도 컨테이너 실행하면 죽음.
# RUN 명령어는 빌드시 실행하는 것이고, 컨테이너가 시작될 때 실행하는 것이 아니므로.

ENTRYPOINT /bin/sleep 600s
#ENTRYPOINT : 컨테이너 실행 명령. 단 1개만 허용됨(여럿 있을 경우 맨 마지막 1개만 사용됨) 당연히 빌드시엔 실행되지 않음
CMD /bin/sleep 600s # 실행시 변경될 수 있음
  • docker build -t .

    • 상대경로로도 빌드 가능
  • ※ alpine 리눅스는 bash 대신 ash 쉘을 사용함

  • 실행 후 쉘 접근해서 RUN 이 잘되었는지 체크

    • 빌드시 RUN 이 실행되어서 /tmp/testfile 이 생성되어있음
[devops@server1 test_alpine]$ docker exec -it elegant_poitras /bin/ash
/ # cat /tmp/testfile 
test
/ # 

ex) alpine 리눅스 기반 Dockerfile

  • CMD 로 ENTRYPOINT 의 디폴트 인자 지정
FROM alpine
RUN echo "test" > /tmp/testfile
RUN cal
RUN cal > /tmp/cal.txt

ENTRYPOINT top
CMD ["-d", "10"] # ENTRYPOINT 의 default 인자 지정 (변경 가능)
  • 실행 결과
    • docker run -d myalpine:3.0
    • docker run -d myalpine:3.0 "-d 3"
      • CMD 의 인자를 변경하여 실행
docker ps --no-trunc

CONTAINER ID                                                       IMAGE                 COMMAND                   CREATED          STATUS          PORTS     NAMES
402d499af7c7fe5cd01323a22be4ef7e76e887937a16d09a0f5b0cc90ff27bbf   myalpine:3.0          "/bin/sh -c top '-d 3'"   18 seconds ago   Up 18 seconds             beautiful_lichterman
9bfa931772736a0f2a9a75ecb2e0bc5f4ba803f6367ca0baa4b1dbcaccb938c8   myalpine:3.0          "/bin/sh -c top -d 10"    54 seconds ago   Up 53 seconds             goofy_goldberg
cb6a92e7c5eff1d42531fae5c4d26f4887f7beae6b9d4afb2d8fe6c7173e6b33   custom_httpd24:v2.0   "httpd-foreground"        2 hours ago      Up 2 hours      80/tcp    myapache
[devops@server1 test_alpine3]$ 

ex) Dockerfile 명령어 예제

FROM ubuntu:18.04

LABEL maintainer="anjinwoong"

# install nginx
# 리눅스 && 연산자를 이용해 RUN 여러번 안하고 명령어 수행하도록 할 수 있음
RUN apt-get -y update && \
	apt-get -y upgrade && \
	apt-get -y install nginx
EXPOSE 80
OBBUILD ADD website.tar /var/www/html/

ENV var1="hello" var2="linux"


CMD ["nginx", "-g", "daemon off;"]

0개의 댓글