Infra

도커(docker) 와 컨테이너 및 기본 명령어

계란💕 2023. 9. 4. 12:47

서비스 배포

  • 먼저, 인텔리제이에서 코드를 구현한다. 
  • 지금까지는 콘솔에 결과를 출력하거나 API를 호출해서 확인했다. 
  • 그런데 사용자들이 서비스를 사용하려면 서비스를 배포해야한다. 
    • 서버 컴퓨터를 구매해서 사용하거나 클라우드 서비스를 이용하는 방법이 있다. 
  • 온 프레미스(on premise) 방식으로 서버를 직접 구매해서 운영하려면 비용 부담이 크게 발생한다.
    • 온 프레미스 <=> 클라우드 서비스: ex) AWS

 


가상화(virtualization)

  • 하나의 물리 시스템에서 분리된 여러 환경을 구성하는 기술
  • 서버의 물리적인 자원을 최대한 효율적으로 활용하기 위한 기술이다. 
  • 가상화는 기술 개념이고 클라우드는 서비스 개념이다. 

 


가상 머신(virtual machine)과 컨테이너의 차이점

왼쪽의 도커 엔진 = 컨테이너 엔진.&nbsp; 출처 - https://www.docker.com/resources/what-container/

 

출처 - 드림코딩 앨리  https://www.youtube.com/watch?v=LXJhA3VWXFA&t=610s

 

  • 컨테이너와 VM은 유사하다. 하드웨어에서 격리된 환경 안에 애플리케이션배치한다는 공통점이 있다.
    • 차이: 격리시키는 범위가 다르다. 

 

 

가상 머신(VM, virtual machine)

  • 한 컴퓨터 안에 hypervisor(하이퍼바이저)가 물리 서버 자원들을 추상화하고 공간을 분할하여 가상머신이라는 가상환경의 서버를 이용한다.  
  • OS를 가상화하는 방식이다.  ex) VirtualBox, VMware
  • Host OS위에 Guest OS 전체를 가상화하여 사용한다. 
  • 각 VM에는 OS, 애플리케이션, 필수 바이너리 및 라이브러리의 전체 복사본이 포함되어 있으므로 수십 GB를 차지한다. 
  •  장점
    • 각 VM마다 독립된 하드웨어 자원을 갖는다. 
    • 사용법은 비교적 간단하다. 
    • 컨테이너에 비해서 더 높은 수준의 격리수준, 호환성을 제공한다. 
  •  단점
    • 가상 머신은 컴퓨터 안에 있는 자원을 분배해서 사용하기 때문에 성능 이슈가 있다. 
    • OS까지 가상화했기 때문에 속도가 느리다. 
    • 컨테이너에 비해서 훨씬 무겁고 복잡하다.
    • 가상화 오버헤드가 발생 가능하다. 
  • 컨테이너 기술이 탄생하기 전에 가상화 기술을 많이 이용했다. 
  • hypervisor(하이퍼바이저)란?
    • VM을 생성하고 구동하는 소프트웨어이다. Host 컴퓨터에서 다수의 OS를 동시에 실행하기 위한 논리적 플랫폼을  말한다. 가상화 머신 모니터 또는 가상화 머신 매니저라고도 부른다.
    • CPU, 메모리, 스토리지 등의 리소스를 처리하는 풀로 기존 게스트 간 또는 새로운 가상 머신에 쉽게 재배치할 수 있다.  
    • 하이퍼바이저를 사용하면 여러 개의 OS를 나란히 구동할 수 있고 하이퍼바이저를 사용해서 동일한 가상화 하드웨어 리소스를 공유할 수 있다. (가상화가 없으면 하드웨어에서 OS를 딱 하나만 구동할 수 있다.)

 

Note) 

  • 가상 머신은 각각 독립된 OS를 실행해서 높은 격리수준을 제공하나 무겁고 느림다. 
  • 컨테이너는 OS kernel을 공유하므로 가볍고 빠르고 효율적으로 리소스를 활용한다. 

 

 

 

