Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

이미지 생성

다음의 명령어를 통하여 이미지로 만들 컨테이너를 생성한다.

컨테이너 내부에 first라는 이름의 파일을 하나 생성해 기존의 이미지로 변경사항을 만들것이다.

Code Block
[root@localhost ~]# docker run -i -t --name commit_test ubuntu:14.04
root@3fc01b9f69e7:/# echo test_first! >> first

컨테이너에서 호스트로 빠져나와 docker commit 명령어를 입력하여 컨테이너를 이미지로 만든다.

docker commit 형식은 다음과 같다.

Info

# docker commit [OPTIONS] CONTAINER [REPOSITORY:[:TAG]]


commit 의 옵션을 지정하고 커밋할 컨테이너의 이름을 명시한뒤 생성될 이미지의 이름을 입력한다.

Code Block
[root@localhost ~]# docker commit -a "alicek106" -m "my first commit" commit_test commit_test:first
sha256:9c75288c443a3f010ecf2f9d1d3b0e52fdf1f6d4cc9b5e9f57d9be5fe5e6315e

위의 명령어에서 이미지의 이름은 commit_test로 태그는 first 로 설정했다.

-a 는 author을 뜻하며, 작성자는 "alicek106", -m은 커밋메세지를 뜻하며 이미지에 포함될 부가설명을 입력한다.

commit_test는 컨테이너를 뜻하며, commit_test:first는 이미지를 뜻한다.


최상위 디렉토리에 first 라는 파일이 있는 도커 이미지가 생성되었다.

docker images로 이미지가 생성되었는지 확인한다.

Code Block
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
commit_test         first               9c75288c443a        2 minutes ago       222MB
ubuntu              14.04               dc4491992653        9 days ago          222MB


이번에는 

commit_test:first 이미지로 새로운 이미지를 생성한다.

commit_test:first 이미지로 컨테이너를 생성한 뒤 second라는 파일을 추가하여 commit_test:second라는 이미지를 생성한다.

Code Block
[root@localhost ~]# docker run -i -t --name commit_test2 commit_test:first
root@c33268b3d582:/# echo test_second! >> second


[root@localhost ~]# docker commit -a "jsp207" -m "my second commit" commit_test2 commit_test:second
sha256:cac9edeb191ab1e11bd1b7f23f5234c2826e7204e87fe78afc7af4cb9461b67a


[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
commit_test         second              cac9edeb191a        31 seconds ago      222MB
commit_test         first               9c75288c443a        10 minutes ago      222MB
ubuntu              14.04               dc4491992653        9 days ago          222MB


이미지 삭제

docker rmi 명령어를 사용하면 이미지를 삭제 할 수 있다.

하지만, 이미지를 사용중인 컨테이너가 존재하면 해당 이미지를 삭제할 수 없는 오류 메세지를 출력한다.

컨테이너를 삭제할때 사용했던 "docker rm -f [컨테이너이름]" 명령어와 같이 -f 옵션을 추가하여 이미지를 강제로 삭제 할수 있다.

하지만, -f옵션은 이미지 레이어 파일을 실제로 삭제하지 않고 이미지 이름만 삭제하기 때문에 의미가 없다.

그래서 다음 명령어와 같이 컨테이너를 삭제한 뒤 이미지를 삭제 해야 한다.

Code Block
[root@localhost ~]# docker stop commit_test2 && docker rm commit_test2
commit_test2
commit_test2
[root@localhost ~]# docker rmi commit_test:first
Untagged: commit_test:first

commit_test:first 이미지를 삭제했다고 해서 전부 삭제된것은 아니며,

commit_test:first 이미지를 기반으로 하는 하위 이미지 commit_test:second가 존재하기 때문에 실제 이미지 파일을 삭제하지 않고 레이어에 부여된

이름만 삭제한다.

Untagged: commit_test:first 의 출력된 메세지의 Untagged는 이미지에 부여된 이름만 삭제 한다는 뜻이다.

Code Block
[root@localhost ~]# docker rmi commit_test:second
Untagged: commit_test:second
Deleted: sha256:cac9edeb191ab1e11bd1b7f23f5234c2826e7204e87fe78afc7af4cb9461b67a
Deleted: sha256:bc8fdb01c14a17238b1844ef369ecc4732f9873214a9a6b9421b1288fb998ea6
...

Deleted 라는 출력 결과는 이미지 레이어가 실제로 삭제 됬음을 말한다.

즉, 삭제되는 이미지의 부모 이미지가 존재 하지 않아야만 해당 이미지의 파일이 실제로 삭제 된다.


Note

컨테이너가 사용중인 이미지를 docker rmi -f 로 강제로 삭제하면,

이미지의 이름이 <none>으로 변경되며, 이러한 이미지들을 댕글링(dangling)이미지라고 한다.

댕글링 이미지는 docker images -f dangling=true 명령어를 사용해 별도로 확인 할 수 있으며,

사용중이지 않는 댕글링 이미지는 docker image prune 명령어로 한꺼번에 삭제할 수 있다.