
물리적인 컴퓨터 리소스를 다른 시스템이나 애플리케이션에서 사용할 수 있도록 제공하는 것을 말합니다.
하이퍼바이저(Hypervisor)
하나의 컴퓨터에 다수의 운영체제를 동시에 실행하기 위한 소프트웨어 구성 요소입니다.
가상화를 위한 매너저역할을 합니다.(Virtual Machine Mananger)
type1 : Native or Bare-metal
type2 : Hosted
운영체제의 가상화
Host OS 위에 설치된 Guest OS 전체를 가상화합니다.
VMWare, VirtualBox 와 같은 소프트웨어가 있습니다.
자유도가 높지만, 시스템에 부하가 많아지고 느려지게 됩니다.
하이퍼바이저 가상화
Host OS 없이 하드웨어 위에 Hypervisor를 설치하여 가상화를 구성하는 방식입니다.
Hypervisor에 의해 할당받은 리소스로 각 OS를 실행하기 때문에 독립적으로 실행할 수 있다는 장점이 있습니다.
하지만, 결국 하나의 하드웨어 위에서 실행되다보니 리소스가 제한적이고, 비용적으로 비효율적입니다.
컨테이너 가상화
Host OS가 가진 리소스를 적게 사용하며, 필요한 프로세스를 실행합니다.
최소한의 라이브러리와 도구만 포함되어 있기 때문에 속도가 빠르고 자원의 오버헤드가 적습니다.
대표적으로 사용하는 오픈소스 플랫폼으로 Docker 가 있습니다.
따라서, 현재에는 컨테이너 가상화를 사용하고 제공하는 기업 및 플랫폼이 급증하였습니다.
💡 Docker란?
컨테이너 기반의 가상화를 위한 환경을 제공하는 오픈 소스 플랫폼 입니다.
도커는 외부 환경으로 부터 격리시켜 구동이 가능하도록 해줍니다.
도커는 Linux 환경 기반으로 실행됩니다.

이미지는 컨테이너 실행에 필요한 설정들을 가지고 있습니다.
이미지를 저장하는 저장소를 레지스트리(registry)라고 하며, 사용량이 많은 Public Registry 중 하나로 Docker Hub가 있습니다.
별도의 서버를 기동하여 이미지를 저장하는 저장소로 사용하면, Private Registry 라고 합니다.
이러한 이미지를 저장하고 실행하는 서버를 Docker Host 라고 합니다.
Docker Host 에는 컨테이너를 실행할 수 있는 로컬 레포지토리가 존재합니다.
이를 통해서, 하나의 Docker Host에서 다수의 컨테이너를 실행할 수 있습니다.
Docker Image를 생성하기 위한 스크립트 파일을 말합니다.
도커의 인프라 구성을 관리할 수 있는 파일입니다.
자체 DSL(Domain-Specific Language) 언어를 사용합니다.
docker build 커멘드를 통해서 Dockerfile에 저장된 정보를 이미지로 생성하며 이미지 생성 시에 레이어 구조로 하나씩 계층적으로 쌓이면서 빌드가 됩니다.
💡 Dockerfile Command

Docker Desktop
docker 컨테이너 실행 : $ docker run [OPTIONS] IMAGE[:TAG | @DIGEST][COMMAND][ARGS]
OPTIONS
-d : 데몬으로 실행되는 (백그라운드) 컨테이너를 생성하겠다는 것을 말합니다.-p : 호스트와 컨테이너의 포트를 연결합니다.(포워딩)-v : 호스트와 컨테이너의 디렉토리를 연결((볼륨)마운트 - 공유 폴더)-e : 컨테이너 내에서 사용할 환경변수를 설정합니다.--name : 컨테이너 이름을 설정합니다. 컨테이너명은 중복이 불가합니다.--rm : 프로세스 종료 시 컨테이너가 자동으로 제거됩니다.(주의하여 사용)-it : -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션입니다.--link : 컨테이너 연결해줍니다.Ubuntu를 실행하기 위해서는 다음과 같은명령어를 입력하시면, image downloda 및 컨테이너 생성, 실행까지 해줍니다.
$ docker run ubuntu:16.04
이를 단계적으로 실행하기 위해서는 다음과 같이 다운로드 부터 컨테이너 실행까지의 명령어를 입력해주면 됩니다.
$ docker pull ubuntu:16.04 : ubuntu 이미지를 로컬 레포지토리에 저장하기 위한 명령어
$ docker run ubuntu:16.04 : ubuntu 이미지를 컨테이너로 생성 및 실행하기 위한 명령어
$ docker container ls -a : docker의 컨테이너 목록을 확인하기 위한 명령어

