Programing

Docker에서 컨테이너와 이미지의 차이점은 무엇입니까?

lottogame 2020. 3. 17. 08:34
반응형

Docker에서 컨테이너와 이미지의 차이점은 무엇입니까? [복제]


이 질문에는 이미 답변이 있습니다.

Docker에서 컨테이너와 이미지의 차이점은 무엇입니까? 에서 도커 시작하기 튜토리얼 이 용어를 모두 사용하지만 그 차이를 이해하지 않습니다.

누구든지 약간의 빛을 비출 수 있습니까?


이미지는 라이브 컨테이너의 고정 된 불변 스냅 샷입니다. 컨테이너가 일부 이미지 인스턴스를 실행 중이거나 중지 중입니다.

'ubuntu'라는 기본 이미지로 시작하십시오. 우분투 이미지 내에서 bash를 대화식으로 실행하고 파일을 만들어 봅시다. 대화 형 bash 쉘을 제공하기 위해 -iand -t플래그를 사용할 것 입니다.

$ docker run -i -t ubuntu  /bin/bash
root@48cff2e9be75:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@48cff2e9be75:/# cat > foo
This is a really important file!!!!
root@48cff2e9be75:/# exit

이미지를 종료하고 다시 시작할 때 해당 파일이 달라 붙지 않도록하십시오. 중단 한 곳이 아니라 이전에 시작한 것과 동일한 정의 된 상태에서 다시 시작합니다.

$ docker run -i -t ubuntu  /bin/bash
root@abf181be4379:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@abf181be4379:/# exit

그러나 더 이상 실행되지 않는 컨테이너는 상태가되어 이미지에 저장 (확약) 될 수 있습니다.

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED              STATUS                          PORTS                      NAMES
abf181be4379        ubuntu:14.04        /bin/bash              17 seconds ago       Exited (0) 12 seconds ago                                  elegant_ardinghelli    
48cff2e9be75        ubuntu:14.04        /bin/bash              About a minute ago   Exited (0) 50 seconds ago                                  determined_pare        
...

컨테이너 ID 48cff2e9be75에서 이미지를 만들어 파일을 만들겠습니다.

$ docker commit 48cff2e9be75 ubuntu-foo
d0e4ae9a911d0243e95556e229c8e0873b623eeed4c7816268db090dfdd149c2

이제 우리는 정말로 중요한 파일을 가진 새로운 이미지를 얻었습니다 :

$ docker run ubuntu-foo /bin/cat foo
This is a really important file!!!!

명령을 시도하십시오 docker images. 이미지가 시작된 표준 이미지 ubuntu-foo와 함께 나열 되어야합니다 ubuntu.


이미지는 정렬 된 루트 파일 시스템 변경 모음과 컨테이너 런타임 내에서 사용하기위한 해당 실행 매개 변수입니다. 이미지는 읽기 전용입니다.

컨테이너는 이미지의 활성 상태 (종료 된 경우 비활성 상태)입니다.


객체 지향 프로그래밍 비유를 사용하면 Docker 이미지와 Docker 컨테이너의 차이는 클래스와 객체의 차이와 동일합니다. 객체는 클래스의 런타임 인스턴스입니다. 마찬가지로 컨테이너는 이미지의 런타임 인스턴스입니다.

객체는 인스턴스화 될 때 한 번만 생성됩니다. 마찬가지로 컨테이너가 실행 중이거나 중지되었을 수 있습니다. 컨테이너는 이미지에서 생성되지만 항상 그런 것은 아닙니다. 다음 예제는 Apache 서버 이미지를 작성하고 이미지를 실행 한 후 이미지를 나열한 후 컨테이너를 나열합니다.

  1. 다음 내용으로 Dockerfile을 작성하십시오.

    FROM httpd:2.4
    
  2. Apache 서버 설치

    sudo docker build -t my-apache2 .
    
  3. 이미지를 실행

    sudo docker run -it --rm --name my-running-app my-apache2
    
  4. 도커 이미지 목록

    sudo docker images
    
  5. 실행중인 Docker 컨테이너 나열

    docker ps
    
  6. 모든 컨테이너 목록

    docker ps -a
    
  7. 최근에 만든 컨테이너 목록

    docker ps -l
    

쉬운 말로.

이미지 -

컨테이너를 만드는 데 사용되는 파일 시스템 및 구성 (읽기 전용) 응용 프로그램입니다. 자세한 내용은 .

컨테이너 -

이들은 Docker 이미지의 인스턴스를 실행 중입니다. 컨테이너는 실제 응용 프로그램을 실행합니다. 컨테이너에는 응용 프로그램과 모든 종속성이 포함됩니다. 커널을 다른 컨테이너와 공유하고 호스트 OS의 사용자 공간에서 격리 된 프로세스로 실행됩니다. 자세한 내용은 .


주의해야 할 다른 중요한 용어 :


도커 데몬 -

