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


923

Docker를 사용할 때 기본 이미지로 시작합니다. 부팅하여 변경 사항을 작성하면 해당 변경 사항이 다른 이미지를 형성하는 계층으로 저장됩니다.

결국 PostgreSQL 인스턴스 이미지와 웹 응용 프로그램 이미지가 유지되어 변경 사항이 계속 유지됩니다.

컨테이너 란?

답변:


1241

이미지의 인스턴스를 컨테이너라고합니다. 설명하는 것처럼 레이어 집합 인 이미지가 있습니다. 이 이미지를 시작하면이 이미지의 실행중인 컨테이너가 있습니다. 동일한 이미지의 많은 실행 컨테이너를 가질 수 있습니다.

모든 이미지를 docker images볼 수 있지만 실행중인 컨테이너는 docker ps(및 모든 컨테이너는 docker ps -a)를 볼 수 있습니다 .

따라서 이미지의 실행중인 인스턴스는 컨테이너입니다.


107
이미지와 중지 된 컨테이너의 차이점은 무엇입니까?
빅터 Dombrovsky

342
이미지는 레시피, 컨테이너는 케이크입니다 ;-) 주어진 레시피로 원하는만큼 케이크를 만들 수 있습니다
Julien

142
@VictorDombrovsky 정지 된 용기는 냉동실의 케이크입니다.
Jacob Ford

44
@Julien 이미지가 레시피라면 Dockerfile은 어떻습니까? :)
Johnny Willer

71
@JohnnyWiller Analogies에는 한계가 있지만 Dockerfile이 재료에 대한 쇼핑 목록임을 알 수 있습니다. ;-). 그렇지 않으면 Dockerfile을 레시피, 이미지, 몰드, 컨테이너가 여전히 맛있는 케이크라고 부릅니다
Julien

585

Docker 배포 자동화 에 대한 내 기사에서 :

도커 이미지와 컨테이너

Dockerland에는 이미지 가 있고 컨테이너있습니다 . 두 사람은 밀접한 관련이 있지만 별개입니다. 저 에게이 이분법을 이해하면 Docker가 엄청나게 명확 해졌습니다.

이미지 란 무엇입니까?

이미지는 본질적으로 컨테이너의 스냅 샷 인 비활성의 불변 파일입니다. 이미지는 build 명령으로 생성되며 run으로 시작할 때 컨테이너를 생성 합니다 . 이미지는 같은 도커 레지스트리에 저장됩니다 registry.hub.docker.com . 이미지는 상당히 커질 수 있기 때문에 이미지는 다른 이미지 레이어로 구성되어 네트워크를 통해 이미지를 전송할 때 최소한의 데이터를 전송할 수 있습니다.

다음을 실행하여 로컬 이미지를 나열 할 수 있습니다 docker images.

REPOSITORY                TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu                    13.10               5e019ab7bf6d        2 months ago        180 MB
ubuntu                    14.04               99ec81b80c55        2 months ago        266 MB
ubuntu                    latest              99ec81b80c55        2 months ago        266 MB
ubuntu                    trusty              99ec81b80c55        2 months ago        266 MB
<none>                    <none>              4ab0d9120985        3 months ago        486.5 MB

