Docker를 이용한 계층적 재사용 아이디어를 10분만에 배울 수 있습니다
이 기사는 이미지 레이어링, 컨테이너 레이어링 및 Docker에서 컨테이너가 차지하는 디스크 공간과 관련된 몇 가지 문제를 소개합니다.
Docker가 스토리지를 구성하는 방법
dokcer는 스토리지 콘텐츠를 구성할 때 계층적 재사용 아이디어를 영리하게 적용합니다. 그래서 우리는 이것을 이 아이디어를 배우기 위한 사례로 사용할 수 있습니다.
1. 이미지 레이어링
Docker 이미지는 생성 과정에서 여러 레이어로 나뉘며, 각 레이어는 읽기 전용입니다. 다음 예를 들어 설명하겠습니다.
# syntax=docker/dockerfile:1 FROM ubuntu:18.04 LABEL org.opencontainers.image.authors="org@example.com" COPY . /app RUN make /app RUN rm -r $HOME/.cache CMD python /app/app.py
이 Dockerfile에는 파일 시스템을 변경하고 새 레이어를 생성하는 4가지 지침이 있습니다.
-
FROM
명령은 ubuntu:18.04 이미지에서 기본 레이어를 생성합니다. -
LABEL
指令仅仅修改了镜像的元数据,不会创建新层。 -
COPY
指令将执行本次构建的当前目录中的内容添加到镜像当中,会创建一个新层记录改变。 - 第一个
RUN
指令,构建了程序并将结果输出到镜像中,会创建一个新层记录改变。 - 第二个
RUN
指令,删除了缓存目录,会创建一个新层记录改变。 -
CMD
指令定义了容器中运行的指令,只是修改了镜像的元数据,并不会创建新层。
FROM
指令从ubuntu:18.04的镜像中创建了基础层。这里每层都只记录与其上一层的不同。当我们创建一个容器的时候,这是就会创建一层可写层,也叫容器层。对于正在运行中的容器的内容的变化都会记录在该层中。下图描述了该关系:
2.容器分层
容器和镜像的不同主要是最顶层的可写层的不同,所有对于容器的写操作都会记录在这层中,如果容器被删除,那么这个可写层也会被删除,但是镜像会被保留。
注意:如果想要多个容器共享相同的数据,可以通过Docker Volumes实现。
每个容器都有其自己的可写层,所有的变换都会被存放在其中,所以多个容器可共享同一个镜像。下图描述了该关系:
注意 :此处还有个细节,多个镜像可能共用相同的层,比如两个镜像中有相同的层,那么在构建或是拉取的时候发现本地以存在,则不会再次构建或拉取。所以计算镜像大小的时候,不能仅通过 docker images
命令显示出的大小来汇总求和,该值有可能大于实际值。
3.容器在磁盘占用的空间
可以通过 docker ps -s
命令,来看正在运行中的容器占用的空间(部分值)。两个列的不同代表的内容:
- size: 容器的可写层占用的磁盘大小
- virtual size: 包含了容器可写层和只读镜像的大小。
容器占用磁盘空间的其它途径:
- 容器产生的日志文件。
- 使用Volume和bind mounts挂载的内容。
- 容器的配置文件
- 内存中的内容(如果开启了swapping)
- Checkpoints(如果使用了该功能)
4.Copy-on-Write(CoW)策略
Docker中的存储驱动都是采用该策略。
CoW策略能够最大效率的共享和复制文件。如果一个文件在镜像的更低层存在,那么其上层(包括可写层)需要读取该内容则可以直接使用该文件。当需要对其进行修改时,会复制该文件到该层并进行修改。这最大限度的减少了IO和每个后续层的大小。
4.1共享使镜像更小
当我们使用 docker pull
拉取镜像或是使用一个本地没有的镜像创建容器的时候,该镜像会被分层的存储到本地Dockers存储区域中。在linux中通常是 /var/lib/docker
。
我们可以去 /var/lib/docker/<storage-driver></storage-driver>
目录下看我们已拉取各层镜像。比如使用 overlay2
存储驱动。
这么多层,我们可以通过 docker image inspect
LABEL
이 명령은 이미지의 메타데이터만 수정하고 새 레이어를 생성하지는 않습니다.
COPY
이 명령은 이 빌드가 실행되는 현재 디렉터리의 내용을 이미지에 추가하고 변경 사항을 기록하기 위한 새 레이어를 생성합니다. 첫 번째 RUN
명령은 프로그램을 빌드하고 결과를 이미지에 출력합니다. 변경 사항을 기록하기 위한 새 레이어가 생성됩니다. 두 번째
RUN
명령은 캐시 디렉터리를 삭제하고 변경 사항을 기록할 새 레이어를 만듭니다.
CMD
명령은 컨테이너에서 실행될 명령을 정의하며 이미지의 메타데이터만 수정하고 새 레이어를 생성하지는 않습니다. 여기서 각 레이어는 이전 레이어와의 차이점만 기록합니다. 컨테이너를 생성하면 쓰기 가능한 레이어(컨테이너 레이어라고도 함)가 생성됩니다. 실행 중인 컨테이너의 내용에 대한 변경 사항이 이 레이어에 기록됩니다. 다음 그림은 관계를 설명합니다.


