답변:
이미지의 인스턴스를 컨테이너라고합니다. 설명하는 것처럼 레이어 집합 인 이미지가 있습니다. 이 이미지를 시작하면이 이미지의 실행중인 컨테이너가 있습니다. 동일한 이미지의 많은 실행 컨테이너를 가질 수 있습니다.
모든 이미지를 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
참고할 사항 :
-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
.latest
태그는 단순히 당신이 태그를 지정하지 않은 기본 태그의 마법이 아니다.<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
여기에도 커화 된 도커 레지스트리 버전을 실행 중이므로 이미지를 저장할 개인 공간이 있습니다. 다시 한 번 주목할 점은 다음과 같습니다.
docker ps
실행중인 컨테이너 만 출력 합니다 . 로 모든 컨테이너 ( 실행 또는 중지 )를 볼 수 있습니다 docker ps -a
.--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 image prune
매달린 이미지를 정리 하는 데 사용할 수 있습니다 . 자두되지 않는 도커 객체
docker system prune
모든 것을 청소 하는 데 사용
쉬운 말로.
이미지 -
컨테이너를 만드는 데 사용되는 파일 시스템 및 구성 (읽기 전용) 응용 프로그램입니다. 자세한 내용은 .
컨테이너 -
이들은 Docker 이미지의 인스턴스를 실행 중입니다. 컨테이너는 실제 응용 프로그램을 실행합니다. 컨테이너에는 응용 프로그램 및 모든 해당 종속성이 포함됩니다. 커널을 다른 컨테이너와 공유하고 호스트 OS의 사용자 공간에서 격리 된 프로세스로 실행됩니다. 자세한 내용은 .
주의해야 할 다른 중요한 용어 :
도커 데몬 -
Docker 컨테이너를 구축, 실행 및 배포하는 호스트에서 실행되는 백그라운드 서비스입니다.
도커 클라이언트 -
사용자가 Docker 데몬과 상호 작용할 수있는 명령 줄 도구입니다.
도커 스토어 -
Store는 무엇보다도 Docker 이미지의 레지스트리입니다. 레지스트리를 사용 가능한 모든 Docker 이미지의 디렉토리로 생각할 수 있습니다.
이 블로그 게시물 의 사진은 천 단어의 가치가 있습니다.
(더 깊은 이해를 위해 이것을 읽으십시오 .)
요약:
docker run image_name:tag_name
) => 실행중인 이미지 즉 컨테이너를 제공합니다 (편집 가능)그것이 실행 이미지로 용기를 생각하는 것이 가장 간단이지만,이없는 매우 정확한.
이미지는 실제로 컨테이너로 변환 할 수있는 템플릿입니다. 이미지를 컨테이너로 변환하기 위해 Docker 엔진은 이미지를 가져 와서 읽기-쓰기 파일 시스템을 추가하고 네트워크 포트, 컨테이너 이름, ID 및 리소스 제한을 포함한 다양한 설정을 초기화합니다. 실행중인 컨테이너에는 현재 실행중인 프로세스가 있지만 컨테이너를 중지 할 수도 있습니다 (또는 Docker의 용어로 종료 ). 종료 용기는 없다 다시 시작할 수 있고, 그 파일 시스템 설정 및 변경을 유지하므로, 화상과 같은.
docker create
.
전체 워크 플로를 설명하면 도움이 될 수 있습니다.
모든 것은 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) 전략입니다.
파일 또는 디렉토리가 이미지의 하위 계층에 존재하고 쓰기 가능한 계층을 포함한 다른 계층에 대한 읽기 액세스가 필요한 경우 기존 파일 만 사용합니다. 다른 레이어에서 파일을 처음 수정해야 할 때 (이미지를 작성하거나 컨테이너를 실행할 때) 파일이 해당 레이어에 복사되어 수정됩니다.
나 같은 사람을 도울 수 있기를 바랍니다.
Dockerfile → (빌드) → 이미지 → (실행) → 컨테이너 .
Dockerfile : 운영 체제를 원하는 방식으로 프로비저닝하고 모든 소프트웨어를 설치 / 구성하는 Docker 지침 세트가 포함되어 있습니다.
이미지 : 컴파일 된 Dockerfile 컨테이너를 실행할 때마다 Dockerfile을 다시 작성하는 시간을 절약합니다. 또한 프로비저닝 코드를 숨기는 방법입니다.
컨테이너 : 가상 운영 체제 자체 실제 환경 인 것처럼 ssh를 사용하여 원하는 명령을 실행할 수 있습니다. 동일한 이미지에서 1000 개 이상의 컨테이너를 실행할 수 있습니다.
컨테이너는 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 , libvirt 및 systemd 포함 할 수 있습니다. Docker는 이러한 응용 프로그램을 사용하여 Linux OS와 간접적으로 상호 작용했지만 Docker는 " libcontainer " 라는 자체 라이브러리를 사용하여 Linux와 직접 상호 작용합니다 .
따라서 컨테이너는 chroot 와 비슷하게 제한된 모드로 실행되는 프로세스 입니다.
Docker를 다른 컨테이너 기술과 차별화하는 IMO는 저장소 (Docker Hub) 및 컨테이너 작업을 매우 쉽게하는 관리 도구입니다.
Docker (소프트웨어)를 참조하십시오 .
많은 답변이 아웃 지적 : 당신은 구축 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와 매우 흡사하다는 것을 알 수 있습니다.
처음에 설명하는 것이 낫다고 생각합니다.
명령을 실행한다고 가정 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 만 실행됩니다.
두 경우 모두 제대로 작동하려면 네임 스페이스라고하는 운영 체제 기능을 사용해야합니다. 네임 스페이스는 프로세스, 하드 드라이브, 네트워크, 사용자, 호스트 이름 등을 분리 할 수있는 기능입니다.
이미지 에 대해 이야기 할 때 실제로 파일 시스템 스냅 샷에 대해 이야기합니다. 이미지는 특정의 구축 방향 및 메타 데이터를 포함하는 실제 파일입니다 컨테이너를 . 용기 자체가 인스턴스 인 이미지 ; 이 컨테이너 에서만 사용할 수있는 네임 스페이스를 사용하여 하드 드라이브를 분리합니다 . 따라서 컨테이너 는 서로 다른 리소스가 할당 된 프로세스 또는 프로세스 집합입니다.
프로그래밍 측면에서와 같이
이미지 는 소스 코드입니다.
소스 코드 가 컴파일되고 빌드 될 때 이를 애플리케이션이라고합니다.
"이미지에 대한 인스턴스가 생성 될 때"와 유사하게 " 컨테이너 "라고합니다.
이미지 (A)의 "스냅 샷"입니다 용기 . 컨테이너에서 이미지를 만들 수 있고 (새 "스냅 샷") 이미지에서 새 컨테이너를 시작할 수도 있습니다 ( "스냅 샷"을 나타냄).
예를 들어 기본 이미지에서 새 컨테이너를 인스턴스화하고 컨테이너에서 일부 명령을 실행 한 다음 새 이미지로 스냅 샷 할 수 있습니다. 그런 다음 새 이미지에서 100 개의 컨테이너를 실행할 수 있습니다.
고려해야 할 다른 것들 :
docker images
.docker images
와 사이에 누락 된 부분을 채우고 싶습니다 containers
. Docker 는 컨테이너에 UFS ( Union File System )를 사용하여 여러 파일 시스템을 계층 구조로 마운트하고 단일 파일 시스템으로 표시 할 수 있습니다. 이미지의 파일 시스템이 계층 으로 마운트되었으며 실행중인 컨테이너에 대한 변경 사항 이이 계층 위에 마운트 된 계층 으로 변경되었습니다 . 이 때문에 Docker는 실행중인 시스템에 대한 변경 사항을 찾기 위해 최상위 읽기-쓰기 계층 만 살펴 봐야합니다.read-only
read-write
더미 프로그래밍 비유를 위해 Docker에는 상점 에서 가져온 ImageFactories를 보유하는 추상 ImageFactory가 있다고 생각할 수 있습니다 .
그런 다음 해당 ImageFactory에서 앱을 작성하려고하면 새 컨테이너가 생겨 원하는대로 수정할 수 있습니다. DotNetImageFactory는 원하는 팩토리 만 제공하는 추상 팩토리 클래스 역할을하기 때문에 변경할 수 없습니다.
IContainer newDotNetApp = ImageFactory.DotNetImageFactory.CreateNew(appOptions);
newDotNetApp.ChangeDescription("I am making changes on this instance");
newDotNetApp.Run();
한마디로 :
컨테이너는 일반적인 OS를 공유하고 이미지 (Docker 이미지)를 실행하는 커널의 부서 (가상)입니다.
컨테이너는 코드를 실행하기 위해 패키지와 필요한 모든 종속성이 함께있는 자체 지속 가능한 응용 프로그램입니다.