Docker

뾰족머리삼돌이·2024년 1월 18일

서버

목록 보기
2/10

프로젝트를 진행하면서 서버구성 업무를 맡았을 때 사용했던 프로그램이다
그냥 도커없이 직접적으로 설치하면 되는거아니냐? 라고도 말할 수 있겠지만 도커가 가져다주는 장점을 생각해보면 사용할 가치가 충분하다

종종 잠에들기전에 이렇게 해보면 어떨까? 그게 뭐더라? 같은 생각을 하는 경우가 있다
같은 경우로 도커가 뭐지? 라는 의문을 가졌던 적이 있는데
그때 가장 먼저 떠오른게 이미지와 컨테이너였다

특정 프로그램을 위한 설계도인 이미지와 그를 따라 만들어낸 생산품인 컨테이너가 가장 먼저 떠오르는 도커의 특징이라고 할 수 있다

예를들어, Spring Boot로 백엔드 서버를 만들었다면 이를 jar파일로 만들어내고, jar파일을 이미지로 만든 다음, 이미지를 본뜬 컨테이너들을 생성해낸다

도커

도커(Docker)는 리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트이다. 위키피디아

도커를 이해하기 위해서는 가상화나 컨테이너, 애플리케이션의 배포단계에 대한 이해가 필요하다

도커가 등장하기 이전에도 컴퓨터상에 가상의 컴퓨터를 만들어내는 기술은 존재했고, 애플리케이션의 배포 또한 가능했다

그렇다면 도커는 어떤 특징때문에 사랑받는건지 알아보자

가상화

기존에는 가상머신(VM)을 이용해서 애플리케이션를 배포했다
여기서 가상화라는 개념이 들어가는데, 이는 하나의 컴퓨팅시스템에서 필요한 만큼 구분해내는 기술이다

예를 들어 총 100의 크기를 가지는 자원을 가지는 컴퓨터에 서버를 운용한다고 가정해보자

이때, 서버를 정상적으로 운용하기 위해서 필요한 자원은 20이다

만일 가상화가 없다면 이 서버를 구동하기 위해서 100의 크기를 모두 제공해야 한다
하지만 가상화가 도입된다면 만약의 상황을 대비해서 30의 크기를 제공하고 나머지는 다른 서버를 구동시킬 수 있다

즉, 컴퓨팅 자원을 효율적으로 사용하는 것을 통해 자원을 아끼는데 도움을 주는 기술이다
관련된 제품으로는 VMwareVirtualBox 등이 있다

단순하게 생각하면 내 PC에 또다른 OS를 가지는 PC를 만들어내서 동작시키는 기술이라고도 볼 수 있다
이때, 가상PC는 메인PC에 접근이 불가능하기 때문에 환경테스트 등을 수행하는 것 또한 가능하다

도커와 컨테이너

도커는 컨테이너를 이용한 가상화 기술이다
컨테이너란 애플리케이션을 운영하기 위해 필요한 만큼의 자원을 모아놓은 패키지라고 볼 수 있다

즉, 애플리케이션을 운영하기 위해 필요한 만큼의 자원만 모아놨기 때문에 가상화과정에서 OS와 같이 무거운자원을 포함하지 않는다
또한 컨테이너들은 서로 독립적이기 때문에 동시에 실행이 가능하며 가볍다는 장점이 있다


위 이미지는 기존 가상화 기술과 도커의 가상화를 비교해놓은 자료다

VM의 경우, 호스트 OS위에 각각의 게스트 OS를 설치하고 구동시킨다
반면 Docker의 경우, 호스트 OS를 공유하며 Docker Engine 위에서 컨테이너들을 구동시킨다

따라서 Docker는 VM에 비해 더 가볍고 부팅시간이 빠르다는 이점이 있다
또한, 별도의 OS를 필요하지 않기때문에 쉽게 Docker가 설치된 다른 컴퓨터에 이식이 가능하다
손쉽게 애플리케이션을 확장하고 복제하는 작업이 가능하다는 뜻 이다

하지만 호스트 OS를 공유한다는 사실은 특정 애플리케이션에 보안적인 위협이 있을 때 호스트 OS까지 영향을 끼칠 수 있다는 것을 의미하기도 한다

도커의 효용성

손쉽게 애플리케이션을 확장하고 복제하는 작업이 가능하다는 장점은 MSA와 잘 들어맞는다

MSA란, 기존의 모놀리식 아키텍처와 대비되는 개념이다

모놀리식 아키텍처는 전체 서비스에 하나의 서버를 가지는 구조를 의미한다
즉, 서비스를 구동시키기 위한 모든 기능이 한곳에 존재하는 것이다

반면 MSA( 마이크로 서비스 아키텍처 )는 기능을 분리해서 서비스마다 별도의 서버를 가지는 구조를 의미한다
기능별로 서버가 존재하며 서버간의 통신을 통해서 전체 서비스가 동작한다
기능단위의 테스트나 버전관리가 가능하며, 로드밸런싱을 통한 트래픽분산 등이 가능하다는 장점이 있다

도커는 이러한 MSA, 클라우드 환경과 잘 들어맞는 모습을 보이며, 쿠버네틱스( k8s )를 이용한 보다 효율적인 관리가 가능하다

도커의 사용

이론적인 내용을 얼추 알아봤으니 이제 실사용에 필요한 내용을 살펴보자
기본적인 설치와 관련된 내용은 공식문서를 참고하자

여기서는 자주 사용되는 명령어나 DockerFile에 대한 정리를 하려고한다
먼저 전체 명령어는 이곳, 또는 이곳에 정리되어있다

docker images : 현재 Docker에 저장되어있는 이미지목록
docker ps : 현재 실행중인 컨테이너 목록
docker build : DockerFile을 이용한 이미지 빌드
docker push : 레지스트리에 이미지 등록
docker rmi : 이미지 삭제
docker rm : 컨테이너 삭제
docker start : 컨테이너 실행
docker run : 이미지를 이용하여 컨테이너 생성
docker logs : 실행중인 컨테이너의 로그확인
docker image : 이미지 관리

DockerFile

자동으로 이미지를 생성하게 해주는 일종의 설계도
이미지를 생성하기전에 필요한 작업들을 미리 작성해두고 명령어를 이용해서 이를 실행시키는 구조를 가진다

관련 명령어는 이곳을 확인하자

FROM openjdk:11-jdk 
VOLUME /tmp
ARG JAR_FILE=./build/libs/back-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","app.jar"]

위는 간단한 Dockerfile의 예시다

  1. openjdk:11-jdk 이미지를 이용
  2. /tmp 경로에 볼륨 마운트 생성
  3. JAR_FILE 라는 변수에 ./build/libs/back-0.0.1-SNAPSHOT.jar를 대입
  4. app.jar라는 이름으로 복사
  5. 기본 실행파일 지정

이후 docker build 명령어를 이용하여 이미지를 생성하는게 가능하다

여기서 볼륨 마운트라는 용어가 등장한다

이는 Host OS의 특정 파일경로와 컨테이너 내의 파일경로를 매핑시켜서 컨테이너가 사라지더라도 파일이 남아있도록 하는데 필요하다

서로다른 컨테이너간 공유도 가능하다

참고

0개의 댓글