-p host : container
앞에 port는 host에서 접근하기 위한 포트, 뒤는 container에서 응답하기 위한 포트를 말하며, 해당 포트 번호들을 포워딩해줍니다.
-e MYSQL_ALLOW_EMPTY_PASSWORD=true
root 패스워드를 설정하지 않기 위한 옵션입니다.
--name mysql
부여하는 컨테이너명, 부여하지 않게되면 랜덤으로 부여하기 때문에 찾기 어려워질 수 있습니다.
mysql:5.7
컨테이너 생성을 위한 이미지명입니다.

exec
실행된 컨테이너에 추가적인 작업을 해야할 경우 사용하는 명령어 입니다.
-it
키보드와 같은 인터렉티브한 장치로 커맨드를 작성하겠다는 의미?
mysql
컨테이너 명칭 또는 컨테이너 ID를 넣어줍니다.
bash
실해되는 컨테이너를 어떤 소프트웨어로 실행할것인지 결정하는 것을 의미합니다.
CMD 창에 다음과 같은 명령어를 입력해줍니다.
$ docker run -d -p 13306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql mysql:5.7

위와 같이 mysql 5.7 버전의 컨테이너가 정상적으로 실행된 것을 확인할 수 있습니다.
그 다음으로 docker logs 라는 명령어를 통해서 컨테이너가 실행 시 저장된 로그들을 확인할 수 있습니다.
$ docker logs [컨테이너명 | 컨테이너 ID]
아래와 같이 정상적으로 실행되었다는 로그를 확인할 수 있습니다.

그 다음으로 컨테이너로 접속 및 사용해보도록 하겠습니다.
$ docker exec -it mysql /bin/bash
컨테이너에 설치된 mysql 서버에 접속하기 위해 bash를 접근하여 다음과 같이 username, pssword, 접속 ip를 입력해주면 정상적으로 해당 db에 접속하게 됩니다.

해당 콘솔에서 mydb 라는 데이터베이스를 생성해보겠습니다.

정상적으로 생성된 것을 확인했고, 다음으로 다른 PC에서 해당 DB 서버로 접속한다는 것을 가정하여 HeidiSQL을 통해 해당 DB로 접속해보겠습니다.

위와 같이 접속 포트 번호를 13306번 포트로 설정한 뒤 접속해보면, 정상적으로 접속되며 생성한 mydb를 확인할 수 있습니다


💡 참고
우선, clean을 통해서 내부를 한번 정리해줍니다.
Tasks > build > clean 스크립트 실행
그 다음으로 build를 수행해줍니다.
Gradle Tab에서 Tasks > build > build 스크립트 실행
반드시 build한 뒤 생성되는 build 디렉토리와 동일한 depth의 위치에 생성해줘야 합니다.
Dockerfile 스크립트 작성
FROM openjdk:17-ea-11-jdk-slim
VOLUME /tmp
COPY build/libs/user-service-1.0.jar Userservice.jar
ENTRYPOINT ["java","-jar","UserService.jar"]
FROM : 베이스 이미지 지정VOLUMN : 이미지를 위한 볼륨 생성 - 가상의 디렉토리 생성COPY : 파일 디렉토리를 docker 컨테이너에 복사합니다. ADD와 다르게 URL 지정이 불가능합니다. 또한, 압축파일을 자동으로 풀어주지 않습니다.( 뒤에 Userservice.jar 는 컨테이너 내부에 어떤 명칭으로 복사할지 명시해줍니다.)ENTRYPOINT : docker 컨테이너가 시작 시, 실행하는 CMD 관련 명령어를 설정합니다.docker build --tag [도커허브계정]/user-service:1.0 .
user service 1.0 버전의 jar 파일을 담고있는 docker image 파일을 생성했습니다.
해당 파일을 dockerhub에 push 해보겠습니다.
docker push [도커허브계정]/user-service:1.0


정상적으로 dockerhub에 push 된 것을 확인할 수 있습니다.
우선, 로컬 레포지토리에 저장된 이미지를 삭제해줍니다.
$ docker rmi [이미지ID]


그 다음으로 dockerhub에 올라가있는 이미지 파일을 로컬 레포지토리에 내려받습니다.
$ docker pull kimhyensu/user-service:1.0


삭제되었던 user-service 이미지가 다시 생성된 것을 확인할 수 있습니다.
이제 해당 user-service.jar 파일을 실행해보도록 하겠습니다.
$ docker run [이미지명 | 이미지 ID]

다음과 같이 정상적으로 user-service가 실행된 것을 확인할 수 있습니다.
추가적으로 다음과 같이 -d 옵션을 추가하여 실행하게 되면, 백그라운드에서 해당 서비스를 기동할 수 있습니다.
$ docker run -d [이미지명 | 이미지ID]
아래와 같이 컨테이너 ID만 출력하고 백그라운드에서 실행하게 됩니다.