Docker 컨테이너를 구축, 실행 및 배포하는 호스트에서 실행되는 백그라운드 서비스입니다.

도커 클라이언트 -

사용자가 Docker 데몬과 상호 작용할 수있는 명령 줄 도구입니다.

도커 스토어 -

Store는 무엇보다도 Docker 이미지의 레지스트리입니다. 레지스트리를 사용 가능한 모든 Docker 이미지의 디렉토리로 생각할 수 있습니다.

그림은 천 단어의 가치가 있습니다.

여기에 이미지 설명을 입력하십시오

(더 깊은 이해를 위해 이것을 읽으십시오 .)

요약:

  • 이미지 Dockerfile에서 부두 노동자 허브 또는 빌드에서이 =>은 도커 이미지 (편집되지 않음)를 제공합니다.
  • 이미지 실행 ( docker run image_name:tag_name) => 실행중인 이미지 즉 컨테이너를 제공합니다 (편집 가능)

이미지는 기본적으로 컨테이너를 만들기위한 변경 불가능한 템플릿입니다. 이미지가 컨테이너로 바뀌기 위해 발생하는 일을 고려하여 이미지와 컨테이너의 차이점을 이해하는 것이 더 쉽습니다.

Docker 엔진은 이미지를 가져 와서 읽기-쓰기 파일 시스템을 맨 위에 추가 한 다음 다양한 설정을 초기화합니다. 이러한 설정에는 네트워크 옵션 (IP, 포트 등), 이름, ID 및 모든 리소스 제한 (CPU, 메모리)이 포함됩니다. Docker 엔진이 컨테이너를 실행하라는 요청을 받으면 컨테이너 내부의 프로세스도 초기화됩니다. 컨테이너를 중지했다가 다시 시작할 수 있습니다.이 경우 모든 설정과 파일 시스템 변경 사항이 유지되지만 메모리에 아무것도 손실되지 않고 모든 프로세스가 다시 시작됩니다. 따라서 정지 내용 또는 종료 용기는 없는 화상과 동일.


DockerFile- (빌드)-> DockerImage- (실행)-> DockerContainer

DockerFile 은 사용자 또는 개발자가 코드를 작성하여 수행하는 작업입니다 (예 : 설치).

도커 이미지 는 도커 파일을 만들 때 얻을 수 있습니다.

Docker Container 는 Docker 이미지를 실행할 때 얻습니다.

도커 허브에서 Docker Image를 가져 와서 컨테이너를 가져 와서 실행할 수 있습니다.


[vm과 같은] 이미지

  • 컨테이너를 만드는 데 사용되는 읽기 전용 템플릿
  • 귀하 또는 다른 Docker 사용자가 Buuilt
  • Docker Hub 또는 로컬 레지스트리에 저장

컨테이너 [런닝 머신 등]

  • 격리 된 응용 프로그램 플랫폼
  • 응용 프로그램을 실행하는 데 필요한 모든 것을 포함합니다
  • 이미지 기반

컨테이너가 무엇인지 보여주는 이미지 링크


Docker에서는 이미지로 시작합니다. 이미지는 운영 체제에서 필요한 작업을 수행하기에 충분한 모든 파일입니다. 일반적으로 각 응용 프로그램에 대한 모든 것을 갖춘 전체 운영 체제를 설치합니다. Docker를 사용하면 필요한 작업을 수행하기에 충분한 운영 체제가있는 작은 컨테이너가 있고 컴퓨터에서 효율적으로 많은 컨테이너를 가질 수 있습니다.

사용 docker images설치된 이미지를 참조하고 docker ps실행 이미지를 볼 수 있습니다. 입력 docker run하면 이미지를 가져와 실행중인 프로세스가있는 살아있는 컨테이너로 만듭니다. 나는 사용하는 경향이있다 :

docker run -ti <image>:<tag>bash

마지막으로 이미지에는 고유 한 ID 세트가 있고 컨테이너에는 고유 한 ID 세트가 있으며 겹치지 않습니다.


컨테이너는 이미지를 기반으로합니다. 이미지는 Dockers run 명령으로 전달되어야합니다.

예:

BusyBox 이미지

http://i.stack.imgur.com/eK9dC.png

여기에라는 이미지를 지정합니다 busybox. Docker는이 이미지를 로컬로 가지고 있지 않으며 공개 레지스트리에서 가져옵니다.

레지스트리는 Docker 클라이언트가 통신하고 이미지를 다운로드 할 수있는 Docker 이미지 카탈로그입니다. 이미지를 가져 오면 Docker는 컨테이너를 시작하고 echo hello world 명령을 실행합니다.


이미지 : 컨테이너를 실행하는 데 필요한 파일 시스템 및 메타 데이터 응용 프로그램을 실행하기위한 모든 종속성과 해당 응용 프로그램을 실행하기위한 기본 설정을 포함하는 응용 프로그램 패키징 형식으로 생각할 수 있습니다. 메타 데이터에는 실행할 명령의 기본값, 환경 변수, 레이블 및 healthcheck 명령이 포함됩니다.

