이 기사는 이미지 레이어링, 컨테이너 레이어링 및 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🎜🎜🎜🎜🎜🎜🎜위 보기를 통해 redis와 mysql5.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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

Linux에서 Docker를 사용하면 개발 및 배포 효율성을 향상시킬 수 있습니다. 1. Docker 설치 : 스크립트를 사용하여 Ubuntu에 Docker를 설치하십시오. 2. 설치 확인 : Sudodockerrunhello-World를 실행하십시오. 3. 기본 사용 : Nginx 컨테이너 생성 Dockerrun-Namemy-Nginx-P8080 : 80-Dnginx. 4. 고급 사용 : DockerFile을 사용하여 사용자 정의 이미지를 만들고 빌드 및 실행하십시오. 5. 최적화 및 모범 사례 : 다단계 빌드 및 dockercompose를 사용하여 Dockerfiles를 작성하기위한 모범 사례를 따르십시오.

Docker 모니터링의 핵심은 주로 CPU 사용, 메모리 사용, 네트워크 트래픽 및 디스크 I/O와 같은 지표를 포함하여 컨테이너의 작동 데이터를 수집하고 분석하는 것입니다. Prometheus, Grafana 및 Cadvisor와 같은 도구를 사용하면 컨테이너의 포괄적 인 모니터링 및 성능 최적화를 달성 할 수 있습니다.

Dockerswarm은 확장 가능한 고도로 컨테이너 클러스터를 구축하는 데 사용될 수 있습니다. 1) Dockers -Warminit을 사용하여 떼 클러스터를 초기화하십시오. 2) Swarm 클러스터에 가입하여 Dockers-Warmjoin-Token을 사용하십시오. 3) DockerserviceCreate-namemy-nginx-replicas3nginx를 사용하여 서비스를 만듭니다. 4) DockerstackDeploy-Cdocker-Compose.ymlmyapp을 사용하여 복잡한 서비스를 배포합니다.

Docker 및 Kubernetes를 사용하여 Enterprise Applications의 컨테이너 오케스트레이션을 수행하는 방법은 무엇입니까? 다음 단계를 통해 구현하십시오. Docker 이미지를 만들고 DockerHub로 푸시하십시오. Kubernetes에서 배포 및 서비스를 작성하여 응용 프로그램을 배포하십시오. 외부 액세스를 관리하기 위해 Insress를 사용하십시오. 성능 최적화 및 다단장 구성 및 자원 제약과 같은 모범 사례를 적용하십시오.

Docker FAQ는 다음 단계를 통해 진단 및 해결할 수 있습니다. 1. 컨테이너 상태 및 로그보기, 2. 네트워크 구성 확인, 3. 볼륨이 올바르게 장착되도록하십시오. 이러한 방법을 통해 Docker의 문제는 빠르게 위치하고 고정되어 시스템 안정성과 성능을 향상시킬 수 있습니다.

Docker는 DevOps 엔지니어에게 필수 기술입니다. 1. Docker는 포장 애플리케이션 및 컨테이너에 대한 종속성을 통해 격리 및 휴대 성을 달성하는 오픈 소스 컨테이너화 플랫폼입니다. 2. Docker는 네임 스페이스, 제어 그룹 및 연합 파일 시스템과 함께 작동합니다. 3. 기본 사용에는 컨테이너 생성, 실행 및 관리가 포함됩니다. 4. 고급 사용법에는 DockerCompose를 사용하여 다중 컨테이너 응용 프로그램을 관리하는 것이 포함됩니다. 5. 일반적인 오류에는 컨테이너 고장, 포트 매핑 문제 및 데이터 지속성 문제가 포함됩니다. 디버깅 기술에는 로그보기, 컨테이너 입력 및 자세한 정보보기가 포함됩니다. 6. 성능 최적화 및 모범 사례에는 이미지 최적화, 리소스 제약 조건, 네트워크 최적화 및 Dockerfile 사용을위한 모범 사례가 포함됩니다.

Docker Security 향상 방법에는 다음이 포함됩니다. 1.-캡 드롭 매개 변수를 사용하여 Linux 기능을 제한, 2. 읽기 전용 컨테이너 생성, 3. Selinux 태그 설정. 이러한 전략은 취약성 노출을 줄이고 공격자 기능을 제한함으로써 컨테이너를 보호합니다.

DockErvolumes는 컨테이너가 다시 시작, 삭제 또는 마이그레이션 될 때 데이터가 안전하게 유지되도록합니다. 1. 볼륨 생성 : dockervolumecreatemydata. 2. 컨테이너를 실행하고 볼륨을 장착하십시오 : Dockerrun-it-vmydata :/app/dateubuntubash. 3. 고급 사용에는 데이터 공유 및 백업이 포함됩니다.


핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

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

SecList
SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

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

WebStorm Mac 버전
유용한 JavaScript 개발 도구