참고할 사항 :

  1. 이미지 ID는 이미지에 대한 실제 식별자의 처음 12 자입니다. 주어진 이미지의 많은 태그를 만들 수 있지만 ID는 모두 동일합니다 (위와 같이).
  2. 가상 크기는 가상 이 모든 별개의 기본 레이어의 크기를 합산 있기 때문에. 이는 해당 열의 모든 값의 합이 해당 이미지에서 사용되는 디스크 공간보다 훨씬 클 수 있음을 의미합니다.
  3. REPOSITORY 열의 값 -tdocker build명령 의 플래그 또는 docker tag기존 이미지 에서 가져옵니다 . 의미가있는 명명법을 사용하여 이미지에 자유롭게 태그를 지정할 수 있지만, docker는 태그를 레지스트리 위치로 docker push또는로 사용 docker pull합니다.
  4. 태그의 전체 형식은입니다 [REGISTRYHOST/][USERNAME/]NAME[:TAG]. 를 들어 ubuntu위, REGISTRYHOST는 것으로 추정된다 registry.hub.docker.com. 따라서 my-application레지스트리에서 호출 된 이미지를에 저장하려는 경우 docker.example.com해당 이미지에 태그를 지정해야합니다 docker.example.com/my-application.
  5. TAG 열은 전체 태그 의 [: TAG] 부분입니다 . 이것은 불행한 용어입니다.
  6. latest태그는 단순히 당신이 태그를 지정하지 않은 기본 태그의 마법이 아니다.
  7. 태그가없는 이미지는 IMAGE ID로만 식별 할 수 있습니다. 이것들은 <none>TAG와 REPOSITORY를 얻습니다 . 잊어 버리기 쉽습니다.

이미지에 대한 자세한 내용은 Docker 설명서용어집 에서 확인할 수 있습니다 .

컨테이너 란?

프로그래밍 은유를 사용하기 위해 이미지가 클래스 인 경우 컨테이너는 클래스의 인스턴스 (런타임 객체)입니다. 컨테이너는 Docker를 사용하는 이유입니다. 그것들은 응용 프로그램을 실행하는 환경을 가볍고 휴대용으로 캡슐화 한 것입니다.

다음을 사용하여 로컬 실행 컨테이너를 봅니다 docker ps.

CONTAINER ID        IMAGE                               COMMAND                CREATED             STATUS              PORTS                    NAMES
f2ff1af05450        samalba/docker-registry:latest      /bin/sh -c 'exec doc   4 months ago        Up 12 weeks         0.0.0.0:5000->5000/tcp   docker-registry

여기에도 커화 된 도커 레지스트리 버전을 실행 중이므로 이미지를 저장할 개인 공간이 있습니다. 다시 한 번 주목할 점은 다음과 같습니다.

  1. 이미지 ID와 마찬가지로 컨테이너 ID는 컨테이너의 실제 식별자입니다. 형식은 동일하지만 다른 종류의 개체를 식별합니다.
  2. docker ps실행중인 컨테이너 만 출력 합니다 . 로 모든 컨테이너 ( 실행 또는 중지 )를 볼 수 있습니다 docker ps -a.
  3. NAMES는 --name플래그 를 통해 시작된 컨테이너를 식별하는 데 사용될 수 있습니다 .

이미지 및 컨테이너 빌드를 피하는 방법

Docker에 대한 나의 초기 좌절 중 하나는 태그가없는 이미지가 지속적으로 쌓이고 컨테이너가 멈추는 것 같습니다 . 경우에 따라이 빌드 업으로 인해 하드 드라이브를 최대한 활용하여 랩탑 속도가 느려지거나 자동화 된 빌드 파이프 라인이 중단되었습니다. "모든 곳의 컨테이너"에 대해 이야기하십시오!

docker rmi최근 dangling=true쿼리 와 결합 하여 태그가없는 이미지를 모두 제거 할 수 있습니다.

docker images -q --filter "dangling=true" | xargs docker rmi

Docker는 기존 컨테이너 뒤에있는 이미지를 제거 할 수 없으므로 중지 된 컨테이너를 docker rm먼저 제거해야 할 수 있습니다 .

docker rm `docker ps --no-trunc -aq`

이것들은 Docker의 알려진 문제점 이며 향후 릴리스에서 해결 될 수 있습니다. 그러나 이미지와 컨테이너를 명확하게 이해하면 다음과 같은 몇 가지 사례를 통해 이러한 상황을 피할 수 있습니다.

  1. 로 쓸모없고 멈춘 용기를 항상 제거하십시오 docker rm [CONTAINER_ID].
  2. 로 쓸모없고 멈춘 용기 뒤에있는 이미지를 항상 제거하십시오 docker rmi [IMAGE_ID].

5
좋은 차별화 이미지와 컨테이너. 나와 같은 초보자에게 많은 도움이됩니다.
Gibbs

