Docker를 사용할 때는 기본 이미지로 시작합니다. 부팅하고 변경 사항을 생성하면 이러한 변경 사항이 레이어에 저장되어 또 다른 이미지를 형성합니다.
따라서 결국에는 PostgreSQL 인스턴스용 이미지와 웹 애플리케이션용 이미지를 갖게 되고, 변경 사항은 계속 유지됩니다.
컨테이너란 무엇인가요?
Docker 배포 자동화]1에 대한 제 글에서 발췌한 내용입니다:
도커랜드에는 이미지와 컨테이너가 있습니다. 이 둘은 밀접한 관련이 있지만 구별됩니다. 저에게는 이 이분법을 이해함으로써 Docker가 엄청나게 명확해졌습니다.
이미지는 본질적으로 컨테이너의 스냅샷인 비활성, 불변의 파일입니다. 이미지는 build 명령으로 생성되며, run으로 시작하면 컨테이너를 생성합니다. 이미지는 registry.hub.docker.com와 같은 Docker 레지스트리에 저장됩니다. 이미지는 상당히 커질 수 있기 때문에 다른 이미지의 레이어로 구성되도록 설계되어 네트워크를 통해 이미지를 전송할 때 최소한의 데이터만 전송할 수 있습니다.
로컬 이미지는 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
참고 사항:__몇 가지 사항
docker build
명령의 -t
플래그 또는 기존 이미지에 docker tag
를 지정한 값입니다. 자신에게 맞는 명명법을 사용하여 이미지에 자유롭게 태그를 지정할 수 있지만, 도커는 이 태그를 도커 푸시
또는 도커 풀
에서 레지스트리 위치로 사용한다는 것을 알아두세요.입니다. 위의
ubuntu의 경우 REGISTRYHOST는
registry.hub.docker.com으로 유추됩니다. 따라서
docker.example.com의 레지스트리에
my-application이라는 이미지를 저장하려는 경우, 해당 이미지에
docker.example.com/my-application`이라는 태그를 지정해야 합니다.없음
태그와 저장소가 표시됩니다. 잊어버리기 쉽습니다.이미지에 대한 자세한 정보는 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
여기서는 도커화된 버전의 도커 레지스트리를 실행하고 있으므로 이미지를 저장할 개인 공간이 있습니다. 다시 한 번 주의할 점이 있습니다:
는 _실행 중인_ 컨테이너만 출력합니다. 도커 ps -a
로 모든 컨테이너(_실행 중이거나 중지된)를 볼 수 있습니다.이미지 및 컨테이너 빌드 업을 피하는 방법 ###
Docker를 사용하면서 초기에 불만스러웠던 점 중 하나는 태그가 지정되지 않은 이미지와 중지된 컨테이너가 계속 쌓이는 것이었습니다. 몇 번은 이렇게 이미지가 쌓여 하드 드라이브가 최대치에 도달하여 노트북 속도가 느려지거나 자동화된 빌드 파이프라인이 중단되기도 했습니다. '모든 곳에 컨테이너'가 있다니까요!
docker rmi와 최근의
dangling=true` 쿼리를 결합하여 태그가 지정되지 않은 이미지를 모두 제거할 수 있습니다:
docker images -q --filter "dangling=true" | xargs docker rmi
도커는 기존 컨테이너 뒤에 있는 이미지를 제거할 수 없으므로 먼저 docker rm
으로 중지된 컨테이너를 제거해야 할 수 있습니다:
docker rm `docker ps --no-trunc -aq`
이는 Docker의 알려진 문제점이며 향후 릴리스에서 해결될 수 있습니다. 그러나 이미지와 컨테이너에 대한 명확한 이해가 있다면 몇 가지 방법을 통해 이러한 상황을 피할 수 있습니다:
docker rm [CONTAINER_ID]
로 제거하세요.docker rmi [IMAGE_ID]
로 제거합니다.컨테이너를 실행 중인 이미지로 생각하는 것이 가장 간단하지만, 이는 정확하지 않습니다.
이미지는 실제로 컨테이너로 전환할 수 있는 템플릿입니다. 이미지를 컨테이너로 전환하기 위해 Docker 엔진은 이미지를 가져와 그 위에 읽기-쓰기 파일 시스템을 추가하고 네트워크 포트, 컨테이너 이름, ID 및 리소스 제한을 포함한 다양한 설정을 초기화합니다. 실행 중인 컨테이너에는 현재 실행 중인 프로세스가 있지만, 컨테이너를 중지(또는 Docker 용어로 종료)할 수도 있습니다. 종료된 컨테이너는 다시 시작할 수 있고 설정 및 모든 파일 시스템 변경 사항을 유지하므로 이미지와 같지 않습니다.
간편한 것이다.
>. 데 사용되는 파일 시스템 및 응용 프로그램 구성 (읽기 전용) >. 만드시겠습니까 컨테이너입니다. [자세한 내용] [1].
>. 이러한 실행됩니까 인스턴스를 부두노동자 이미지. 실제 컨테이너입니다 실행하십시오 >. 응용 프로그램. 모든 응용 프로그램 및 컨테이너입니다 포함되어 있다. >. 종속물과의. 다른 커널 정보기술 (it) 주들이 컨테이너입니다 함께 운영하고 있다 >. 사용자 공간에서 격리된 프로세스일까요 호스트에서와 OS. [자세한 내용] [2].
부두 노동자 데몬입니다 -
>. 건물, 배경을 호스트입니다 실행되는 관리 서비스 >. 실행 및 분포하면 부두노동자 컨테이너입니다.
부두 노동자 클라이언트입니다 -
>. 사용자 상호 작용할 수 있는 부두 노동자 명령줄이 도구에서는 >. 데몬입니다.
부두 노동자 작성하든지 -
>. Store 는 부두 노동자, 그밖에 다른 것들로, 레지스트리 등을 지원한다. 수 있습니다. >. 사용 가능한 모든 부두 노동자 레지스트리로 디렉터리이고 것 같은 이미지.
사진 (이 블로그 포스트] 에서 3 은 천 마디 말보다.
(이해 이 대해 좀 더 자세히 읽어 보십시오.)
요약:
, 이미지 또는 부두노동자 허브 구축 = > 도커피레 에서 당기십시오 에서 - 는 부두 노동자 이미지 (편집 불가).
[1]: https://docs.docker.com/storage/storagedriver/ # 이미지 및 레이어에도 [2]: https://docs.docker.com/storage/storagedriver/ # 컨테이너 및 레이어에도
아마 전체 워크플로에 설명하는 데 도움이 될 수 있습니다.
일단 도커피레 만든 후에는 迈向 구축하십시오 만듭다 이미지 컨테이너. 그냥 " 이미지가 컴파일됨 version"; 이 소스 code" "; 이는 도커피레.
나면 컨테이너인 이미지를 통해 이 레지스트리로 재분포 합니다. 깃 (git) 은 마치 레지스트리로 리포지토리를 - 이미지 및 당기십시오 누름식 수 있습니다.
, 컨테이너입니다 실행하십시오 다음 이미지를 사용할 수 있습니다. 매우 유사하기 때문에 대부분의 애스펙트에서 실행 중인 컨테이너입니다 가상 머신 (제외) 이 하이퍼바이저).
다음은 보여주는 완벽한 워크플로에 여러 명령 및 관련 투입물 및 출력입니다. 그 이미지를 컨테이너입니다 사이의 관계를 분명히 밝혀야 한다.
+------------+ docker build +--------------+ docker run -dt +-----------+ docker exec -it +------+
| Dockerfile | --------------> | Image | ---------------> | Container | -----------------> | Bash |
+------------+ +--------------+ +-----------+ +------+
^
| docker pull
|
+--------------+
| Registry |
+--------------+
실행하십시오 실행하십시오 이미지를 표시할 수 있습니다.
docker image ls
나열하십시오 컨테이너입니다 데 대한 명령을 실행할 수 있습니다.
docker ps
내가 couldn& 와 # 39 의 이미지, 이해하지 总监和首席信息官完全了解 레이어에는 여기 그리고 결국 이 모든 질문에 대한 불구하고 판독값 빛위에 발견했다 [뛰어난 문서용으로 부두노동자 에서] [1] (대만족!).
정말 이해할 수 없는 예는 모든 핵심 개념이다. 그래서 저는 컴포지션이 긴 게시물로의, 요약 할 수 있는 핵심 포인트는 정말 선명하게 들어왔다.
'예': 각각 4 개의 명령 아래 도커피레 map_layer 레이어를 생성합니다.
>. Ubuntu:15.04 에서
>. 복제본입니다. /app
>. 실행하십시오 /app 만들기
>. CMD 파이썬 /app/app.py
, 중요한 것은 각 레이어마다 전에 일련의 의 차이점은 레이어에는 불과하다.
>. 이에 따라 주요 차이점은 컨테이너입니다 및 이미지가 >. 상위 쓸 수 있는 레이어에는 . 새로 추가할 수 있는 모든 쓰기뿐만 컨테이너입니다 또는 >. 기존 데이터를 저장하는 수정하십시오 이 쓸 수 없습니다. 이 때 >. 컨테이너입니다 삭제되고, 쓰기 가능한 레이어에는 삭제됩니다. 이 >. 기본 이미지 그대로 유지됩니다.
실행 중인 컨테이너 부두 노동자 대략적인 표시하십시오 ps - s ',' 함장님이요 사용할 수 있습니다. 확보하십시오 '크기' 와 '가상' 으로 크기를 두 개의 출력:
Size: 더 많은 양의 데이터를 쓸 수 있는 디스크의) 각 컨테이너입니다 레이어에는 사용됩니다.
가상 크기: 이미지를 사용하는 데이터를 읽기 전용으로 사용되는 데이터 양을 컨테이너입니다. 읽기 전용 여러 컨테이너입니다 일부 또는 모든 이미지 데이터를 공유할 수 있습니다. 업그레이드됨 그것은꿈의 안 한다. I. e. 너회가 can& t 추가 # 39, 모든 가상 디스크 이미지 크기 크기가 얼마나 계산하십시오 의해 사용되며,
낮은 경우, 또 다른 파일이나 디렉토리가 이미지 내의 레이어에는 레이어에는 액세스할 수 있도록 하는 등 쓰기 가능한 레이어에는) 는 기존 파일 읽기, 그냥. 처음 하는 다른 레이어에는 수정하십시오 파일 (만들 때 이미지 또는 실행 컨테이너입니다) 파일이 있는 복사됩니다 레이어에는 및 수정되었습니다.
수 있는 나 같은 다른 사람이 됐으면 좋겠다 "고 말했다.
[1]: https://docs.docker.com/engine/userguide/storagedriver/imagesandcontainers/ # 컨테이너입니다 디스크의 크기
, &Amp 도커피레 라르. (구성) & 라르;; 이미지 & 라르;; (실행) & 라르;; 컨테이너입니다 .
이제 막 컨테이너입니다 실행 가능한 바이너리입니다 호스트 OS 에서 실행할 수 있는 일련의 제한사항에 프리셋의 아래에 있는 것을 알 수 있는 방법을 알고 있는 OS 를 사용하는 응용 프로그램 (예, 부두 노동자) 제한사항에 적용하십시오.
일반적인 제한은 프로세스 격리인 관련, 보안 관련 (사용할 때와 같이 selinux 보호) 및 시스템 리소스 관련된 (메모리, 디스크, cpu, 네트워킹).
최근까지, 오직 커널 기반 시스템 지원 아래에 있는 실행 파일을 실행할 수 있는 능력을 엄격한 제한. 오늘 왜 that& # 39 의 대부분의 리눅스 배포판 또는 다른 Unix 部门从 의논하십시오 컨테이너입니다 대부분.
부두 노동자 중 하나가 바로 이러한 응용 프로그램을 실행할 수 있는 방법을 알고 있는 것을 알 수 있는 OS (Linux 대부분) 무슨 제한사항에 실행가능파일. 실행 파일은 이미지, 이는 부두노동자 포함된 단순한 타르피레. 일반적으로 해당 실행가능파일 남긴 버전의 리눅스 배포판 (우분투, CentOS 데비안 등) 로 구성된 한 개 이상의 애플리케이션을 실행하십시오 내에서.
비록 대부분의 리눅스 응용 프로그램 이진 실행 파일을 사용할 수 있지만 다른 사람들이 기준으로 deltamove 호스트 OS 이를 실행할 수 있습니다 (자세한 내용은 [간단하게 만들기 기본 이미지로 스크래치] [2]). 컴퓨터 운영 체제 (os) 가 부두노동자 이미지는 바이너리 나열할지 있는 응용 프로그램, 또는 단순히 os 에 의해 통치되는 v2.03-00 프로세스가 다른 프로세스 바로 호스트입니다 프리셋의 os 경계입니다.
말할 수 있으며, 부두 노동자, 다른 응용 프로그램들과 같은 호스트 OS 경계에 있는 실행 중인 프로세스를 적용하십시오 포함시키십시오 LXC, 리브버트 및 systemd. 이러한 응용 프로그램을 사용하여 상호 작용할 수 있지만, 이제 리눅스 운용체계 (os) 를 사용하여 간접적으로 부두노동자 부두노동자 linux*용 상호 직결됨 삼성물산도 자체 라이브러리 호출됨 " [리브콘타이너], 6 ".
그래서 컨테이너입니다 에서 실행 중인 프로세스를 제한되었거나 모드, 단지 어떤 유사한 chroot 행하던.
IMO, 어떤 집합 (부두노동자 허브) 와 별도로 해당 기술은 다른 컨테이너 부두 노동자 리포지토리를 자사의 관리 도구를 아주 쉽게 작업할 수 있는 컨테이너입니다.
지켜보리니 부두 노동자 (소프트웨어) .
[2]: # /creating-a-simple-base-image-using-scratch https://docs.docker.com/engine/userguide/eng-image/baseimages/
이 많은 답변 abc. 아웃해야: 이미지를 얻기 위해 도커피레 구축하십시오 있습니다 컨테이너입니다 진실이며당신이 실행하십시오 이미지를 얻기 위해.
그러나 나를 도와준 다음 단계를 어떻게 부두노동자 및 컨테이너입니다 이미지를 더욱 쉽게 이해할 수 있다.
t my_image dir_with_dockerfile 구축하십시오 '부두 노동자'
o '저장' 부두 노동자 my_file.tar my_image_id
'이미지' my_file.tar 저장됩니다. Tar 파일을 열기 '-', 그리고 모두 볼 수 있는 스베프 my_file.tar 레이어에는 얻을 수 있습니다. 심도 있게 다루고 있는 경우 각 레이어마다 볼 수 있는 어떤 변화가 각 레이어마다 추가되었다. (아주 가까이 있는 명령을 도커피레 해야 한다).
sudo 부두노동자 my_image 배시 '이' 실행하십시오 -
컴퓨터 운영 체제 (os) 가 있는 것을 볼 수 있어 매우 유사합니다.
응용 프로그램을 실행할 수 있는 이미지 팩을 백업하도록 부두노동자 및 환경 및 컨테이너입니다 요구하는 응용 프로그램 실행 중일 인스턴스입니다 이미지를 삭제합니다.
이 이미지는 부두노동자, 포장, 소스 일부가 " code" 비슷하다. 또는 program" ";). 컨테이너 부두 노동자,,) 는 " process" 오른길로 엑서큐션 일부를 비슷하다.
[질문] 에서 유일하게 " program"; ) 는 부품 및 that& # 39 의 이미지를 삭제합니다. 이 " running"; 컨테이너 부두 노동자 포함되어 있다. # 39 을 실행하고 컨테이너입니다 변경 사항이 있을 때, it& 것처럼 프로세스를 통해 자체 소스 코드와 절약합니다 새로운 이미지 변화가 있기 때문이다.
같이 화면, 프로그래밍
이미지 * 는 소스 코드.
출처 코드*의 컴파일됨, 구축, 애플리케이션과는 호출될 때 있다.
이 경우, 비슷한 " 인스턴스를 " container&quo , *) 는 생성됩니다 image";).
처음부터 설명하는 것이 더 나은 것 같아요.
부두 노동자 '명령' 실행하십시오 hello world 실행하십시오 생각해 보자. 어떻게 됩니까?
예를 들어, hello world 존재하지 않습니다. 마이그레이션된 부두노동자 서버일 부두노동자 허브 (Hub) 는 자유 리포지토리를 부두노동자 그냥 이미지) , hello world '라는 이미지를 묻는 안녕하슈 허브, 가지고 있습니까?' 허브 응답 - yes, I do 하였으매 give it to me, please. 그리고 다운로드하십시오 프로세스가 시작됩니다. 부두노동자 즉시 해당 이미지를 다운로드되면 부두노동자 캐시에는 이미지 서버를 두고 있다.
그래서 그 전에 시작하여, # 39 의 이미지와 부두노동자 설명하고 있는 컨테이너 부두 노동자 let& 대한 소개는 컴퓨터의 운영 체제를 실행하는 방법 및 소프트웨어.
컴퓨터에서 실행할 때, 예를 들어, 크롬, 운영 체제에 운영 체제 커널 묻는 전화 통화, it, I want to 실행하십시오 프로그램였어 안녕하슈 커널은 실행 파일을 통해 하드 디스크에서.
이제 두 프로그램, 크롬, 노엘가이스트 상상을 할 수 있어야 합니다. 크롬 버전 2 node. js 单捞磐啊 파이썬 버전을 실행하고 파이썬 单捞磐啊 3 실행할 수 있습니다. 파이썬 v2 를 컴퓨터에 설치되어 있는 경우에만 미디어만을 크롬 실행됩니다.
두 경우 모두, 운영 체제를 사용하는 데 필요한 기능을 사용할 수 있도록 남스파스링 짐작이지만요.) 로 알려져 있다. 이름공간이 기능은 한 수 있는 기회를 제공하는 격리합니다 프로세스, 하드 드라이브, 네트워크, 사용자, 호스트 이름과 드릴링됩니다.
이에 대해 이야기할 때 오버클로킹된 실제로 의논하십시오 이미지 파일 시스템에 대한 스냅샷입니다. 이미지 파일 메타데이터를 포함하는 충족되었으며 컨테이너입니다 구축하십시오 는 물리적 방향 및 특정. 이미지 자체에 대한 컨테이너입니다 인스턴스입니다. 이를 사용하여 하드 드라이브를 격리합니다 남스파스링 대해서만 사용할 수 있는 이 컨테이너입니다 . 그래서 a 은 프로세스 또는 서로 다른 자원이 있는 일련의 프로세스 컨테이너입니다 그룹화합니다 할당되어 있습니다.
, 는 이미지 한 " snapshot". 컨테이너입니다 있다. 이미지를 만들 수 있습니다 (새 " snapshots";) 에서 시작, 또한 컨테이너입니다 이미지에서 컨테이너입니다 (인스턴스화하지 snapshot" 이 ";).
예를 들어 있는 명령을 몇 가지 기본 이미지를 통해 새로운 컨테이너입니다 인스턴스화하지 실행하십시오 컨테이너인 그리곤요 스냅샷입니다 새로운 이미지 것으로 보고 있다. 그리고 이를 통해 새로운 이미지를 100 컨테이너입니다 실행할 수 있습니다.
기타 고려할 사항: