[docker] Docker 이미지와 컨테이너의 차이점은 무엇입니까?
Docker를 사용할 때 기본 이미지로 시작합니다. 부팅하여 변경 사항을 작성하면 해당 변경 사항이 다른 이미지를 형성하는 계층으로 저장됩니다.
결국 PostgreSQL 인스턴스 이미지와 웹 응용 프로그램 이미지가 유지되어 변경 사항이 계속 유지됩니다.
컨테이너 란?
답변
이미지의 인스턴스를 컨테이너라고합니다. 설명하는 것처럼 레이어 집합 인 이미지가 있습니다. 이 이미지를 시작하면이 이미지의 실행중인 컨테이너가 있습니다. 동일한 이미지의 많은 실행 컨테이너를 가질 수 있습니다.
모든 이미지를 docker images
볼 수 있지만 실행중인 컨테이너는 docker ps
(및 모든 컨테이너는 docker ps -a
)를 볼 수 있습니다 .
따라서 이미지의 실행중인 인스턴스는 컨테이너입니다.
답변
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
참고할 사항 :
- 이미지 ID는 이미지에 대한 실제 식별자의 처음 12 자입니다. 주어진 이미지의 많은 태그를 만들 수 있지만 ID는 모두 동일합니다 (위와 같이).
- 가상 크기는 가상 이 모든 별개의 기본 레이어의 크기를 합산 있기 때문에. 이는 해당 열의 모든 값의 합이 해당 이미지에서 사용되는 디스크 공간보다 훨씬 클 수 있음을 의미합니다.
- REPOSITORY 열의 값
-t
은docker build
명령 의 플래그 또는docker tag
기존 이미지 에서 가져옵니다 . 의미가있는 명명법을 사용하여 이미지에 자유롭게 태그를 지정할 수 있지만, docker는 태그를 레지스트리 위치로docker push
또는로 사용docker pull
합니다. - 태그의 전체 형식은입니다
[REGISTRYHOST/][USERNAME/]NAME[:TAG]
. 를 들어ubuntu
위, REGISTRYHOST는 것으로 추정된다registry.hub.docker.com
. 따라서my-application
레지스트리에서 호출 된 이미지를에 저장하려는 경우docker.example.com
해당 이미지에 태그를 지정해야합니다docker.example.com/my-application
. - TAG 열은 전체 태그 의 [: TAG] 부분입니다 . 이것은 불행한 용어입니다.
latest
태그는 단순히 당신이 태그를 지정하지 않은 기본 태그의 마법이 아니다.- 태그가없는 이미지는 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
여기에도 커화 된 도커 레지스트리 버전을 실행 중이므로 이미지를 저장할 개인 공간이 있습니다. 다시 한 번 주목할 점은 다음과 같습니다.
- 이미지 ID와 마찬가지로 컨테이너 ID는 컨테이너의 실제 식별자입니다. 형식은 동일하지만 다른 종류의 개체를 식별합니다.
docker ps
실행중인 컨테이너 만 출력 합니다 . 로 모든 컨테이너 ( 실행 또는 중지 )를 볼 수 있습니다docker ps -a
.- 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의 알려진 문제점 이며 향후 릴리스에서 해결 될 수 있습니다. 그러나 이미지와 컨테이너를 명확하게 이해하면 다음과 같은 몇 가지 사례를 통해 이러한 상황을 피할 수 있습니다.
- 로 쓸모없고 멈춘 용기를 항상 제거하십시오
docker rm [CONTAINER_ID]
. - 로 쓸모없고 멈춘 용기 뒤에있는 이미지를 항상 제거하십시오
docker rmi [IMAGE_ID]
.
답변
쉬운 말로.
이미지 –
컨테이너를 만드는 데 사용되는 파일 시스템 및 구성 (읽기 전용) 응용 프로그램입니다. 자세한 내용은 .
컨테이너 –
이들은 Docker 이미지의 인스턴스를 실행 중입니다. 컨테이너는 실제 응용 프로그램을 실행합니다. 컨테이너에는 응용 프로그램 및 모든 해당 종속성이 포함됩니다. 커널을 다른 컨테이너와 공유하고 호스트 OS의 사용자 공간에서 격리 된 프로세스로 실행됩니다. 자세한 내용은 .
주의해야 할 다른 중요한 용어 :
도커 데몬 –
Docker 컨테이너를 구축, 실행 및 배포하는 호스트에서 실행되는 백그라운드 서비스입니다.
도커 클라이언트 –
사용자가 Docker 데몬과 상호 작용할 수있는 명령 줄 도구입니다.
도커 스토어 –
Store는 무엇보다도 Docker 이미지의 레지스트리입니다. 레지스트리를 사용 가능한 모든 Docker 이미지의 디렉토리로 생각할 수 있습니다.
이 블로그 게시물 의 사진은 천 단어의 가치가 있습니다.
(더 깊은 이해를 위해 이것을 읽으십시오 .)
요약:
- 풀 이미지 Dockerfile에서 부두 노동자 허브 또는 빌드에서이 =>은 도커 이미지 (편집되지 않음)를 제공합니다.
- 이미지 실행 (
docker run image_name:tag_name
) => 실행중인 이미지 즉 컨테이너를 제공합니다 (편집 가능)
답변
그것이 실행 이미지로 용기를 생각하는 것이 가장 간단이지만,이없는 매우 정확한.
이미지는 실제로 컨테이너로 변환 할 수있는 템플릿입니다. 이미지를 컨테이너로 변환하기 위해 Docker 엔진은 이미지를 가져 와서 읽기-쓰기 파일 시스템을 추가하고 네트워크 포트, 컨테이너 이름, ID 및 리소스 제한을 포함한 다양한 설정을 초기화합니다. 실행중인 컨테이너에는 현재 실행중인 프로세스가 있지만 컨테이너를 중지 할 수도 있습니다 (또는 Docker의 용어로 종료 ). 종료 용기는 없다 다시 시작할 수 있고, 그 파일 시스템 설정 및 변경을 유지하므로, 화상과 같은.
답변
전체 워크 플로를 설명하면 도움이 될 수 있습니다.
모든 것은 Dockerfile로 시작합니다 . Dockerfile은 이미지의 소스 코드입니다.
Dockerfile이 작성되면 컨테이너 이미지 를 작성하도록 빌드합니다 . 이미지는 Dockerfile 인 “소스 코드”의 “컴파일 된 버전”입니다.
컨테이너 이미지가 있으면 레지스트리를 사용하여 재배포해야합니다 . 레지스트리는 Git 리포지토리와 비슷합니다. 이미지를 밀고 당길 수 있습니다.
다음으로 이미지를 사용하여 컨테이너 를 실행할 수 있습니다 . 실행중인 컨테이너는 여러 측면에서 가상 머신과 매우 유사하지만 하이퍼 바이저는 없습니다 .
답변
워크 플로우
다음은 다양한 명령과 관련 입력 및 출력을 보여주는 종단 간 워크 플로입니다. 이미지와 컨테이너 사이의 관계를 명확히해야합니다.
+------------+ docker build +--------------+ docker run -dt +-----------+ docker exec -it +------+
| Dockerfile | --------------> | Image | ---------------> | Container | -----------------> | Bash |
+------------+ +--------------+ +-----------+ +------+
^
| docker pull
|
+--------------+
| Registry |
+--------------+
실행할 수있는 이미지를 나열하려면 다음을 실행하십시오.
docker image ls
컨테이너를 나열하려면 명령을 실행할 수 있습니다.
docker ps
답변
여기서 모든 질문을 읽었음에도 불구하고 이미지 와 레이어 의 개념을 이해할 수 없었고 결국 Docker (duh!) 의이 훌륭한 문서를 발견했습니다 .
예를 들어 전체 개념을 이해하는 것이 중요합니다. 긴 게시물이므로 명확성을 얻기 위해 실제로 파악해야 할 핵심 사항을 요약하고 있습니다.
-
이미지 : Docker 이미지는 일련의 읽기 전용 레이어로 구성됩니다.
-
Layer : 각 레이어는 이미지의 Dockerfile에있는 명령어를 나타냅니다.
Example
: 아래 Dockerfile에는 네 개의 명령이 있으며 각 명령은 레이어를 만듭니다.
우분투에서 : 15.04
복사 /앱
RUN make / app
CMD Python /app/app.py
중요한 것은 각 레이어는 이전 레이어와의 차이점 일뿐입니다.
- 컨테이너 . 새 컨테이너를 만들 때 기본 레이어 위에 새 쓰기 가능한 레이어를 추가합니다 . 이 레이어를 종종 “컨테이너 레이어”라고합니다. 새 파일 작성, 기존 파일 수정 및 파일 삭제와 같이 실행중인 컨테이너에 대한 모든 변경 사항은이 얇은 쓰기 가능한 컨테이너 계층에 기록됩니다.
따라서 컨테이너와 이미지의 주요 차이점은 쓰기 가능한 최상위 레이어 입니다. 새 데이터를 추가하거나 기존 데이터를 수정하는 컨테이너에 대한 모든 쓰기는이 쓰기 가능 계층에 저장됩니다. 컨테이너가 삭제되면 쓰기 가능한 레이어도 삭제됩니다. 기본 이미지는 변경되지 않습니다.
디스크 크기 관점에서 이미지 cnd 컨테이너 이해
실행중인 컨테이너의 대략적인 크기를 보려면 docker ps -s
명령을 사용할 수 있습니다 . 당신은 얻을 size
및 virtual size
출력의 두 가지로 :
-
크기 : 각 컨테이너의 쓰기 가능한 레이어에 사용되는 데이터의 양 (디스크)
-
가상 크기 : 컨테이너가 사용하는 읽기 전용 이미지 데이터에 사용되는 데이터의 양입니다. 여러 컨테이너가 일부 또는 모든 읽기 전용 이미지 데이터를 공유 할 수 있습니다. 따라서 이들은 부가되지 않습니다. 즉, 이미지에서 사용하는 디스크 크기를 계산하기 위해 모든 가상 크기를 추가 할 수 없습니다
또 다른 중요한 개념은 COW (Copy-On-Write) 전략입니다.
파일 또는 디렉토리가 이미지의 하위 계층에 존재하고 쓰기 가능한 계층을 포함한 다른 계층에 대한 읽기 액세스가 필요한 경우 기존 파일 만 사용합니다. 다른 레이어에서 파일을 처음 수정해야 할 때 (이미지를 작성하거나 컨테이너를 실행할 때) 파일이 해당 레이어에 복사되어 수정됩니다.
나 같은 사람을 도울 수 있기를 바랍니다.