2
내가 붙어있는 것은 이미지가 어떻게 실행되는지에 달려 있습니다 (Windows에서는 boot2docker를 사용합니다). mysql과 같은 애플리케이션 용 이미지를 만드는 이유는 무엇입니까? 이 시점에서 mysql은 어떻게 실행됩니까? mysql을 실행하기 위해 Linux 이미지가 필요하지 않습니까?
Kenny Worden

실제로 이것은 사실이 아닙니다. "이미지의 : latest 태그를 당기면 적어도 두 개의 이미지가 로컬 이미지 목록에 추가됩니다. 하나는 최신 태그가 있고 하나는 최신 이미지의 각 원래 태그가 있습니다. 예 : 14.04 위의 시련. " 최신 태그가있는 이미지를 하나만 추가합니다. 이미지 ID가 동일하지만 나중에 14.04를 당기는 것은 작동하지 않을 수 있지만 여전히 별도의 당기기가 필요합니다.
Adrian Mouat

4
최신 버전의 도커에서는 docker image prune매달린 이미지를 정리 하는 데 사용할 수 있습니다 . 자두되지 않는 도커 객체
다리오 세이들이

3
난 그냥 docker system prune모든 것을 청소 하는 데 사용
라미 Alloush

137

쉬운 말로.

이미지 -

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

컨테이너 -

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


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


도커 데몬 -

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

도커 클라이언트 -

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

도커 스토어 -

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

이 블로그 게시물 의 사진은 천 단어의 가치가 있습니다.

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

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

요약:

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

1
감사. 다이어그램의 출처는 무엇입니까? Docker의 공식 문서에서 가져온 것입니까?

게시 된 이미지는 환상적 입니다. 내가 가진 한 가지 관심사 : 당신은 "일부 기사를 읽는 동안 발견했습니다"라고 말하십시오- 당신의 도표 가 아니라면 , 정당한 곳 ( "속성") 을 밝히는 것이 도덕적으로 중요하고 법적으로 요구됩니다. WHO? 원래 어떤 URL에서 찾았습니까?
ToolmakerSteve

@ToolmakerSteve 팁을 주셔서 감사합니다. 소스를 찾 자마자 기억하고 답변을 업데이트하겠습니다.
Imran Ahmad

126

그것이 실행 이미지로 용기를 생각하는 것이 가장 간단이지만,이없는 매우 정확한.

이미지는 실제로 컨테이너로 변환 할 수있는 템플릿입니다. 이미지를 컨테이너로 변환하기 위해 Docker 엔진은 이미지를 가져 와서 읽기-쓰기 파일 시스템을 추가하고 네트워크 포트, 컨테이너 이름, ID 및 리소스 제한을 포함한 다양한 설정을 초기화합니다. 실행중인 컨테이너에는 현재 실행중인 프로세스가 있지만 컨테이너를 중지 할 수도 있습니다 (또는 Docker의 용어로 종료 ). 종료 용기는 없다 다시 시작할 수 있고, 그 파일 시스템 설정 및 변경을 유지하므로, 화상과 같은.


이미지를 실행하지 않고 이미지를 컨테이너로 바꾸려면 어떻게해야합니까?
Janus Troelsen

12
@JanusTroelsen 사용 docker create.
Adrian Mouat

1
이것은 약간 혼란 스럽다. 이미지는 변경할 수 없지만 컨테이너로 실행하면 변경 가능한 최상위 레이어에 대한 변경 사항이 저장됩니다. 그러나 중지되면 이러한 변경 사항이 이미지에서이 새 레이어로 저장됩니까? 그렇다면 원본 이미지를 변경할 수 없었기 때문에 어떻게 가능했을까요?
Dchucks

4
좋아, 약간의 독서를 하고이 스레드 자체에서 답을 얻었습니다. "컨테이너가 삭제되면 쓰기 가능한 레이어도 삭제됩니다. 기본 이미지는 변경되지 않습니다."
척 척