컨테이너(container)

각 VM은 OS를 하나씩 가지고 컨테이너는 OS를 따로 포함하지 않는다.&nbsp; 출처 - 제로베이스

  • 컨테이너란 시스템의 다른 애플리케이션이나 다른 부분들에 영향을 주지 않는 격리된 공간을 의미한다. 
  • 실행 환경, 라이브러리, 시스템 도구, 실제 코드 등을 포함한다. 
    • 도커는 가상화의 기술을 보완하며 등장했다. 컨테이너는 이미지로부터 생성된다.
  • 컨테이너란 코드와 모든 종속성을 패키징하여 응용 프로그램이 한 컴퓨팅 환경에서 다른 컴퓨팅 환경으로 빠르고 안정적으로 실행시키는 소프트웨어 표준 단위를 말한다.    by) docker 공식 홈페이지
  • "프로세스"를 격리하므로 가볍고 빠르고 쉽고 효율적이다.
  • 컨테이너는 다양한 프로그램과 실행 환경 등을 추상화하고 동일한 인터페이스를 제공해서 프로그램의 배포와 관리를 단순화시킨다. 
  • 다시 말해, AWS, 구글 클라우드 등 어느 환경에서건 컨테이너 실행이 가능하다. 
  • 컨테이너는 프로세스, 하드웨어를 격리하지만 다른 컨테이너들과 동일한 커널(kernel)을 공유한다. 따라서 컨테이너는 OS를 내장할 필요없어서 매우 가볍다.  각 애플리케이션에 OS가 따로 따로 필요하지 않다. 

 

  • 공통점: 하나의 하드웨어 안에 격리된 환경을 구축해서 애플리케이션을 구동할 수 있다. 
  • 차이점 
    • 가상화: 각각의 가상 머신은 guest OS를 포함하고 있다. 이에 따른 리소스가 따로 필요하다. 
    • 컨테이너
      • 가상화에 비해 훨씬 경량화된 형태이다.
      • guest OS를 포함하지 않는다. 

 

  • 커널(kernel): 하드웨어와 프로세스 사이의 인터페이스 역할을 한다. 
    • 운영체제의 중심
    • 메모리 관리, 등등
    • 인터페이스 사용자 하드웨어에 접근하고 사용할 수 있도록 한다. 
    • https://oranthy.tistory.com/203

 

출처 https://www.redhat.com/ko/topics/virtualization/what-is-a-hypervisor

 

 


도커(docker)

 

도커(docker)

  • 컨테이너 기반의 오픈소스 가상화 플랫폼이다. 컨테이너 기술에 대한 사실상 표준.
  • 인프라에 관계 없이 항상 동일하게 실행 가능하다. 
  • Host OS 바로 위에서 동작하므로 가상화 비용이 발생하지 않는다.

 

 

도커(docker)를 사용하는 이유

  • 운영 표준화
    • 작은 컨테이너식 애플리케이션을 사용하면 배포나 운영이 수월해진다.
  • 높은 이식성: 컨테이너 환경에서 실행한다.   
    • 온프레미스에서 클라우드 환경으로 이전이 쉬워진다. 
    • ex) Mac 환경에서 개발하고나서 Linux 환경에서 배포한다고 생각해보자. 이 경우, 도커를 쓰지 않는다면 불편하고 번거로운 점이 많다. 
  • 비용 절감: 서버 비용을 줄일 수 있다. 

 

 