컨테이너 : 격리 된 응용 프로그램의 인스턴스입니다. 컨테이너는 초기 상태를 정의하기 위해 이미지가 필요하며 컨테이너 별 읽기 / 쓰기 파일 시스템과 함께 이미지의 읽기 전용 파일 시스템을 사용합니다. 실행중인 컨테이너는 실행중인 프로세스를 감싸는 래퍼로 파일 시스템, 네트워크 및 PID와 같은 프로세스 네임 스페이스를 제공합니다.

docker run명령 을 실행하면 구성과 함께 명령 줄에 이미지가 제공되고 docker는 해당 이미지 정의 및 제공 한 구성에 따라 컨테이너를 반환합니다.


참고 : 도커 엔진에서 이미지는 이미지 ID 일뿐입니다. 이것은 고유 한 불변 해시입니다. 이미지를 변경하면 새 이미지 ID가 생성됩니다. 그러나 심볼릭 링크와 달리 이미지 ID를 가리키는 하나 이상의 참조를 가질 수 있습니다. 그리고 이러한 참조는 새로운 이미지 ID를 가리 키도록 업데이트 될 수 있습니다. 컨테이너를 만들 때 docker는 컨테이너를 만들 때 해당 참조를 확인하므로 실행중인 컨테이너의 이미지를 업데이트 할 수 없습니다. 대신 새 이미지를 만들고 해당 새 이미지를 기반으로 새 컨테이너를 만듭니다.

레이어: 좀 더 깊이 파고 들면 파일 시스템 레이어가 있습니다. Docker는 계층화 된 파일 시스템으로 이미지를 어셈블합니다. 각 계층은 파일 시스템에 대한 읽기 전용 변경 사항 세트이며 해당 계층은 고유 한 해시로 표시됩니다. 이러한 읽기 전용 계층을 사용하면 여러 이미지가 다른 이미지를 확장 할 수 있으며 해당 이미지 간의 차이 만 네트워크를 통해 저장하거나 전송하면됩니다. Docker 컨테이너가 실행될 때 해당 컨테이너에 고유 한 컨테이너 특정 읽기 / 쓰기 파일 시스템 계층이 수신되고 모든 이미지 계층이 통합 파일 시스템을 사용하여 해당 계층과 조립됩니다. 파일을 찾거나 삭제하거나 맨 아래 계층에서 파일을 찾을 수 없을 때까지 각 계층을 통해 읽기가 처리됩니다. 쓰기는 이미지 읽기 전용 계층에서 컨테이너 특정 읽기 / 쓰기 계층으로 COW (Copy-On-Write)를 수행합니다. 그리고 컨테이너 특정 읽기-쓰기 계층에 대한 변경으로 삭제가 기록됩니다. 이미지를 빌드하는 일반적인 단계는 이전 이미지 파일 시스템 상태를 기반으로 임시 컨테이너에서 명령을 실행하고 결과 컨테이너 특정 레이어를 새 이미지의 레이어로 저장하는 것입니다.


도커 이미지 : 컨테이너를 빌드하고 실행하는 방법에 대한 명령 및 명령 목록이 포함되어 있습니다. 따라서 기본적으로 이미지에는 컨테이너를 시작하는 데 필요한 모든 데이터와 메타 데이터가 포함되어 있습니다 (청사진이라고도 함). 이미지를 지정하지 않으면 컨테이너를 점심 식사 할 수 없습니다.

$docker images centos

사용 가능한 모든 centos 버전을 나열하십시오.

Docker 컨테이너 : 컨테이너는 이미지에서 점심이므로 컨테이너는 이미지의 실행 인스턴스라고 말할 수 있습니다. 컨테이너는 빌드 시간 구성 인 이미지와 달리 런타임 구성입니다.


공식적인 차이점은 컨테이너가 쓰기 가능한 마지막 레이어이고 아래 레이어는 읽기만 가능하고 이미지에 속한다는 것입니다. 직관적 인 차이점은 docker 인스턴스는 docker 데몬과 이미지를 실행하여 가상화 된 인스턴스이며 커널의 격리 된 섹션 내에서 작동합니다 (이 프로세스는 숨겨져 있습니다). 그러나 이미지는 정적이며 실행되지 않으며 레이어 더미 (정적 파일) 일뿐입니다. 이 패러다임을 객체 지향 프로그래밍과 관련 시키면 이미지는 클래스 정의이고 도커 인스턴스는 메모리에 상주하는 클래스 생성 객체입니다.

도커 지식 직관을 강화하기 위해 자습서를 작성했습니다.

http://javagoogleappspot.blogspot.com/2018/07/docker-basics.html


이미지는 휴대 전화로 만든 사진입니다.
컨테이너는 전화입니다.

참고 URL : https://stackoverflow.com/questions/21498832/in-docker-whats-the-difference-between-a-container-and-an-image

반응형