매우 유용한 답변. 나는 전에 혼란 스러웠다. 이미지를 DL하고 컨테이너로 실행하고 임의의 텍스트 파일을 해당 컨테이너에 넣고 컨테이너를 중지하면 텍스트 파일이 중지 된 컨테이너에 있지만 다운로드 한 기본 이미지는 아닙니다.
James Allen

89

전체 워크 플로를 설명하면 도움이 될 수 있습니다.

모든 것은 Dockerfile로 시작합니다 . Dockerfile은 이미지의 소스 코드입니다.

Dockerfile이 작성되면 컨테이너 이미지 를 작성하도록 빌드합니다 . 이미지는 Dockerfile 인 "소스 코드"의 "컴파일 된 버전"입니다.

컨테이너 이미지가 있으면 레지스트리를 사용하여 재배포해야합니다 . 레지스트리는 Git 리포지토리와 비슷합니다. 이미지를 밀고 당길 수 있습니다.

다음으로 이미지를 사용하여 컨테이너 를 실행할 수 있습니다 . 실행중인 컨테이너는 여러 측면에서 가상 머신과 매우 유사하지만 하이퍼 바이저는 없습니다 .


44

워크 플로우

다음은 다양한 명령과 관련 입력 및 출력을 보여주는 종단 간 워크 플로입니다. 이미지와 컨테이너 사이의 관계를 명확히해야합니다.

+------------+  docker build   +--------------+  docker run -dt   +-----------+  docker exec -it   +------+
| Dockerfile | --------------> |    Image     | --------------->  | Container | -----------------> | Bash |
+------------+                 +--------------+                   +-----------+                    +------+
                                 ^
                                 | docker pull
                                 |
                               +--------------+
                               |   Registry   |
                               +--------------+

실행할 수있는 이미지를 나열하려면 다음을 실행하십시오.

docker image ls

컨테이너를 나열하려면 명령을 실행할 수 있습니다.

docker ps

1
:보다 포괄적 인 워크 플로우 다이어그램은이 참조 stackoverflow.com/a/46528745/714112
스리 Sarnobat

1
그러나 ASCII 아트에서 필요한 스크롤은 문제입니다.
피터 Mortensen

더 멋진 상자를 얻기 위해 유니 코드를 대신 사용할 수 있습니다. 온라인 도구는 Javascript Box Drawing Demo 입니다.
피터 Mortensen

40

여기서 모든 질문을 읽었음에도 불구하고 이미지레이어 의 개념을 이해할 수 없었고 결국 Docker (duh!) 의이 훌륭한 문서를 발견했습니다 .

예를 들어 전체 개념을 이해하는 것이 중요합니다. 긴 게시물이므로 명확성을 얻기 위해 실제로 파악해야 할 핵심 사항을 요약하고 있습니다.

  • 이미지 : Docker 이미지는 일련의 읽기 전용 레이어로 구성됩니다.

  • Layer : 각 레이어는 이미지의 Dockerfile에있는 명령어를 나타냅니다.

Example: 아래 Dockerfile에는 네 개의 명령이 있으며 각 명령은 레이어를 만듭니다.

우분투에서 : 15.04

복사 /앱

RUN make / app

CMD Python /app/app.py

중요한 것은 각 레이어는 이전 레이어와의 차이점 일뿐입니다.

  • 컨테이너 . 새 컨테이너를 만들 때 기본 레이어 위에 새 쓰기 가능한 레이어를 추가합니다 . 이 레이어를 종종 "컨테이너 레이어"라고합니다. 새 파일 작성, 기존 파일 수정 및 파일 삭제와 같이 실행중인 컨테이너에 대한 모든 변경 사항은이 얇은 쓰기 가능한 컨테이너 계층에 기록됩니다.

따라서 컨테이너와 이미지의 주요 차이점은 쓰기 가능한 최상위 레이어 입니다. 새 데이터를 추가하거나 기존 데이터를 수정하는 컨테이너에 대한 모든 쓰기는이 쓰기 가능 계층에 저장됩니다. 컨테이너가 삭제되면 쓰기 가능한 레이어도 삭제됩니다. 기본 이미지는 변경되지 않습니다.

