Docker Image Layer 의 구조
Docker 의 이미지를 이용해서 docker run 을 하면 Docker 는 도커가 관리하는 파일 시스템 영역에 이미지를 복사한다. 복사후 docker는 이미지의 최상단에 컨테이너 레이어(Container layer) 라고 불리는 하나의 얇은 레이어를 추가하여 컨테이너를 생성한다. 그리고 사용자에게 유니온 파일 시스템을 이용하여 마치 이러한 여러개의 파일 시스템(Image layer)으로 구성되어 있는 이미지 스택 구조가 하나의 파일 시스템 처럼 보이도록 하게 한다.
▲ Docker run [이미지] 를 통해 이미지로 컨테이너를 생성할 경우 기존의 이미지 레이어들 위에 conatiner layer 가 생성된다.
사용자가 컨테이너 안에서 읽고 쓰는 모든 작업 들은 이 컨테이너 레이어에 기록되고 이미지 레이어에는 적용되지 않는다. 쉽게 말해 Image layer는 변경 불가하고(read only layer), Container layer는 변경 가능하다(Readable/Writable layer).
이미지 레이어는 삭제 되지 않지만 컨테이너 레이어는 해당 컨테이너가 종료될경우 같이 소멸된다. 만약에 사용자가 Container Layer에서 작업하던 내용을 Image layer로 적용 하고 싶을 경우 docker commit 을 사용하면 된다. docker commit 을 사용하게 되면 기존의 Image layer 들과 직접 작성한 Container Layer를 이용해 새로운 이미지를 생성할 수 있다.
컨테이너 생성 방법
도커 이미지로 컨테이너 생성
$ docker run [options] image[:TAG] [COMMAND] [ARG...]
도커 이미지 생성 방법
1. 컨테이너로 도커 이미지 생성
$ docker commit [OPTIONS] CONTAINER [REPOSITORY/][image name][:TAG]
2. Dockerfile로 도커 이미지 생성
$ docker build [OPTIONS] PATH | URL | -
ex) docker build -t test:1.0 . # 현재 위치에 있는 Dockerfile로 test:1.0 이름의 도커 이미지 생성
컨테이너로 도커 이미지 생성 의미
[root@user1-virtual-machine: ~]#docker run -it --name commit_test ubuntu:14.04
Unable to find image 'ubuntu:14.04' locally
14.04: Pulling from library/ubuntu
2e6e20c8e2e6: Pull complete
0551a797c01d: Pull complete
512123a864da: Pull complete
Digest: sha256:4a8a6fa8810a3e01352981b35165b0b28403fe2a4e2535e315b23b4a69cd130a
Status: Downloaded newer image for ubuntu:14.04
이렇게 분리된 데이터를 레이어(Layer) 라고 한다.
레이어는 도커 이미지가 빌드될 때 Dockerfile에 정의된 명령문(Instructions)을 순서대로 실행하면서 만들어진다.
ubuntu:14.04 이미지의 layer는 3개임을 알 수 있다.
[root@user1-virtual-machine: ~]#docker run -it --name commit_test ubuntu:14.04
root@17d9048aeaaa:/# echo "test_first" >> first.txt
root@17d9048aeaaa:/# ls
bin boot dev etc first.txt home
ubuntu:14.04 이미지를 사용해서 commit_test 컨테이너를 생성 실행시켰다
first.txt 파일을 생성하였다
[root@user1-virtual-machine: ~]#docker commit commit_test commit1
sha256:c784f4ba4ff395665384420ea6eb2c0bbd09cdc9d1629b8f327d6011df2eed32
[root@user1-virtual-machine: ~]#docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
commit1 latest c784f4ba4ff3 5 seconds ago 197MB
ubuntu 14.04 13b66b487594 6 weeks ago 197MB
commit_test 컨테이너를 이용해 commit1 이미지를 생성한다
commit1 이미지에는 ubuntu:14.04 Image layer 위에 first.txt 를 생성한 Container layer 까지 적용되었다
[root@user1-virtual-machine: ~]#docker run -it --name commit_test2 commit1
root@af12dc92f6c7:/# echo "test_second" >> second.txt
root@af12dc92f6c7:/# ls
bin dev first.txt lib media opt root sbin srv tmp var boot etc home lib64 mnt proc run second.txt sys usr
commit1 이미지를 사용해서 commit_test2 컨테이너를 생성 실행
commit_test 에서 생성했던 first.txt 가 있다!
즉, container layer 에서 작업한 내용을 저장시키고 싶다면 이미지로 만들면 된다
[root@user1-virtual-machine: ~]#docker commit commit_test2 commit2
sha256:c2f85aee17259894adedcd17b41ba7908ed1f2692737942e6f69e4ef8a4b6cc2
[root@user1-virtual-machine: ~]#docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
commit2 latest c2f85aee1725 4 seconds ago 197MB
commit1 latest c784f4ba4ff3 2 minutes ago 197MB
ubuntu 14.04 13b66b487594 6 weeks ago 197MB
commit_test2 컨테이너를 이용해 commit2 이미지 생성
[root@user1-virtual-machine: ~]#docker image inspect ubuntu:14.04
"Layers": [
"sha256:f2fa9f4cf8fd0a521d40e34492b522cee3f35004047e617c75fadeb8bfd1e6b7",
"sha256:30d3c4334a2379748937816c01f5c972a8291a5ccc958d6b33d735457a16196e",
"sha256:83109fa660b2ed9307948505abd3c1f24c27c64009691067edb765bd3714b98d"
]
[root@user1-virtual-machine: ~]#docker image inspect commit1
"Layers": [
"sha256:f2fa9f4cf8fd0a521d40e34492b522cee3f35004047e617c75fadeb8bfd1e6b7",
"sha256:30d3c4334a2379748937816c01f5c972a8291a5ccc958d6b33d735457a16196e",
"sha256:83109fa660b2ed9307948505abd3c1f24c27c64009691067edb765bd3714b98d",
"sha256:964b0fe806e9b965323252b29d989072359d75a78f86f15ca985b6da00b78b89"
]
[root@user1-virtual-machine: ~]#docker image inspect commit2
"Layers": [
"sha256:f2fa9f4cf8fd0a521d40e34492b522cee3f35004047e617c75fadeb8bfd1e6b7",
"sha256:30d3c4334a2379748937816c01f5c972a8291a5ccc958d6b33d735457a16196e",
"sha256:83109fa660b2ed9307948505abd3c1f24c27c64009691067edb765bd3714b98d",
"sha256:964b0fe806e9b965323252b29d989072359d75a78f86f15ca985b6da00b78b89",
"sha256:532baaa5852f52ceea683d0c161574bd10ec8bc66d022e6cf8cfa0c5698fe1cd"
]
빨간색 글씨가 ubuntu:14.04 image layer 위에 추가된 layer 이다
참고
eqfwcev123.github.io/2020/01/30/%EB%8F%84%EC%BB%A4/docker-image-layer/
'DevOps > Docker' 카테고리의 다른 글
Docker로 ubuntu, apache, php 환경의 이미지 만들기 (0) | 2021.07.15 |
---|---|
[docker] Failed to get D-Bus connection 에러 해결 (0) | 2021.05.29 |
도커와 쿠버네티스 개념 정리 (0) | 2021.05.11 |
docker run 명령어 사용법, 옵션 (1) | 2021.05.08 |
도커 기본 명령어 정리 (0) | 2021.05.08 |