도커 이미지(Image)

  • 애플리케이션을  실행하기 위한 코드, 환경 변수, 종속성, 설정 값 등 모든 것을 포함하는 소프트웨어 패키지이다. 
  • 이미지는 컨테이너의 인스턴스 개념이다. 
  • 이미지가 도커 엔진에서 실행될 때 컨테이너가 된다. 
  • 컨테이너 생성과 관련된 내용(의존성, 환경 설정 등등 )이 포함된 템플릿을 뜻한다.
  • read-only 속성
  • 변경 불가능하며 변경하고 싶으면 새로 생성해야한다. 
  • 도커 레지스트리: 도커 이미지 저장하고 다운로드할 수 있는 저장소이다. 
  • 도커 허브라는 곳에 공유된 이미지를 사용할 수 있다. 
    • 도커 허브를 사용하면 Redis, Kafka 같은 솔루션이나 MySQL, Oracle 같은 DB 설치가 용이해진다. 
    • ex) Oracle을 실행하려면  초기에 setup 파일을 다운 받고 서버로 옮기고 실행하는 초기 설정 과정이있다. 그런데 도커를 쓰면 이미지를 pull, run만 하면 끝나서 굉장히 간단하다. 
    • 실제로 oracle의 경우, Mac 환경에서 설치하고 실행하려면 아주 번거롭다. 도커를 이용하면 1분도 안 걸린다.
  • 또는 직접 도커 파일을 작성하고 도커 레지스트리에 업로드해서 사용할 수도 있다.
  • 과정
    • 도커 레지스트리에서 다양한 소프트웨어 이미지를 가져올 수 있다.
    • 간단한 명령어를 통해 해당 이미지를 가져온다. 

 

 


Docker 명령어

  • docker image pull: 도커 레지스트리에서 이미지 가져오기
  • docker image rm: 이미지 제거
  • docker image ls: 현재 가지고 있는 이미지 조회
  • docker images: 현재 가지고 있는 이미지 조회
  • docker build: 도커파일로부터 도커 이미지를 빌드하는 명령어
  • docker start '컨테이너 ID': 컨테이너나 생성되어 있지만 실행 중이지는 않은 상태에 쓴다.  (생성하려면 CREATE를 먼저한다. )
  • docker restart '컨테이너 ID': 
  • docker stop '컨테이너 ID': 
  • docker run [OPTIONS] IMAGE: create + start 를 한번에 실행한다. 
  • docker ps: 컨테이너 리스트 및 상태 조회
  • docker  exec -it  CONTAINER_ID /bin/bash : 실행중인 컨테이너 명령어를 실행한다. 쉘 커맨드를 쓸 수 있다. 
  • docker logs CONTAINER: 컨테이너 로그 확인

 

 

  • docker run에서 d옵션: 해당 프로세스를 백그라운드로 실행한다. 

 

 


dockerfile

  • 도커 파일은 아래와 같이 만들고 프로젝트 
  • FROM 부분에는 자바 버전을 넣어준다. 
  • VOLUME /tmp
    • 볼륨이란 컨테이너호스트 사이에 데이터를 공유하고 저장하는 방법을 제공하는 중요 개념이다. 
    • 컨테이너가 종료되거나 삭제되더라도 데이터를 유지하고 여러 컨테이너 간에 데이터를 공유할 수 있다. 
    • 도커 컨테이너 안에 '/tmp' 디렉터리 내의 데이터를 컨테이너호스트 간에 공유한다. 
    • 컨테이너 간에도 데이터를 공유할 수 있다. 
  • ARG: 빌드 시에 사용되는 인자를 넣어준다. 
  • COPY: 호스트 머신의 빌드 디렉터리에서 지정된 JAR_FILE을 컨테이너 내부의 app.jar로 복사한다. 이렇게 하면 애플리케이션 jar 파일이 컨테이너 내부로 복사되며 실행된다. 
  • ENTRYPOINT: 컨테이너가 시작될 때, 실행할 명령어를 지정한다. 
<hide/>
FROM openjdk:17-alpine
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

 

 

참고 ) 도커를 사용한 spring 애플리케이션 실행하기

https://ttl-blog.tistory.com/761

 

 

 


title

  • con
  • con

 

 

 

출처 - https://zero-base.co.kr/classroom/210791