MSA/MSA 강좌 - 이도원 강사님
👨👧👦14. 컨테이너 가상화 (feat. Docker)
늦은산책
2024. 4. 16. 13:48
🌿 가상화
가상화란?
물리적인 컴퓨터 리소스를 다른 시스템이나 애플리케이션에서 사용할 수 있도록 제공한다
♪ 하이퍼바이저 (VMM - virtual Machine Manager)
가상화를 하기 위해 필요한 매니저를 지칭한다.
- 다수의 운영체제를 동시에 실행하기 위한 논리적 플랫폼을 뜻한다
- type 1 - Native or Bare-metal
- type 2 = Hosted
🌿 컨테이너 가상화
- OS Virtualization ( OS 가상화 )
- Host OS 위에 Guest OS 전체를 가상화한다
- VMWare, VirtualBox
- 자유도가 높으나 시스템에 부하가 많고 느려진다
- Container Virtualization ( 컨테이너 가상화 )
- Host OS 가 가진 리소스를 적게 사용하며, 필요한 프로세스를 실행한다
- 최소한의 라이브러리와 도구만 포함한다
- Container의 생성 속도가 굉장히 빠르다
♬ Container Image
컨테이너 실행시 필요한 설정 값을 모아놓은 것
우리는 앞으로 해당 이미지를 가지고 실체화하게되면 그것을 컨테이너라고 한다.
- 각각의 프로그램을 이미지화하여 만들게 된다
- 우리는 Local이라는 저장소에 해당 이미지를 모두 등록해 놓는다.
- 그러면 각각의 명령어를 통해 해당 이미지를 컨테이너화 하여 생성할 수 있다.
- 생성된 컨테이너는 포트번호를 열어서 외부의 사용자가 사용할 수 있게 설정한다.
🌿 Docker 사용
♬ DockerFile
- DockerImage를 생성하기 위해 작성하는 스크립트 파일이다
- 자체적인 DSL 언어를 사용한다. 언어의 과정은 이미지를 생성하는 과정이라고 할 수 있다.
- FROM : mysql 서버로 부터 이미지를 만들겠다
- ENV : 환경변수를 설정할 것이다.
- ADD : 가지고 있던 로컬의 파일을 이미지에 저장
- EXPOSE : 생성될 컨테이너가 외부에 오픈 될 포트번호
- CMD : 최종적으로 실행할 커맨드
♬ 도커 명령어
$ docker run [options] IMAGE[:TAG | @DIGEST] [COMMAND] [ARG]
- run : 가지고 있는 이미지로 컨테이너를 실행하는데 이미지가 없으면 다운로드도 진행한다
- IMAGE : 어떤 이미지를 사용할지 선택
- TAG : 명시하지 않으면 latest 가 붙는다.
- 뒤에는 추가적으로 파라미터의 용도로 생성시 추가적으로 전달할 다양한 옵션을 선택한다
♬ Docker 로 MariaDB 사용해보기
$ docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql mysql:5.7
- -d : 우리가 실행이 될 때 로그가 표시되지 않고 백그라운드로 실행하기
- -p : 포트 번호 설정 ( 앞포트:HOST, 뒷포트:컨테이너 포트 )
- -e : mysql:5.7 을 실행할때 패스워드를 입력해주어야 하기 떄문에 환경설정을 해주어야 한다.
- --name : 해당 컨테이너의 이름이다.
docker exec -it mysql bash
- 실제로 실행하는 명령어이다. -it 는 현재 실행할 컨테이너의 bash 를 작동시켜 터미널의 통해 데이터를 전달하겠다는 의미이다
- 그 이후 이렇게 작성을 해준다면 이미지를 통해 컴테이너로써 사용되는 마리아DB를 볼 수있다.
- 이는 로컬 환경의 화면에서도 확인 할 수 있다. 우리가 13306 으로 포트 번호를 열었으니 13306으로 연결을 해준다면 사진과 같은 결과를 볼 수 있다
🌿 Docker를 사용해서 UserService 이미지화해서 컨테이너로 실행해보기
♬ UserService 에 dockerFile을 만들어 사용하기
- 이렇게 최상위 폴더에 Dockerfile을 만들어주고 안에 스크립트 내용을 입력한다.
- FROM : base가 되는 image를 지정해주는 것이다. 없어도 docker가 알아서 다운로드해준다
- VOLUME : 호스트의 디렉토리와 도커 컨테이너가 연결되는 것이다
- COPY : 호스트 컴퓨터 내부에서 사용된 파일이 이미지 내부에서 사용될 이름으로 변경된다
- ENTRYPOINT : docker 가 실행될떄 기본 명령이다.
- java : java 가상 머신을 시작한다
- -jar : JAR 파일을 실행한다
- UserService.jar : 실행할 JAR 파일의 경로 및 이름이다.
아마 user-service-1.0.jar가 아닌 사람이 있을텐데 이는 pom에서 밑에 사진처럼 변경해주어야 한다.
♬ UserService 를 이미지화 하기
- 기존의 파일을 리셋하고 다시 compile한다. -D 옵션은 테스트 코드를 패스하고 컴파일한다는 뜻이다.
- 그리고 docker 의 build를 통해 이름이 담기고 태그가 담긴 이미지를 등록시킨다. 그리고 시간이 좀 걸리는 수행작업을 기다리게 되면 정상적으로 이미지로서 등록이 되는 모습을 볼 수 있다.
♬ UserService 를 DockerHub에 등록하기
- Git 과 비슷하게 push를 통해서 우리의 도커 hub로 이미지를 넣을 수 있다. 이때 우리의 닉네임이 꼭 적혀있어야 해당 이미지가 우리의 hub로 들어오게 될 것이다. 이렇게 우리의 UserService서버가 이미지로써 등록이 된 것을 확인 할 수 있다.
- 이제 도커에 등록되어 있는 UserService의 이미지를 삭제하고 다시 이미지를 등록하는 것이 가능하다
♬ Docker 에 이미지화 되어 있는 UserService 실행
- 이렇게 docker run을 통해 정상적인 실행이 되는 것을 볼 수 있다. 다만 우리는 UserService와 연동된 서비스와 데이터가 있기 때문에 정상적인 작동을 하진 않지만 확실히 작동이 된다는 것을 알 수있다.
이렇게 Docker를 이용해서 우리가 개발한 서비스를 이미지화 하고 추후에 컨테이너를 통해 서비스를 배포 할 수 있다는 것을 알게되었다. 앞으로 지금까지 만든 서비스를 Docker에 이미지화하여 작동하는 모습까지 실행해보자