ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Container & Docker
    개발/기술 2022. 2. 15. 20:00

    Container 

     

    컨테이너에 설명하기에 앞서 컨테이너 기술이 만들어진 이유를 소개하는게 좋을 것 같다. 우리가 사용하는 컴퓨터에는 여러개의 애플리케이션이 돌아가고 있다. 그리고 대부분의 애플리케이션은 OS에 설치된 라이브러리를 이용해 실행된다. Spring Boot의 경우 JAVA를 참조하고 C 언어로 이뤄진 게임의 경우 GCC 컴파일러를 이용해 실행하게 될 것 이다.

     

     

    모든 앱이 사용하는 라이브러리가 겹치지 않으면 상관 없다. 그런데 실행하는 앱 별로 필요한 라이브러리 버전이 다른 경우가 종종 있다. 어떤 앱은 Java8에서 실행해야 하는데 새로 배포하는 앱은 Java11 에서 실행되는 환경이 있다면? 일시적으로 링크를 따로 걸어서 해결 할 수 있지만 같은 로컬 환경에 두개의 라이브러리 버전을 관리하는 것도 골치아픈 일이다. 

     

     

    과거에는 이를 Virtual Machine 띄워 나눠서 관리 하려고 했었다. 물론 Virtual Machine을 사용할 수는 있으나 너무 무겁다는 단점이 있다. 물론 VM을 사용하면 커널을 다른 것을 쓸 수 있는 장점이 있으나 특유의 커널 옵션이 필요한 앱은 거의 없기 때문에 그다지 유용한 기능은 아니다. 그래서 Virtual Machine 보다 경량화된 형태로 만든 것이 Container다. 

     

     

    Container는 경량화된 VM으로 보면 된다. 로컬 호스트 머신처럼 Container 내부에도 동일하게 자체적인 라이브러리를 가질 수 있다. 그림상으로도 볼 수 있듯이 Container1에는 Java8을 Container2에는 Java11 을 설치했다. 별도의 Container에서 실행되기 때문에 의존성 이슈는 없어졌고 이를 통해 OS에 다른 버전을 관리해야 하는 번거로움이 없어졌다. 호스트의 많은 라이브러리를 참조해야 하는 경우 유용하게 사용할 수 있다.

     

    Docker 

     

    Docker는 Container를 실행 할 수 있는 응용 프로그램이다. 그림상에서도 Docker가 Container 안에서 실행되는데 이는 Docker가 실행 주체이기 때문이다. 2013년에 오픈소스로 시작됐고 지금은 개인이 쓰면 무료, 회사에서 쓰면 유료 버전으로 사용이 가능하다.

     

    Container 이미지 빌드

     

    Docker로 Container를 실행하는 것 뿐만 아니라 이미지를 만들 수도 있다. 여기서 말하는 이미지란, Container 내부의 환경을 말하며 그림을 예로 들면 내부에 Java8, App1 을 실행해둔 스냅샷 이미지를 의미한다. Dockerfile 이란 것을 이용해서 만들 수 있으며 기능이 정말 많다. 자세한 내용은 레퍼런스를 확인해보면 좋을 것 같다. 

     

    https://docs.docker.com/engine/reference/builder/

     

    Dockerfile reference

     

    docs.docker.com

     

    생성한 컨테이너 이미지는 설치된 Docker가 자체적으로 저장소 위치를 정한다. GUI로 된 Docker를 사용한다면 이미지에 접근 하는 것은 큰 어려움은 없다.

     

    Container 이미지 실행 

     

    앞서 설명한대로 Container 이미지를 실행 할 수 있다. GUI를 이용하는 방법과 CLI를 사용하는 방법이 있는데 GUI를 사용하는 방법이 편하다. 이미지를 실행한다는 것은 Container 내부 응용 프로그램을 실행하는 것으로 볼 수 있다.

     

    Docker + Container 사용

     

    Container를 사용해서 서버 배포를 한다면 같은 코드가 다른 서버 환경에서 실행 됐을 때의 오류를 줄일 수 있을 것이다. 또한 Docker를 이용해서 배포하는 코드가 작동하는 환경을 특정화 해뒀기 때문에 라이브러리가 맞지 않아서 발생 할 수 있는 문제도 줄어 들 것이다. 여러므로 귀찮은 의존성 관리를 일거에 해결해 줄 수 있는 툴이다.

    '개발 > 기술' 카테고리의 다른 글

    Kubernetes Object  (0) 2022.02.22
    cypher  (0) 2022.02.14
    Graph Database - neo4j  (0) 2022.01.24
    log4j 이슈 살펴보기  (1) 2021.12.13
    AOT(Ahead Of Time) Compiler  (0) 2021.11.26

    댓글 0

Designed by Tistory.