Search
Duplicate
📒

[Docker Container] 04-1. Dockerfile 작성

상태
미진행
수업
Docker Container
주제
Docker
연관 노트
3 more properties
참고

Image 생성을 위한 Dockerfile 명령어

NOTE
IaC(Infrastrcutre as Code)가 필요한 이유는 무엇인가?
커맨드 기반의 인프라 구성시 사용자 실수 등의 인적 오류 가능성이 높다.
코드형 인프라는 탄력성, 확장성, 반복성을 부여하게 되어 동일한 환경을 보유한 서버 수백대를 운영관리하게 해준다.

Dokcerfile

NOTE
Dockerfile ⇒ 컨테이너 구성 정보를 프로비저닝한 텍스트 템플릿 파일 (IaC의 종류)
Dockerfile의 사용흐름
FROM node WORKDIR /app COPY . /app RUN npm install EXPOSE 80 CMD ["node", "server.js"]
Docker
복사
예시 코드
프로비저닝 ⇒ 요구 사항에 맞게 시스템 자원을 할당, 배치, 배포해두었다가 필요 시 즉시 사용할 수 있도록 준비하는 것
Dockerfile은 컨테이너에 설치해야하는 패키지, 소스코드, 명령어, 환경변수 설정들을 기록한다.

Dockerfile 명렁어

NOTE
Dockerfile을 작성할때의 주의점은 Layer를 최대한 줄이는 거다!
BaseImage(FROM) 이후에 계속해서 추가적인 layer를 쌓아가는게 Dockerfile이다.
BaseImage(FROM) 이후에 계속해서 추가적인 layer를 쌓아가는게 Dockerfile이다.
Docker Layer는 이전 레이어와의 차이점(파일 시스템에서 데이터 CRUD 과정)을 저장하는 하나의 집합이라 생각하자.

FROM-layer (베이스 이미지)

NOTE
생성하려는 이미지의 베이스 이미지 지정으로 공식이미지를 주로 사용한다!
FROM ubuntu:20.04 FROM python:3.0-slim-buster FROM mongo:4.4.4-bionic
Docker
복사
사용 방법
이미지를 선택할 때 작은 크기의 이미지(slim)와 리눅스 배포판인 알파인(alpine) 이미지를 권장한다.
태그를 넣지 않으면 latest로 지정된다.

MAINTAINER, LABEL-layer (부가정보)

NOTE
주로 작성자나, 타이틀, 버전 정보를 입력하는데 사용하는 명령어다!
# 일반적으로 이미지 작성자의 이름과 이메일 넣음 MAINTAINER bohyeon.sim <scofe@gmail.com>
Docker
복사
사용 방법
# 이미지 작성 목적으로 버전, 타이틀, 설명 등을 넣는다. LABEL purpost='Nginx webserver" LABEL version='1.0' LABEL description='web service application using Nginx' # 권장사항 (layer 줄이기) LABEL purpose = 'Nginx for webserver' \ version='1.0' \ description = 'web service application using Nginx'
Docker
복사
사용 방법

RUN-layer (실행 명령)

NOTE
설정된 기본 이미지에 패키지 업데이트, 각종 패키지 설치, 명령 실행등을 작성한다!
RUN apt upate RUN apt -y install nginx RUN apt -y install git # 권장 사항(layer 줄이기) # autoremove, autoclean, 을 사용해서 apt 캐시를 삭제하면 용량이 줄어듬 RUN apt update && apt intall -y nginx \ git \ vim \ curl && \ apt clean -y && \ apt autoremove -y && \ rm -rfv /tmp/* /var/lib/apt/lists/* /var/tmp/*
Docker
복사
사용 방법

CMD, ENTRIYPOINT (컨테이너 실행 명령어)

NOTE
생성된 이미지를 컨테이너로 실행할 떄 실행되는 명령어다!
# CMD와 유사하지만 인자값을 사용할때 유용함 ENTRYPOINT ["npm", "start"] ENTRYPOINT ["python", "runapp.py"] # ENTRYPOINT만 사용하는 방식 # docker run <image> Hello World를 실행하면 Hello World 출력 FROM ubuntu ENTRYPOINT ["echo"] # ex) 동일환경에 entrypoint.sh 쉘 스크립트를 이미지에 넣고(ADD) # 실행권한 설정 (RUN) 후 컨테이너 실행 시 entrypoint.sh를 실행 ADD ./entrypoin.sh /entrypoint.sh RUN chmod +x /entrypoint.sh ENTRYPOINT ["bin/bash", "/entrypoint.sh"]
Docker
복사
ENTRYPOINT ⇒ 컨테이너가 시작될 때 항상 실행되는 명령어
docker run 명령으로 컨테이너가 시작되는 시점에 ENTRYPOIN의 명령어는 반드시 실행된다!
ENTRYPOIN echo를 넣어두고 docker run <image> Hello World를 실행하면 Hello World 출력
# Shell 방식 CMD apachetcl -D FOREGROUND # Exec 방식 CMD ["/user/sbin/apachectl", "-D", "FOREGROUND"] CMD ["nginx", "-g" , "daemon off"] CMD ["python", "app.py"] # CMD만 사용하는 방식 # docker run <image>를 실행하면 Hello World 출력 FROM ubuntu CMD echo "Hello World"
Docker
복사
CMD ⇒ 컨테이너를 시작할 떄 실행할 기본 명령어
CMD 명령어 부분에 컨테이너 내부에서 실행될 프로그램 명령어를 적는다.
docker run ubuntu sleep 5 명령의 경우 CMD sleep 5로 변경가능!
# 혼합해서 사용하는 경우 # docker run <image>를 실행하면 Hello World # docker run <image> Hi를 실행하면 Hi가 출력된다. FROM ubuntu ENTRYPOINT ["echo"] CMD ["Hello World"]
Docker
복사
CMD는 docker run의 추가인자에 따라 오버라이드 된다. ENTRIYPOINT = 실행될 명령어, CMD = 명령어 기본인자