디스크 크기 관점에서 이미지 cnd 컨테이너 이해

실행중인 컨테이너의 대략적인 크기를 보려면 docker ps -s명령을 사용할 수 있습니다 . 당신은 얻을 sizevirtual size출력의 두 가지로 :

  • 크기 : 각 컨테이너의 쓰기 가능한 레이어에 사용되는 데이터의 양 (디스크)

  • 가상 크기 : 컨테이너가 사용하는 읽기 전용 이미지 데이터에 사용되는 데이터의 양입니다. 여러 컨테이너가 일부 또는 모든 읽기 전용 이미지 데이터를 공유 할 수 있습니다. 따라서 이들은 부가되지 않습니다. 즉, 이미지에서 사용하는 디스크 크기를 계산하기 위해 모든 가상 크기를 추가 할 수 없습니다

또 다른 중요한 개념은 COW (Copy-On-Write) 전략입니다.

파일 또는 디렉토리가 이미지의 하위 계층에 존재하고 쓰기 가능한 계층을 포함한 다른 계층에 대한 읽기 액세스가 필요한 경우 기존 파일 만 사용합니다. 다른 레이어에서 파일을 처음 수정해야 할 때 (이미지를 작성하거나 컨테이너를 실행할 때) 파일이 해당 레이어에 복사되어 수정됩니다.

나 같은 사람을 도울 수 있기를 바랍니다.


1
이 의견에 감사드립니다. 크기와 가상 크기의 차이를 확인하고 여러 컨테이너가 동일한 읽기 전용 데이터를 공유하고 디스크 공간이 확보되는 여러 컨테이너에 대해 매우 방해합니다.
user1842947

34

Dockerfile → (빌드) → 이미지 → (실행) → 컨테이너 .

  • Dockerfile : 운영 체제를 원하는 방식으로 프로비저닝하고 모든 소프트웨어를 설치 / 구성하는 Docker 지침 세트가 포함되어 있습니다.

  • 이미지 : 컴파일 된 Dockerfile 컨테이너를 실행할 때마다 Dockerfile을 다시 작성하는 시간을 절약합니다. 또한 프로비저닝 코드를 숨기는 방법입니다.

  • 컨테이너 : 가상 운영 체제 자체 실제 환경 인 것처럼 ssh를 사용하여 원하는 명령을 실행할 수 있습니다. 동일한 이미지에서 1000 개 이상의 컨테이너를 실행할 수 있습니다.


뛰어난 유추. 내가 당신에게 1000 엄지 손가락을 줄 수 있다면 나는 할 것입니다.
리치 Lysakowski 박사

16

간단히 말해서, 이미지클래스 라면 컨테이너 는 클래스의 인스턴스는 런타임 객체 입니다.


13

컨테이너는 OS에 적용 할 제한 사항을 알려주는 방법을 알고있는 응용 프로그램 (예 : Docker)을 사용하여 미리 설정된 일련의 제한에 따라 호스트 OS에서 실행되는 실행 가능한 바이너리입니다.

일반적인 제한 사항은 프로세스 격리 관련, 보안 관련 ( SELinux 보호 사용 등) 및 시스템 리소스 관련 (메모리, 디스크, CPU 및 네트워킹)입니다.

최근까지 Unix 기반 시스템의 커널 만이 엄격한 제한 하에서 실행 파일을 실행하는 기능을 지원했습니다. 그렇기 때문에 오늘날 대부분의 컨테이너 대화에는 주로 Linux 또는 기타 Unix 배포판이 포함됩니다.

Docker는 OS (Linux의 대부분)에게 실행 파일을 실행하는 데 필요한 제한 사항을 알려주는 방법을 알고있는 응용 프로그램 중 하나입니다. 실행 파일은 Docker 이미지에 포함되어 있으며 tar 파일입니다. 이 실행 파일은 일반적으로 하나 이상의 응용 프로그램을 실행하도록 미리 구성된 Linux 배포판 (Ubuntu, CentOS, Debian 등)의 축소 버전입니다.