docker Images
명령으로 표시되는 크기를 단순히 합산할 수는 없으며, 실제 값보다 더 클 수 있습니다. 🎜🎜🎜3. 디스크에서 컨테이너가 차지하는 공간🎜🎜🎜 docker ps -s
명령을 사용하면 실행 중인 컨테이너가 차지하는 공간을 확인할 수 있습니다(부분 값). 두 열로 표시되는 다양한 콘텐츠: 🎜🎜🎜size: 컨테이너의 쓰기 가능한 레이어가 차지하는 디스크 크기 🎜virtual size: 컨테이너의 쓰기 가능한 레이어와 읽기 전용 이미지의 크기를 포함합니다. 🎜컨테이너가 디스크 공간을 차지하는 다른 방법: 🎜🎜🎜컨테이너에 의해 생성된 로그 파일. 🎜볼륨 및 바인드 마운트를 사용하여 콘텐츠를 마운트했습니다. 🎜컨테이너 구성 파일🎜메모리의 콘텐츠(스와핑이 활성화된 경우)🎜체크포인트(이 기능이 사용되는 경우)🎜🎜4.Copy -on -쓰기(CoW) 전략 🎜🎜🎜Docker의 스토리지 드라이버는 모두 이 전략을 채택합니다. 🎜🎜CoW 전략은 최대의 효율성으로 파일을 공유하고 복사할 수 있습니다. 이미지의 하위 레이어에 파일이 있는 경우 상위 레이어(쓰기 가능한 레이어 포함)는 콘텐츠를 읽어야 하며 파일을 직접 사용할 수 있습니다. 수정이 필요한 경우 파일이 이 레이어에 복사되어 수정됩니다. 이렇게 하면 IO와 각 후속 레이어의 크기가 최소화됩니다. 🎜🎜4.1 공유로 인해 이미지가 작아집니다🎜
🎜docker pull
을 사용하여 이미지를 가져오거나 로컬에서 사용할 수 없는 이미지를 사용하여 컨테이너를 생성하면 이미지는 분할 레이어는 로컬 Dockers 저장 영역에 저장됩니다. Linux에서는 일반적으로 /var/lib/docker
입니다. 🎜🎜 /var/lib/docker/<storage-driver></storage-driver>
디렉토리로 이동하여 각 레이어의 이미지를 가져온 것을 확인할 수 있습니다. 예를 들어 overlay2
저장소 드라이버를 사용하세요. 🎜🎜
docker image inspect --format "{{json .RootFS.Layers}}" redis docker image inspect --format "{{json .RootFS.Layers}}" mysql:5.7
我们可以通过 docker image history
命令来查看镜像分层情况,以redis为例
docker history redis
注意 :
有些步骤的大小为0,是因为他们只改变了元数据,并不会产生新层,也不会占用额外的空间(除元数据本身)。所以上述redis镜像中包含了5层。
-
<missing></missing>
步骤,这些步骤可能是以下情况中的一种- 在另一个系统上构建的
- 从Docker Hub中提取的
- 使用BuildKit作为构建器构建的。
4.2复制让容器更有效率
当我们启动一个容器的时候,会添加一个可写层在镜像之上,用于存储所有的变化。当对已有文件进行修改的时候采用CoW策略。首先会到各层寻找到该文件,然后复制该文件到可写层,然后进行修改并存储。
这么做能够让我们最大限度地减少I/O操作。
但是,很明显的是当一个容器中的应用需要进行频繁的写操作,那么会造成可写层越来越庞大,此时我们可以通过Volume来帮助我们分担压力。
容器的元数据和日志是单独存放的,一般是存放在 /var/lib/docker/containers
中,我们可以使用 du -sh /var/lib/docker/containers/*
来查看各个容器占用多少。(容器ID其实就是文件夹名称的前12位)。
推荐学习:《docker视频教程》
위 내용은 Docker를 이용한 계층적 재사용 아이디어를 10분만에 배울 수 있습니다의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PyCharm에서 프로젝트를 패키징하는 방법에는 네 가지가 있습니다. 별도의 실행 파일로 패키징: EXE 단일 파일 형식으로 내보냅니다. 설치 프로그램으로 패키지됨: Setuptools Makefile을 생성하고 빌드합니다. Docker 이미지로 패키징: 이미지 이름을 지정하고, 빌드 옵션을 조정하고, 빌드합니다. 컨테이너로 패키징: 빌드할 이미지를 지정하고, 런타임 옵션을 조정하고, 컨테이너를 시작합니다.

Pinetwork 노드에 대한 자세한 설명 및 설치 안내서이 기사에서는 Pinetwork Ecosystem을 자세히 소개합니다. Pi 노드, Pinetwork 생태계의 주요 역할을 수행하고 설치 및 구성을위한 전체 단계를 제공합니다. Pinetwork 블록 체인 테스트 네트워크가 출시 된 후, PI 노드는 다가오는 주요 네트워크 릴리스를 준비하여 테스트에 적극적으로 참여하는 많은 개척자들의 중요한 부분이되었습니다. 아직 Pinetwork를 모른다면 Picoin이 무엇인지 참조하십시오. 리스팅 가격은 얼마입니까? PI 사용, 광업 및 보안 분석. Pinetwork 란 무엇입니까? Pinetwork 프로젝트는 2019 년에 시작되었으며 독점적 인 Cryptocurrency Pi Coin을 소유하고 있습니다. 이 프로젝트는 모든 사람이 참여할 수있는 사람을 만드는 것을 목표로합니다.

답변: PHP 마이크로서비스는 민첩한 개발을 위해 HelmCharts로 배포되고 격리 및 확장성을 위해 DockerContainer로 컨테이너화됩니다. 자세한 설명: HelmCharts를 사용하여 PHP 마이크로서비스를 자동으로 배포하여 민첩한 개발을 달성하세요. Docker 이미지를 사용하면 마이크로서비스의 신속한 반복 및 버전 제어가 가능합니다. DockerContainer 표준은 마이크로서비스를 격리하고 Kubernetes는 컨테이너의 가용성과 확장성을 관리합니다. Prometheus 및 Grafana를 사용하여 마이크로서비스 성능 및 상태를 모니터링하고 경보 및 자동 복구 메커니즘을 생성하세요.

개요 LLaMA-3(LargeLanguageModelMetaAI3)은 Meta Company에서 개발한 대규모 오픈소스 생성 인공지능 모델입니다. 이전 세대 LLaMA-2에 비해 모델 구조에는 큰 변화가 없습니다. LLaMA-3 모델은 다양한 애플리케이션 요구 사항과 컴퓨팅 리소스에 맞게 소형, 중형, 대형을 포함한 다양한 규모 버전으로 구분됩니다. 소형 모델의 모수 크기는 8B, 중형 모델의 모수 크기는 70B, 대형 모델의 모수 크기는 400B에 이릅니다. 그러나 훈련 중에는 다중 모달 및 다중 언어 기능을 달성하는 것이 목표이며 결과는 GPT4/GPT4V와 비슷할 것으로 예상됩니다. Ollama 설치Ollama는 오픈 소스 대형 언어 모델(LL

Go 프로그램을 시작하는 방법에는 네 가지가 있습니다. 명령줄 사용: go run main.go IDE의 "실행" 또는 "디버그" 메뉴를 통해 시작 컨테이너 오케스트레이션 도구(예: Docker 또는 Kubernetes)를 사용하여 컨테이너 시작 systemd 또는 사용 Unix 시스템의 감독자 시스템 서비스로 실행

Docker 컨테이너를 사용하여 사전 컴파일 된 패키지 (Windows 사용자의 경우)를 사용하여 소스 (숙련 된 개발자)를 컴파일하는 것을 포함하여 DeepSeek를 설치하는 방법에는 여러 가지가 있습니다. 공식 문서는 신중하게 문서를 작성하고 불필요한 문제를 피하기 위해 완전히 준비합니다.

PHP 분산 시스템 아키텍처는 네트워크에 연결된 시스템 전체에 다양한 구성 요소를 분산하여 확장성, 성능 및 내결함성을 달성합니다. 아키텍처에는 애플리케이션 서버, 메시지 대기열, 데이터베이스, 캐시 및 로드 밸런서가 포함됩니다. PHP 애플리케이션을 분산 아키텍처로 마이그레이션하는 단계는 다음과 같습니다. 서비스 경계 식별 메시지 대기열 시스템 선택 마이크로서비스 프레임워크 채택 컨테이너 관리에 배포 서비스 검색

컨테이너화는 다음과 같은 방식으로 Java 기능 성능을 향상시킵니다. 리소스 격리 - 격리된 컴퓨팅 환경을 보장하고 리소스 경합을 방지합니다. 경량 - 시스템 리소스를 덜 차지하고 런타임 성능을 향상시킵니다. 빠른 시작 - 기능 실행 지연을 줄입니다. 일관성 - 애플리케이션과 인프라를 분리하여 환경 전체에서 일관된 동작을 보장합니다.
