Docker에서 컨테이너와 이미지의 차이점은 무엇입니까? [복제]
이 질문에는 이미 답변이 있습니다.
Docker에서 컨테이너와 이미지의 차이점은 무엇입니까? 에서 도커 시작하기 튜토리얼 이 용어를 모두 사용하지만 그 차이를 이해하지 않습니다.
누구든지 약간의 빛을 비출 수 있습니까?
이미지는 라이브 컨테이너의 고정 된 불변 스냅 샷입니다. 컨테이너가 일부 이미지 인스턴스를 실행 중이거나 중지 중입니다.
'ubuntu'라는 기본 이미지로 시작하십시오. 우분투 이미지 내에서 bash를 대화식으로 실행하고 파일을 만들어 봅시다. 대화 형 bash 쉘을 제공하기 위해 -i
and -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 서버 이미지를 작성하고 이미지를 실행 한 후 이미지를 나열한 후 컨테이너를 나열합니다.
다음 내용으로 Dockerfile을 작성하십시오.
FROM httpd:2.4
Apache 서버 설치
sudo docker build -t my-apache2 .
이미지를 실행
sudo docker run -it --rm --name my-running-app my-apache2
도커 이미지 목록
sudo docker images
실행중인 Docker 컨테이너 나열
docker ps
모든 컨테이너 목록
docker ps -a
최근에 만든 컨테이너 목록
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
이미지는 휴대 전화로 만든 사진입니다.
컨테이너는 전화입니다.
'Programing' 카테고리의 다른 글
저장소와 함께 Git 후크 스크립트를 관리 할 수 있습니까? (0) | 2020.03.18 |
---|---|
SQL Server에서 yes / no boolean 필드를 어떻게 작성합니까? (0) | 2020.03.17 |
json 객체 안에 키가 있는지 확인하십시오. (0) | 2020.03.17 |
반응-제어되지 않은 입력 변경 (0) | 2020.03.17 |
문자열 구분 기호 (표준 C ++)를 사용하여 C ++에서 문자열 구문 분석 (분할) (0) | 2020.03.17 |