대부분의 사람들은 Linux 기반을 실행 파일로 사용하지만 호스트 OS가 실행할 수있는 한 다른 바이너리 응용 프로그램 일 수 있습니다 ( 처음 사용하여 간단한 기본 이미지 작성 참조 ). Docker 이미지의 이진 파일이 OS인지 아니면 응용 프로그램이든 OS 호스트의 경우 사전 설정된 OS 경계에 의해 지배되는 포함 된 프로세스 일뿐입니다.

Docker와 같은 다른 응용 프로그램은 호스트 OS에게 프로세스가 실행되는 동안 적용 할 경계를 LXC , libvirtsystemd 포함 할 수 있습니다. Docker는 이러한 응용 프로그램을 사용하여 Linux OS와 간접적으로 상호 작용했지만 Docker는 " libcontainer " 라는 자체 라이브러리를 사용하여 Linux와 직접 상호 작용합니다 .

따라서 컨테이너는 chroot 와 비슷하게 제한된 모드로 실행되는 프로세스 입니다.

Docker를 다른 컨테이너 기술과 차별화하는 IMO는 저장소 (Docker Hub) 및 컨테이너 작업을 매우 쉽게하는 관리 도구입니다.

Docker (소프트웨어)를 참조하십시오 .


12

Docker의 핵심 개념은이 경우 컨테이너로 간주 될 수있는 "기계"를 쉽게 만들 수 있도록하는 것입니다. 컨테이너는 재사용 성을 도와 컨테이너를 쉽게 만들고 떨어 뜨릴 수 있습니다.

이미지는 모든 시점에서 컨테이너의 상태를 나타냅니다. 기본 워크 플로는 다음과 같습니다.

  1. 이미지를 만들다
  2. 컨테이너를 시작하다
  3. 컨테이너를 변경하다
  4. 컨테이너를 이미지로 다시 저장

8

많은 답변이 아웃 지적 : 당신은 구축 Dockerfile을 얻을 이미지를 당신은 실행 이미지를 얻기 위해 용기를 .

그러나 다음 단계를 통해 Docker 이미지 및 컨테이너가 더 나은 느낌을 얻을 수 있습니다.

1) Dockerfile을 빌드하십시오.

docker build -t my_image dir_with_dockerfile

2) 이미지를 .tar파일 로 저장

docker save -o my_file.tar my_image_id

my_file.tar이미지를 저장합니다. 로 열면 tar -xvf my_file.tar모든 레이어가 표시됩니다. 각 레이어를 자세히 살펴보면 각 레이어에 어떤 변경 사항이 추가되었는지 확인할 수 있습니다. (Dockerfile의 명령에 매우 가깝습니다).

3) 컨테이너 내부를 살펴 보려면 다음을 수행하십시오.

sudo docker run -it my_image bash

OS와 매우 흡사하다는 것을 알 수 있습니다.


6

이미지 는 OOP의 클래스 정의와 동일하며 레이어는 해당 클래스의 다른 메소드와 속성입니다.

컨테이너 는 객체가 인스턴스화 또는 클래스의 인스턴스와 같은 이미지의 실제 인스턴스화입니다.


4

처음에 설명하는 것이 낫다고 생각합니다.

명령을 실행한다고 가정 docker run hello-world . 무슨 일이야?

Docker CLI 를 호출 하여 Docker 명령을 수행하고 Docker 서버 명령 을 호출하도록 변환 합니다. 즉시로 도커 서버가 실행 명령을 얻는 이미지를 ,이 검사는 날씨 이미지 캐시가 보유하고 이미지를 와 같은 이름을.

hello-world가 존재하지 않는다고 가정하십시오. Docker 서버Docker Hub (Docker Hub는 이미지의 무료 저장소 일뿐입니다)로 이동하여 Hub 라는 이미지hello-world있습니까? 허브 응답-그렇습니다. 그럼 제발주세요 그리고 다운로드 프로세스가 시작됩니다. Docker 이미지 가 다운로드 되 자마자 Docker 서버이미지를 이미지 캐시 에 넣습니다 .

