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 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

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

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

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

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

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

도커 컨테이너를 종료하는 4 가지 명령 사용 Docker Kill & lt; Container_name & gt; 호스트 터미널의 명령 (힘 출구)

Docker의 외부 호스트에 파일을 복사하는 방법 : Docker CP 명령 사용 : Docker CP 실행 [옵션] & lt; 컨테이너 경로 & gt; & lt; 호스트 경로 & gt;. 데이터 볼륨 사용 : 호스트에서 디렉토리를 만들고 -V 매개 변수를 사용하여 양방향 파일 동기화를 달성하기 위해 컨테이너를 만들 때 컨테이너에 디렉토리를 장착하십시오.

단계를 따르면 Docker 컨테이너 이름을 쿼리 할 수 있습니다. 모든 컨테이너 (Docker PS)를 나열하십시오. 컨테이너 목록을 필터링합니다 (GREP 명령 사용). 컨테이너 이름 ( "이름"열에 위치)을 가져옵니다.

Docker Container Startup 단계 : 컨테이너 이미지를 당기기 : "Docker Pull [Mirror Name]"을 실행하십시오. 컨테이너 생성 : "docker"[옵션] [미러 이름] [명령 및 매개 변수]를 사용하십시오. 컨테이너를 시작하십시오 : "Docker start [컨테이너 이름 또는 ID]"를 실행하십시오. 컨테이너 상태 확인 : 컨테이너가 "Docker PS"로 실행 중인지 확인하십시오.

Docker 컨테이너를 다시 시작하는 방법 : 컨테이너 ID (Docker PS)를 가져옵니다. 컨테이너 중지 (Docker Stop & lt; container_id & gt;); 컨테이너를 시작하십시오 (Docker start & lt; container_id & gt;); 재시작이 성공했는지 확인하십시오 (Docker PS). 기타 방법 : Docker Compose (Docker-Compose Restart) 또는 Docker API (Docker 문서 참조).

Docker에서 MySQL을 시작하는 프로세스는 다음 단계로 구성됩니다. MySQL 이미지를 가져와 컨테이너를 작성하고 시작하고 루트 사용자 암호를 설정하고 포트 확인 연결을 매핑하고 데이터베이스를 작성하고 사용자는 데이터베이스에 모든 권한을 부여합니다.

Docker 이미지를 업데이트하는 단계는 다음과 같습니다. 최신 이미지 태그 가져 오기 새 이미지 특정 태그의 이전 이미지 삭제 (선택 사항) 컨테이너를 다시 시작하십시오 (필요한 경우)

Docker에서 컨테이너 만들기 : 1. 이미지를 당기기 : Docker Pull [Mirror Name] 2. 컨테이너 만들기 : Docker Run [옵션] [미러 이름] [명령] 3. 컨테이너 시작 : Docker Start [컨테이너 이름]
