도커란?
리눅스 컨테이너 기반으로 하는 오픈소스 가상화 플랫폼.
즉, 특정한 서비스를 패키징하고 배포하는데 유용한 오픈소스 프로그램
컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는데 필요한 모든것이 포함되어있다
가상머신에 비해 꼭 필요한 것만 담겨서 구동되기 때문에 이미지를 만들경우 용량이 대폭 줄어든다
도커를 사용하는 이유
- 애플리케이션 독립성을 가진다. 호스트 OS, 다른 컨테이너와도 독립된 공간을 보장받아 충돌이 발생하지 않는다
- 컨테이너 내부에 작업후 배포하려 한다면 도커 이미지로 만들어서 운영서버에 전달만 하면 된다
- 마이크로 서비스 구조로 변화가 쉽다. 컨테이너 하나 당 하나의 기능을 제공하는 모듈로 만드는 등 조정이 가능하다
Docker를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포, 확장가능하다
도커 이미지, 컨테이너란?
쉽게 설명하면, 도커 파일 > 도커 이미지 > 도커 컨테이너 순으로 실행됩니다
도커 파일은 어떤 소프트웨어를 만들기 위해 필요한 단계들이 기록되어있는 스크립트이고, 스크립트를 실행하면 도커 이미지가 생성됩니다. 이미지는 변경될 수 없습니다. 그리고 컨테이너는 이런 이미지 기반으로 독립적으로 실행됩니다
도커파일은 마치 설계서를 작성하기 위한 기초 문서, 도커 이미지는 기초 문서 기반으로 만들어진 변경 불가한 설계서, 도커 컨테이너는 이러한 설계서를 기반으로 만들어진 독립적인 건물, 제품이라 생각하면 쉬울 것 같습니다!
도커 이미지
Docker Image란 컨테이너를 실행할 수 있는 실행파일, 설정값들을 가지고있는 것
더이상 의존성 파일을 컴파일하거나 이것저것 설치할 필요가 없는 상태의 파일을 의미한다
Image를 컨테이너에 담고 실행시키면 해당 프로세스가 동작한다
도커 이미지 생성방식
기존 이미지에 추가적인 구성이 필요할 때 다시 다운로드 하는 방법이 아닌 기존 이미지에 레이어를 추가해 구성을 올려주는 방식으로 생성된다
이미지는 여러개의 읽기전용 레이어로 구성되고 파일이 추가되면 새로운 레이어가 생성되어 추가된다
도커는 여러개의 레이어를 묶어 하나의 파일시스템으로 사용할 수 있게 해준다
이미지와 컨테이너의 차이:
간단히 다시 설명하면 도커이미지는 설계서, 컨테이너는 설계서로 만들어진 상품이다!
이미지가 중간에 바뀌게 되어도 기존 컨테이너는 더이상 이미지에 영향을 받지 않는다
컨테이너란?
Docker Container란 이미지를 실행한 상태로 응용프로그램의 종속성과 함께 응용 프로그램 자체를 패키징 or 캠슐화해 격리된 공간에서 프로세스를 동작시키는 기술이다
특징
- 컨테이너는 이미지 레이어에 읽기/쓰기 레이어를 추가하는 것으로 생성됨
- 종료되었다고 해도 삭제되지 않음 => 읽기/쓰기 레이어 보존
- 컨테이너를 삭제한 것은 생성파일이 사라지는 것
- 한 서버는 여러개의 컨테이너를 가져도 상관없으며 독립적으로 실행
- 컨테이너는 커널 공간과 호스트 os자원을 공유
도커파일이란?
Docker File은 이미지 생성 출발점으로 이미지를 구성하기 위한 명령어들을 작성하며 이미지를 구성할 수 있다.
다시말해, 만들 이미지에 대한 정보를 기술한 템플릿이라고 보면된다.
이를 빌드하면 자동으로 이미지가 생성된다. 도커 파일을 통해 애플리케이션 빌드 및 배포를 자동화할 수 있습니다.
FROM python:3.8.3-alpine
ENV PYTHONUNBUFFERED 1
RUN mkdir /app
WORKDIR /app
# dependencies for psycopg2-binary
RUN apk add --no-cache mariadb-connector-c-dev
RUN apk update && apk add python3 python3-dev mariadb-dev build-base && pip3 install mysqlclient && apk del python3-dev mariadb-dev build-base
RUN apk add linux-headers libffi-dev musl-dev
RUN apk add --no-cache python3-dev libffi-dev gcc
# By copying over requirements first, we make sure that Docker will cache
# our installed requirements rather than reinstall them on every build
COPY requirements.txt /app/requirements.txt
RUN pip install -r requirements.txt
# Now copy in our code, and run it
COPY . /app/
Docker File Instructions
- FROM: base image 지정, 이미지의 시초
- RUN: command를 실행해 새 이미지에 포함시킴 => apk설치 등등 / 이미지 빌드 시
- CMD: 컨테이너가 시작될 때 실행할 command지정 / 빌드 완료된 이미지로부터 시작
- ENTRYPOINT: 컨테이너 시작 시 실행될 command지정 + param 변경 불가
- LABEL: key-value형식으로 작성된 메타데이터를 이미지에 추가
- ENV: key-value형식으로 환경변수 작성
- EXPOSE: 컨테이너로 들어오는 트래픽을 특정 포트로 받아들일 수 있도록 하는 역할 <포트>/<프로토콜>
- COPY: Host내에 있는 파일 또는 디렉토릴 컨테이너의 파일시스템으로 복사
- ADD: 파일 또는 디렉토리를 컨테이너로 복사 -> remote 파일, 디렉토리를 복사할 수 있음
- USER: 명령을 실행할 유저명, 유저그룹 설정 => 사용자 계정으로 변경
- WORKDIR: 작업 디렉토리 설정 / 기존 디렉토리 없을때 생성 후 설정
- VOLUME: 컨테이너 내의 특정 디렉토리를 컨테이너 외부 경로에 마운트 시켜주는 지시가 => 데이터 보존