1. 사용 이유
리눅스 기반의 컨테이너 기술
개발 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있으며,
코드를 문제없이 실행할 수 있음
2. 작동 방식
도커는 '컨테이너'를 사용해 코드를 실행하는 표준 방식을 제공함.
컨테이너는 가상머신과 같이 서버 운영 체제를 가상화함.
컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있음
도커와 가상 머신 차이
컨테이너 | VM |
- Guest OS 위에 도커가 동작함 도커는 컨테이너를 위한 운영체제임. 컨테이너에 Guest OS를 따로 설치하지 않음. 어플리케이션을 구동하는데 필요한 모든 패키지만 있으면 컨테이너를 구동시킬 수 있음 |
- Host OS 위에 Guest OS 전체를 가상화함 간단하지만 무겁고 느림. OS가 하나씩 추가될 때마다 OS를 위한 자원을 할당해주어야 함 |
주요 개념
- Image: 서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행 파일을 묶은 형태
- 특정 프로세스를 실행하는데 필요한 모든 파일과 설정값을 가진 파일
- Docker 이미지는 수백MB~수GB 정도임. 가상머신 이미지에 비하면 적은 용량임
- 상태값을 가지지 않고 변하지 않음
- 하나의 이미지로 여러 개의 컨테이너를 생성할 수 있고, 컨테이너가 삭제되어도 이미지는 변하지 않음
- Docker는 Dockerfile이라는 파일로 이미지를 만듦. Dockerfile에는 소스와 함께 의존성 패키지 등 사용했던 설정 파일을 버전 관리하기 쉽도록 명세되어 있음
- Docker hub에서 다운로드 가능함
- Container: 이미지를 실행한 상태. 애플리케이션의 종속성과 함께 애플리케이션 자체를 패키징 or 캡슐화하여 격리된 공간에서 프로세스를 동작시키는 기술
- 이미지 layer에 읽기/쓰기 레이러를 추가하는 것으로 생성/실행됨
- 컨테이너는 종료되어도 메모리에 남아있기 때문에 다시 시작할 수 있음. 삭제하려면 명시적으로 삭제해야함
- 컨테이너를 삭제: 컨테이너에서 생성한 파일이 사라짐
- ex) DB라면 그동안 쌓였던 데이터가 모두 사라진다는 뜻
- 컨테이너를 삭제: 컨테이너에서 생성한 파일이 사라짐
- 한 서버는 여러 개의 컨테이너를 가져도 상관없으며, 컨테이너는 각각 독립적으로 실행됨
- 커널 공간과 Host OS자원(System call)을 공유함
- Layer: 기존 이미지에 추가적인 파일이 필요할 때 다시 다운로드받는 방법이 아닌 해당 파일을 추가하기 위한 개념
- 이미지는 여러 개의 읽기 전용 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성됨
- 컨테이너를 생성할 때 기존의 이미지 레이어 위에 읽기/쓰기 레이어를 추가함. 이미지 레이어를 그대로 사용하면서 컨테이너가 실행 중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장되므로 여러 개의 컨테이너를 생성해도 최소한의 용량만 사용함
3. Docker 사용예시
① Docker 설치
② .jar 파일이 있는 곳에 Dockerfile 생성
- FROM: Docker Base Image
- 기반 이미지
- {이미지 이름}:{태그} 형식
- ARG: 컨테이너 내에서 사용할 수 있는 변수
- COPY: 파일 복사
- JAR_FILE이라는 이름을 갖는 파일을 app.jar로 복사해라
- ENTRYPOINT: 컨테이너를 구동할 때 실행할 명령어를 지정
- java -jar /app.jar
③ Dockerfile을 이미지화
- docker build -t {이미지명} .
- -t: tag 의미 (name:tag)
- docker images
- 이미지 생성 완료 확인
- docker push {이미지명}
- docker hub에 이미지 올리기
④ 컨테이너 실행하기
- docker run -p {host system 안의 포트}:{컨테이너 안의 포트} {이미지명}
- -p {host system 안의 포트}:{컨테이너 안의 포트}: localhost의 포트를 컨테이너 안의 포트로 맵핑하는 과정
'백엔드 > Spring' 카테고리의 다른 글
build.gradle와 build 과정 살펴보기 (0) | 2023.04.07 |
---|---|
5. Aspect Oriented Programming with Spring (0) | 2023.03.15 |
1. The IoC container (0) | 2023.03.15 |
JPA와 연관관계 (with MySQL) (1) (0) | 2022.10.20 |
JWT 토큰을 이용한 로그인 구현 (1) (0) | 2022.10.13 |
댓글