Docker 이미지와 Docker 컨테이너가 무엇인지 설명하기 전에 컴퓨터의 운영 체제 및 소프트웨어 실행 방법에 대해 소개하겠습니다.

예를 들어 컴퓨터에서 Chrome을 실행하면 운영 체제를 호출하고 운영 체제 자체가 커널을 호출하고 묻습니다.이 프로그램을 실행하고 싶습니다. 커널은 하드 디스크에서 파일을 실행합니다.

이제 Chrome과 Node.js라는 두 가지 프로그램이 있다고 상상해보십시오. Chrome에는 Python 버전 2가 필요하고 Node.js에는 Python 버전 3이 필요합니다. 컴퓨터에 Python v2 만 설치 한 경우 Chrome 만 실행됩니다.

두 경우 모두 제대로 작동하려면 네임 스페이스라고하는 운영 체제 기능을 사용해야합니다. 네임 스페이스는 프로세스, 하드 드라이브, 네트워크, 사용자, 호스트 이름 등을 분리 할 수있는 기능입니다.

이미지 에 대해 이야기 할 때 실제로 파일 시스템 스냅 샷에 대해 이야기합니다. 이미지는 특정의 구축 방향 및 메타 데이터를 포함하는 실제 파일입니다 컨테이너를 . 용기 자체가 인스턴스 인 이미지 ; 이 컨테이너 에서만 사용할 수있는 네임 스페이스를 사용하여 하드 드라이브를 분리합니다 . 따라서 컨테이너 는 서로 다른 리소스가 할당 된 프로세스 또는 프로세스 집합입니다.


3

Docker 이미지는 응용 프로그램을 실행하는 데 필요한 응용 프로그램과 환경을 압축하며 컨테이너는 이미지의 실행중인 인스턴스입니다.

이미지는 "소스 코드"또는 "프로그램"과 유사한 Docker의 패킹 부분입니다. 컨테이너는 Docker의 실행 부분으로 "프로세스"와 유사합니다.

문제에서 "프로그램"부분 만 참조되며 이미지입니다. Docker의 "실행 중"부분은 컨테이너입니다. 컨테이너가 실행되고 변경되면 마치 프로세스가 자체 소스 코드를 변경하여 새 이미지로 저장하는 것과 같습니다.


3

프로그래밍 측면에서와 같이

이미지 는 소스 코드입니다.

소스 코드 가 컴파일되고 빌드 될 때 이를 애플리케이션이라고합니다.

"이미지에 대한 인스턴스가 생성 될 때"와 유사하게 " 컨테이너 "라고합니다.


1
Dockerfile은 소스 코드와 같습니다. 이미지는 소스 코드가 컴파일 / 빌드 된 후 실행 파일과 같습니다. 컨테이너는 실행 파일에서 실행되는 응용 프로그램과 같습니다.
ejlp12

이미지는 컨테이너의 소스 코드가 아닙니다. dockerfile은 클래스의 메타 클래스 또는 사양입니다. 이미지는 컨테이너의 클래스 또는 템플릿이고 컨테이너는 클래스의 인스턴스입니다. 컨테이너는 실행되는 인스턴스입니다. 클래스의 인스턴스는 1000 개가 될 수 있습니다. 이미지는 다른 프로그램에 연결되어 해당 프로그램의 일부로 실행될 수있는 컴파일 된 객체 코드와 같습니다.
Rich Lysakowski 박사

3

이미지 (A)의 "스냅 샷"입니다 용기 . 컨테이너에서 이미지를 만들 수 있고 (새 "스냅 샷") 이미지에서 새 컨테이너를 시작할 수도 있습니다 ( "스냅 샷"을 나타냄).

예를 들어 기본 이미지에서 새 컨테이너를 인스턴스화하고 컨테이너에서 일부 명령을 실행 한 다음 새 이미지로 스냅 샷 할 수 있습니다. 그런 다음 새 이미지에서 100 개의 컨테이너를 실행할 수 있습니다.

고려해야 할 다른 것들 :

  • 이미지는 레이어로 구성되며 레이어는 스냅 샷 "diff"입니다 (이미지를 푸시 할 때 레지스트리에 "diff"만 보내면 됨).
  • Dockerfile은 기본 이미지 위에 몇 가지 명령을 정의하여 새 이미지 ( "스냅 샷")를 생성하는 새 레이어 ( "diffs")를 만듭니다.
  • 이미지 태그는 단순한 태그가 아닙니다. 이미지의 "성명"( "repository : tag")입니다. 동일한 이미지의 이름이 여러 개인 경우을 수행 할 때 여러 번 표시됩니다 docker images.

이 답변은 거꾸로 있습니다. 컨테이너는 이미지의 인스턴스 또는 이미지의 실행 가능한 스냅 샷입니다. 이미지는 인스턴스의 상위 클래스이므로 직접 실행되지 않습니다. 인스턴스 (컨테이너)는 부모의 자식입니다 (인스턴스를 만들기위한 레시피 또는 템플릿)
Rich Lysakowski PhD

이 답변은 프로세스가 끝날 때 시작됩니다. 컨테이너의 스냅 샷으로 새 이미지를 만들 수 있지만 모든 컨테이너에는 부모 이미지가 있어야합니다. 이 경우 닭고기와 달걀 문제는 없습니다. 첫 번째 원시 이미지는 먼저 Dockerfile에서 빌드해야하기 때문입니다. 먼저 Dockerfile, 이미지, 컨테이너가 왔습니다. 컨테이너는 새 이미지의 기초로 사용될 수 있지만 해당 컨테이너에는 "부모 이미지"가 있어야합니다.
리치 Lysakowski 박사

3

docker images와 사이에 누락 된 부분을 채우고 싶습니다 containers. Docker 는 컨테이너에 UFS ( Union File System )를 사용하여 여러 파일 시스템을 계층 구조로 마운트하고 단일 파일 시스템으로 표시 할 수 있습니다. 이미지의 파일 시스템이 계층 으로 마운트되었으며 실행중인 컨테이너에 대한 변경 사항 이이 계층 위에 마운트 된 계층 으로 변경되었습니다 . 이 때문에 Docker는 실행중인 시스템에 대한 변경 사항을 찾기 위해 최상위 읽기-쓰기 계층 만 살펴 봐야합니다.read-onlyread-write


1

더미 프로그래밍 비유를 위해 Docker에는 상점 에서 가져온 ImageFactories를 보유하는 추상 ImageFactory가 있다고 생각할 수 있습니다 .

그런 다음 해당 ImageFactory에서 앱을 작성하려고하면 새 컨테이너가 생겨 원하는대로 수정할 수 있습니다. DotNetImageFactory는 원하는 팩토리 만 제공하는 추상 팩토리 클래스 역할을하기 때문에 변경할 수 없습니다.

IContainer newDotNetApp = ImageFactory.DotNetImageFactory.CreateNew(appOptions);
newDotNetApp.ChangeDescription("I am making changes on this instance");
newDotNetApp.Run();

1

한마디로 :

컨테이너는 일반적인 OS를 공유하고 이미지 (Docker 이미지)를 실행하는 커널의 부서 (가상)입니다.

컨테이너는 코드를 실행하기 위해 패키지와 필요한 모든 종속성이 함께있는 자체 지속 가능한 응용 프로그램입니다.


1

Docker 컨테이너가 이미지 인스턴스를 실행 중입니다. 프로세스와 이미지를 프로그램 및 컨테이너와 관련시킬 수 있습니다. :)


1

이미지는 객체의 컨테이너로 클래스에 있습니다.

객체는 클래스의 인스턴스이므로 컨테이너는 이미지의 인스턴스입니다.


1

Dockerfile은 tarball (Docker 이미지)을 생성하는 Bash 스크립트와 같습니다.

Docker 컨테이너는 tarball의 추출 버전과 같습니다. 다른 폴더 (컨테이너)에 원하는만큼의 사본을 가질 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.