- Docker?
- 컨테이너를 사용하여 응용프로그램을 더 쉽게 만들고, 배포하고 실행할 수 있도록 설계된 도구이며 컨테이너 기반의 오픈소스 가상화 플랫폼
- 어플리케이션 환경에 구애 받지 않고 손쉽게 배포 관리를 할 수 있게 해줌
- 컨테이너 기반 배포 방식은 구글을 비롯해 대부분 서비스 회사가 컨테이너로 서비스 운영 중
- AWS, Azure, Google, Cloud등 어디서든 실행 가능
- 굳이 도커?
- 도커는 서버마다 동일한 환경을 구성해주기 때문
- 동일한 환경을 구성하기 때문에 auto scaling에 유리 -> 서버를 자동으로 늘리고, 줄이고~
- 도커와 기존 가상화 기술(VM) 차이
- 한대의 서버에서 하나의 어플리케이션만 운영하는 전통적인 방식에서 하이퍼바이저 기반 가상화 등장
- 하이퍼 바이저는 호스트 시스템(윈도우, 리눅스 등)에서 다수의 게스트OS(가상머신)을 구동할 수 있게 하는 소프트웨어
- 각 VM 독립적으로 동작
- 도커는 하이퍼 바이저 구조를 토대로 등장, VM보다 훨씬 가볍게 동작하기 때문에 성능에 유리
- 도커의 컨테이너와 이미지
- 이미지란 코드, 런타임, 시스템 도구, 시스템 라이브러리 및 설정과 같은 응용프로그램을 실행 하는데 필요한 모든 것을 포함하는 패키지
- 이미지는 Github와 유사한 서비스인 dockerhub를 통해 버전 관리
- 컨테이너란 도커 이미지를 독립된 공간에서 실행할 수 있게 해주는 기술
- 도커 이미지 : 프로그램을 실행하는데 필요한 설정이나 종속성들을 가지고 있음
- 도커 컨테이너 : 이미지 인스턴스이며, 프로그램을 실행
// Dockerfile 예시
FROM openjdk:11
ARG JAR_FILE=build/libs/app,jar
COPY ${JAR_FILE} ./app.jar
COPY pharmacy.csv ./
ENV TZ=Asia/Seoul
ENTRYPOINT ["java","-jar","./app.jar"]
- Dockerfile이란 도커 이미지를 구성하기 위해 있어야 할 패키지, 의존성, 소스코드 등을 하나의 File로 기록하여 이미지화 시킬 명령 파일
- 즉, 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 더 이상 새로운 서버가 추가되면 의존성 파일을 컴파일하고 이것 저것 설치할 필요 X
// 도커파일 주요 명령어
FROM
- 새로운 이미지를 생성할 때 기반으로 사용할 이미지를 지정 (이미지 이름:태그)
- ex) jdk11이 있는 컨테이너 사용
- FORM openjdk:11
ARG
- 이미지 빌드 시점에서 사용할 변수 지정
- ARG JAR_FILE=build/libs/app.jar
COPY
- 호스트에 있는 파일이나 디렉토리를 Docker 이미지의 파일 시스템으로 복사
- COPY ${JAR_FILE} ./app.jar
ENV
- 컨테이너에서 사용할 환경 변수 지정
- TimeZone 환경 변수
- ENV TZ=Asia/Seoul
ENTRYPOINT
- 컨테이너가 실행되었을 때 항상 실행되어야 하는 커맨드 지정
- ENTRYPOINT ["java","-jar","./app.jar"]
- Docker Compose?
- 멀티 컨테이너 도커 어플리케이션을 정의하고 실행하는 도구
- Application, Database, Redis, Nginx 등 각 독립적인 컨테이너로 관리한다고 가정
- 여러개의 도커 컨테이너로 부터 이루어진 서비스를 구축 및 네트워크 연결, 실행 순서를 자동으로 관리
- docker-compose.yml 파일을 작성하여 1회 실행하는 것으로 모든 컨테이너를 실행