ENV-layer (환경변수 지정)

NOTE
이미지 안에 각종 환경 변수를 지정하는 경우에 작성한다!
ENV JAVA_HOME /usr/lib/jvm/java-8-oracle ENV PATH /usr/local/nginx/bin:$PATH ENV Python:3.9 ENV NODE_VERSION v15.1.0 RUN curl -SLO "http://nodejsorg/dist/$NODE_VERSION/node-$NODE_VERSION-linux-x64.tar.gz" \ $$ tar -xzf "node -$NODE_VERSION-linux-x64.tar.gz" -C /usr/local --strip-components=1 \ $$ rm node-$NODE_VERSION-linux-x64-tar.gz
Docker
복사
사용 방법

COPY-layer, ADD-layer (호스트 → 이미지 복사, 추가)

NOTE
호스트 환경의 파일, 디렉터리를 이미지안에 복사하는 경우나 추가하는경우 사용한다!
COPY index.html /usr/share/nginx/html COPY ./runapp.py / # 주의! COPY . /app -> 작업 영영 적체를 copy 하므로 비효율적임
Docker
복사
사용 방법
단순한 복사 작업만 지원하며, 작업 디렉토리 외부 파일은 COPY 불가능하다.
복사가 필요한 명시적인 작업인 경우, ADD보다는 COPY가 권장된다.
# 복사 ADD index.html /user/share/nginx/html # 다운로드 및 디렉토리 추가 ADD http://example.com/view/customer.tar.gz /workspace/data/ # 압축해제 ADD website.tar.gz /var/www/html
Docker
복사
호스트 환경의 파일, 디렉터리를 복사하는 경우 뿐만 아니라, URL 주소에서 직접 다운로드하여 이미지에 넣을 수 있고, 압축 파일인 경우에는 압축을 풀어서 추가한다.
작업 디렉토리 외부 파일은 ADD가 불가능하며, 디렉토리 추가시에는 /로 끝나야 한다.

EXPOSE (포트포워딩)

NOTE
컨테이너가 호스트 네트워크를 통해 들어오는 트래픽을 리스닝(listening)하는 포트와 프로토콜을 지정하기 위해 작성한다!
EXPOSE 80, EXPOSE 80/tcp EXPOSE 443 EXPOSE 8080/udp
Docker
복사
사용 방법
Nginx, apache는 기본적으로 80, 443 포트를 사용한다.
Cadvisor의 경우 8080 포트를 사용한다.

VOLUME (데이터 보관)

NOTE
컨테이너에서 사용된 파일과 디렉터리를 도커 볼륨으로 관리한다!
# 기본 경로 /var/lib/docker VOLUME /var/log VOLUME /var/ww/html VOLUME /etc/nginx # HOST os의 Volume 기본 경로와 container 내부의 /procjet 연결 VOLUME ["/project"]
Docker
복사
사용 방법

USER (사용자 지정)

NOTE
컨테이너 기본 사용자는 root이며, User를 통해 다른 사용자로 변경할 수 있다!
RUN ["useradd", "kevinlee"] USER kevinlee RUN ["/bin/bash", "-c", "date"] RUN groupadd -r mongodb && useradd --no-log-init-r-g mongodb mongodb
Docker
복사
사용 방법

WORKDIR

NOTE
컨테이너에 상에서 작업할 경로 전환을 위해 사용한다!
# WORKDIR을 설정하면 DOCKER의 명령문은 해당 디렉토리를 기준으로 실행된다. WORKDIR /workspace WORKDIR /usr/share/nginx/html WORKDIR /go/src/app
Docker
복사
사용 방법

ARG

NOTE
docker build 시점에서 변수 값을 전달할때 --build-arg=인자를 정의해서 사용한 값을 받는다!
ARG db_name # docker build --build-arg db_name=fastdb . # 입력받은 변수값을 사용 CMD db_start sh -h 127.0.0.1 -d ${db_name}
Docker
복사
사용 방법

.dockerignore

NOTE
COPY 시 제외할 폴더나 파일들을 작성.
주로 .git 파일이나 설치 모듈들이 여기 해당