ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 도커 여덟번째
    프로그래밍/Docker 2024. 1. 16. 15:51

     

     

    도커는 컨테이너의 rootfs(/) 영역의 개별 공간 할당 제한을 위해  --storage-opt  옵션을 제공한다.

    하지만 이 옵션을 사용하기 위해서는 해당 디스크 파티션이 xfs로 지정되어있어야 하며,  추가기능에서 pquota (project quota) 가 설정되어 있어야한다.

    /etc/default/grub   에서  rootflags=uquota,pquota   추가
    
    /etc/fstab 에서  default,pquota 추가
    
    후 reboot

     

     

    모든 컨테이너의 rootfs (/) 용량 제한을 하기 위해선 docker daemon에 제한설정을 하면 된다.

    sudo vi /etc/docker/daemon.json
    
    
    
    { "insecure~~:": [~~],
      "log-driver": "~~",
      "log-opts": {
          "max-size": "30m",
          "min-file": "10"
       },	  				   -> 여기 , 도 필수
       
      "storage-opts": ["overlay2.size=500m"]    -> 이 한 줄을 추가하면 된다  
      
      이하 생략

     

     

     


     

     

    IaC (Infrastructure as Code,  코드형 인프라)

    - 커맨드 기반의 인프라 구성 시  인적 오류 가능성이 높다.

    - APM (Apache + PHP + MySQL) 구축 시 설치 순서, 상호 연관성을 고려해서 라이브러리, 명령어들을 고민해야 한다.

    - 환경 설정과 설치 프로그램을 요구사항에 맞춰야한다.

     

    -> 이런 수고를 하나의 이미지로 만들어두고, 수정이 필요하다면 언제든 코드 변경으로 가능하다면 개발에 집중할 수 있다.

    -> 코드형 인프라는 탄력성, 확장성, 반복성을 부여하여 동일 환경의 서버를 수 백대를 운영, 관리 가능

     

     

     

    Dockerfile

    도커파일은 도커에서 동작하는 컨테이너의 구성정보를 프로비저닝한 텍스트 템플릿 파일

    컨테이너에 설치해야하는 패키지, 소스코드, 명령어, 환경변수 설정 등을 기록한 하나의 파일

    도커파일은 어플리케이션 배포에 필요한 컨테이너 인프라를 코드 형태로 정의한 파일이며 이러한 개념을 IaC 라고 한다.

     

    - 프로비저닝은 사용자의 요구에 맞게 시스템 자원을 할당, 배치, 배포해 둔 후 필요시에 시스템을 즉시 사용할 수 있게

     미리 준비해 두는것

     

    배포까지의 과정

     

     

     

     


     

     

    도커파일 명령어

      layer에 해당하는 명령어들은 layer 표기

    명령어 설명
    FROM
    (layer)
    거의 모든 도커파일의 첫줄

    - (필수) 생성하려는 이미지의 베이스 이미지 지정
       도커허브에서 제공하는 공식 이미지를 권장 (라이센스 문제 등을 피하기 위함)
       이미지태그는 도커허브에서 여러 태그가 버전정보처럼 제공됨

    - 이미지 선택시 slim, alpine을 권장.  (경량화를 위해)
       *모든 어플리케이션에 동일하게 적용되는 사항은 아님

    - 태그를 넣지않을시 최신버전(latest)로 지정

    - 사용방법
       FROM ubuntu:20.04
       FROM python:3.0-slim-buster
       FROM mongo:4.4.4-bionic  

    MAINTAINER 일반적으로 이미지를 빌드한 작성자 이름과 이메일 작성

    - 사용방법
      MAINTAINER  name<name@email.com> 

    LABEL
    (layer)
    이미지 작성 목적으로 버전, 타이틀, 설명, 라이센스 및 작성자 정보 등을 작성
    이미지 관리에 도움을 주기 위한 용도
    하나 이상 작성 가능

    - 사용방법
      LABEL purpose='Nginx for webserver'
      LABEL version='1.0'
      LABEL description='web service application using Nginx'

    - 권장사항
     LABEL purpose='Nginx for webserver' \
                  version='1.0' \
                  description='web service application using Nginx'

    RUN
    (layer)
    설정된 기본 이미지에 패키지 업데이트, 패키지 설치, 명령 실행 등을 작성
    하나 이상 작성 가능

    - 사용방법)  apt, yum과 동일
      RUN apt update
      RUN apt -y install nginx
      RUN apt -y install git

    - 권장사항
      1. RUN 명령어의 개별 수를 줄여 여러 설치 명령을 연결하면 레이어 수를 줄일 수 있다.
      2. autoremove, autoclean, rm -rf /var/lib/apt/lists/* 을 사용하면 저장되어 있는 apt 캐시가 삭제되므로 이미지 크기가 감소

    RUN apt update && apt install -y nginx \ 
                                git \
                                vim \
                                curl && \
            apt clean -y && \
            apt autoremove -y && \
            rm -rfv /tmp/*  /var/lib/apt/lists/*  /var/tmp/*

    CMD 생성된 이미지를 컨테이너로 실행할 때 실행되는 명령
     
    - 일반적으로 도커파일의 마지막줄에 CMD 또는 ENTRYPOINT가 들어감

    - ENTRYPOINT 명령문으로 지정된 커맨드에디폴트로 넘길 파라미터를 지정할 때 사용

    - 여러개의 CMD를 사용해도 마지막 하나만 처리됨

    - 일반적으로 이미지를 컨테이너 실행 시 어플리케이션 데몬이 실행되도록 하는 경우에 유용 

    - 사용방법
      [Shell 방식]
      CMD apachectl -D FOREGROUND

      [Exec 방식]
      CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]
      CMD ["nginx", "-g", "deamon off;"]
      CMD ["python", "app.py"]

    ENTRYPOINT CMD와 마찬가지로 생성된 이미지가 컨테이너로 실행될 때 사용
    다른점은 컨테이너가 실행될 때 명령어 및 인자 값을 전달하여 실행

    - CMD는 적어둔 것들을 그대로 실행해서 변경이 불가하지만, 엔트리포인트는 인자 변경 가능

    - 사용방법        CMD와 유사하지만 인자값을 사용하는 경우에 유용
      ENTRYPOINT ["npm", "start"]
      ENTRYPOINT ["python", "runapp.py"]

    동일 환경에 entrypoint.sh 쉘스크립트를 이미지에 넣음   ADD
    실행 권한 설정  RUN
    컨테이너 실행 시 entrypoint.sh를 실행  ENTRYPOINT

    ADD ./entrypoint.sh /entrypoint.sh
    RUN chomd-x /entrypoint.sh
    ENTRYPOINT ["/bin/bash", "entrypoint.sh"]
     
    COPY
    (layer)
    호스트 환경의 파일, 디렉토리를 이미지안에 복사
    단순 복사만 지원하며  빌드 작업 디렉토리 외부의파일은 COPY할 수 없다.

     
    - 복사가 필요한 명시적 작업은 ADD보다 COPY를 권장
      COPY가 ADD보다 더 예측 가능하고 오류가 덜 발생하기 때문

    - 사용방법
      COPY index.html /usr/share/nginx/html
      COPY ./runapp.py/


    COPY . /app  는 작업영역 전체를 COPY 하므로 비효율적
      
    ADD
    (layer)
    호스트환경의 파일, 디렉토리를 이미지 안에 복사하는 경우 뿐만 아니라, URL 주소에서 직접 다운로드 하여 이미지에 넣을 수 도 있으며, 압축파일은 지정 경로에 압축을 풀어서 추가 

    - 빌드작업 디렉토리 외부의 파일은 ADD할 수 없고,  디렉토리 추가 시에는 /로 끝나야한다.

    - 사용방법
      ADD index.html  /usr/share/nginx/html
      ADD http://example.com/view/customer.tar.gz/workspace/data/ 
      ADD website.tar.gz/var/www/html


    ENV
    (layer)
    이미지 안에 환경변수를 저장

    - 특정 실행파일의 경로를 보장하기 위한 절대경로 PATH 지정
    - 프로그램 버전 설정
    - 반복된 표현 사용
    - 도커파일에서 ENV 설정시 RUN, WORKDIR 등에서 환경변수를 사용해 반복을 피할 수 있다.

    - 사용방법    K-V형식  
      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://nodejs.org/dist/$NODE_VERSION/~~~

    EXPOSE 컨테이너가 호스트 네트워크를 통해 들어오는 트래픽을 리스닝하는 포트와 프로토콜을 지정하기 위해 작성

    - 이미지 내에 어플리케이션이사용하는 포트를 사전에 확인하고 호스트와 연결되도록 구성하는 경우 설정하고,  docker run 사용시 -p 옵션을 통해 사용됨

    - 사용방법    안쓰면 /tcp가 기본
      EXPOSE 80 또는, EXPOSE 80/tcp
      EXPOSE 443
      EXPOSE 8080/udp
     
    VOLUME 볼륨을 이미지 빌드에 미리 설정하는 경우 작성

    - 컨테이너에서 사용된 파일과 디렉토리는 컨테이너 삭제와 함께 사라진다.
      그래서 사용자 데이터의 보존과 지속성을 위해 볼륨 사용을 권장.

    - 볼륨으로 지정된 컨테이너의 경로는 볼륨의 기본경로 /var/lib/docker와 자동으로 연결된다

    - 사용방법
      VOLUME /var/log
      VOLUME /var/www/html
      VOLUME /etc/nginx
     
      # HOST OS의 볼륨 기본경로와 컨테이너 내부의 /project 연결
      VOLUME ["/project"]
     
    USER 컨테이너의 기본 사용자는 root 다.
    어플리케이션이 권한없이 서비스를 실행할 수 있다면, USER를 통해 다른 사용자로 변경하여 사용

    - 사용방법
      RUN ["useradd", "newbie"]
      USER newbie
      RUN ["/bin/bash", "-c", "date"]

    또는
    RUN groupadd -r mongodb && \
            useradd --no-log-init -r -g mongodb mongodb

    WORKDIR 컨테이너 상에서 작업할 경로(디렉토리) 전환을 위해 작성

    - WORKDIR을 설정하면 RUN, CMD, ENTRYPOINT, COPY, ADD 명령문은 해당 디렉토리를 기준으로 실행된다.

    - 지정한 경로가 없으면 자동 생성되고 컨테이너 실행 이후 컨테이너에 접속하면 지정한 경로로 연결됨

    - 사용방법        WORKDIR 안하면 "/" 로 떨어짐
      WORKDIR /workspace
      WORKDIR /usr/share/nginx/html
      WORKDIR /go/src/app

    ARG 도커 빌드 시점에서 변수값을 전달하기 위해  "--build-arg=인자" 를 정의하여 사용

    - 사용방법
    # 도커파일에 ARG 변수를 정의하고
    ARG db_name

    # 도커 빌드 시 변수값을 저장하면 이미지 내부로 인자가 전달됨
    -$ docker build --build-arg db_name=fastdb .

    # 입력받은 변수값을 명령에 사용
    CMD db_start.sh -h 127.0.0.1 -d ${db_name}
      

     

     

     

    '프로그래밍 > Docker' 카테고리의 다른 글

    도커 열번째 - 도커 컴포즈  (0) 2024.01.18
    도커 아홉번째  (0) 2024.01.16
    도커 일곱번째  (0) 2024.01.15
    도커 여섯번째  (1) 2024.01.15
    도커 다섯번째  (0) 2024.01.14
Designed by Tistory.