컨테이너를 사용하여
응용프로그램을 더 쉽게 만들고, 배포하고 실행할 수 있도록 설계된 도구이며
컨테이너 기반의 오픈 소스 가상화 플랫폼이다.
일반 컨테이너 개념에서 물건을 손쉽게 운송해주는 것처럼
어플리케이션 환경에 구애받지 않고 손쉽게 배포 관리를 할 수 있게 해준다.
컨테이너 기반 배포 방식은
구글을 비롯해 대부분의 서비스 회사가 컨테이너로 서비스 운영 중이다.
2대의 서버가 있을 때,
2대의 서버 세팅 시기가 다르다면 ,
운영체제 버전부터 컴파일러, 설치된 패키지까지 완벽하게 같게 하기가 쉽지 않다.
이러한 차이로 인해 문제가 발생하기 쉬운데,
도커는 서버마다 동일한 환경을 구성해주기 때문에
이러한 문제를 해결할 수 있다.
또한,
docker를 사용하면 동일한 환경을 구성하기 때문에 auto scaling에 유리하다.
Hypervisor는 (VM)
호스트 시스템 (윈도우, 리눅스 등)에서
다수의 게스트 OS (가상머신) 를 구동할 수 있게 하는 소프트웨어이다.
각 VM 마다 독립적으로 동작한다.
Container는 (Docker)
하이퍼 바이저 구조를 토대로 등장했으며,
VM보다 훨씬 가볍게 동작하기 때문에 성능에 유리하다.
이미지란
코드, 런타임, 시스템 도구, 시스템 라이브러리 및 설정과 같은
응용 프로그램을 실행 하는데 필요한 모든 것을 포함하는 패키지
이다.
이미지는 Github와 유사한 서비스인 https://hub.docker.com 을 통해 버전 관리된다.
컨테이너란
이미지 인스턴스
라고 부르기도 한다.도커 이미지를 구성하기 위해 있어야할
패키지, 의존성, 소스코드 등을 하나의 file로 기록하여
이미지화 시킬 명령 파일
이다.
즉,
이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에,
더 이상 새로운 서버가 추가되면
의존성 파일을 컴파일하고 이것 저것 설치할 필요가 없다.
새로운 이미지를 생성할 때 기반으로 사용할 이미지를 지정 이미지 이름:태그
# ex. jdk 11 이 있는 컨테이너 사용
FROM openjdk:11
이미지 빌드 시점에서 사용할 변수 지정
ARG JAR_FILE=build/libs/app.jar
호스트에 있는 파일이나 디렉토리를 Docker 이미지의 파일 시스템으로 복사
COPY ${JAR_FILE} ./app.jar
컨테이너에서 사용할 환경 변수 지정
# TimeZone 환경 변수
ENV TZ=Asia/Seoul
컨테이너가 실행되었을 때 항상 실행되어야 하는 커맨드 지정
ENRTYPOINT ["java", "-jar", "./app.jar"]
Docker Compose란
멀티 컨테이너
도커 어플리케이션을 정의하고 실행하는 도구이다.
Application , Database , Redis , Nginx 등
각 독립적인 컨테이너로 관리한다고 했을 때
다중 컨테이너 라이프 사이클을 어떻게 관리해야 할까?
-> 도커 컴포즈로 관리!
여러개의
도커 컨테이너로 부터 이루어진 서비스를 구축
,
네트워크 연결
, 실행 순서
를 자동으로 관리
해준다.
docker-compose.yml
파일을 작성하여 1회 실행하는 것으로
설정된 모든 컨테이너를 실행.
windows : https://docs.docker.com/desktop/install/windows-install/
귀여운게 생겼닼ㅋㅋ
Linux Ubuntu
# 우분투 시스템 패키지 업데이트
sudo apt-get update
# 필요한 패키지 설치
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
# Docker의 공식 GPG키를 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# Docker의 공식 apt 저장소를 추가
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 시스템 패키지 업데이트
sudo apt-get update
# Docker 설치
sudo apt-get install docker-ce docker-ce-cli containerd.io
# version 확인
docker -v
docker compose 는 Mac
또는 Windows
의 경우
Docker desktop
을 설치한 경우라면
docker compose 설치를 진행할 필요가 없으며,
Linux의 경우 추가적으로 docker-compose 설치가 필요하다.
# https://github.com/docker/compose/releases 에서 최신 버전 확인후 설치
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 실행이 가능하게 권한을 세팅
sudo chmod +x /usr/local/bin/docker-compose
# 설치 버전 확인
sudo docker-compose -v
windows의 경우 power shell을 실행하고 아래 명령어를 입력한다.
ubuntu에선 shell에 바로 입력
docker login
로그인 실패시 좌측 하단에 도커 데스크탑이 실행중인지 확인!
목표 : Spring Boot 어플리케이션 이미지화 후 컨테이너에서 실행
인텔리제이 내장 terminal을 사용하면
프로젝트 현재 위치에서 실행되어 편하다.
인텔리제이로 프로젝트 실행 후 내장 터미널 열기.
jar 파일 이름을 app.jar
로 지정해서 생성되도록 하고자 한다.
build.gradle 파일을 실행 후 다음의 코드를 작성해준다.
bootJar {
archiveFileName = 'app.jar'
}
(windows)
.\gradlew clean
.\gradlew build
파일 이름 : Dockerfile
#Dockerfile
FROM openjdk:11
ARG JAR_FILE=build/libs/app.jar
COPY ${JAR_FILE} ./app.jar
ENV TZ=Asia/Seoul
ENTRYPOINT ["java", "-jar", "./app.jar"]
docker build -t {docker hub username}/{file name} {docker file 위치}
docker build -t zhyun/jar-docker-file-test .
생성된 docker images 확인!
docker images
docker run 명령어 사용!
docker run zhyun/jar-docker-file-test -p 8080:8080
-p : {host port}:{컨테이너 port}
docker 가 정상 동작중인지 확인을 위해 terminal을 하나 새로 열고
아래와 같이 명령어를 입력한다.
docker ps
실행중인 docker images 확인 가능!
+ 실행중인 컨테이너에 들어가보기
docker exec -it {container id} {shell}
docker exec -it 4d10189fd2a5 bash
우와 😀
version
도커 엔진버전에 따른 컴포즈 버전 선택
compose-v3
compose-v2
service
이곳에 실행하려는 컨테이너들을 정의
pharmacy-recommendation-app
서비스명 ( 네트워크 호스트명 ) / 같은 네트워크에 속한 컨테이너끼리 서비스 명으로 접근
가능
container_name
컨테이너 이름
build
dockerfile 이 있는 위치
depends_on
특정 컨테이너에 대한 의존관계
image
컨테이너 생성할 때, 사용할 도커 이미지 지정
environment
환경 변수
volumnes
호스트 디렉토리 : 컨테이너 디렉토리
ports
접근 포트 설정 (컨테이너 외부 : 컨테이너 내부)
--> docker run -p 옵션과 같으며, 개방할 포트를 지정하는 것
restart
컨테이너 실행 실패하는 경우 재시작 여부
# /database/Dockerfile
FROM mariadb:10
ENV TZ=Asia/Seoul
# /redis/Dockerfile
FROM redis:6
ENV TZ=Asia/Seoul
version: "3.8"
services:
jar-docker-file-test-maria:
container_name: /jar-docker-file-test-maria
build:
dockerfile: Dockerfile
context: ./database
image: zhyun/jar-docker-file-test-maria
environment:
- MARIADB_DATABASE=fc-pharmacy-directions
- MARIADB_ROOT_PASSWORD=${SPRING_DATASOURCE_PASSWORD}
volumes:
- ./database/config:/etc/mysql/conf.d
ports:
- "3303:3306" # localhost에서 3306 port 를 사용중이기 때문에 3303으로 접근
jar-docker-file-test-redis:
container_name: /jar-docker-file-test-redis
build:
dockerfile: Dockerfile
context: ./redis
image: zhyun/jar-docker-file-test-redis
ports:
- "6379:6379"
docker-compose -f docker-compose-local.yml up
컨테이너 동작 확인
docker ps
# 실행 할 환경 정보 작성
spring:
profiles:
active: local
group:
local:
- common
prod:
- common
---
# profile 설정 1 : common
spring:
config:
activate:
on-profile: common
---
# profile 설정 2 : local
spring:
config:
activate:
on-profile: local
datasource:
driver-class-name: org.mariadb.jdbc.Driver
url: jdbc:mariadb://localhost:3303/fc-pharmacy-directions
username: ${SPRING_DATASOURCE_USERNAME}
password: ${SPRING_DATASOURCE_PASSWORD}
redis:
host: localhost
port: 6379
jpa:
hibernate:
ddl-auto: create
show-sql: true
---
# profile 설정 3 : prod
spring:
config:
activate:
on-profile: prod
글 잘 봤습니다.