도커는 기본적으로 도커 허브(Docker Hub)라는 중앙 이미지 저장소에서 이미지를 내려 받는다.
도커 허브는 도커가 공식적으로 제공하고 있는 이미지 저장소러서, 도커 계정을 가지고 있다면 누구든지 이미지를 올리고 내려받을 수 있다.
docker create, docker run, docker pull 명령어로 이미지를 내려받을 때 도커는 도커 허브에서 해당 이미지를 검색한 뒤 내려받는다. 단 도커 허브는 누구나 이미지를 올릴 수 있기 때문에 공식(Official) 라벨이 없는 이미지는 사용법을 찾을 수 없거나 제대로 동작하지 않을 수 있다.
이미지 저장소를 다른 사람들에게 공개하지 않기 위해 비공개(Private) 저장소를 사용할 수 있는데 저장수의 수에 따라 요금을 지불해야 한다.
도커 이미지 저장소를 직접 구축해 비공개로 사용할 수도 있다(도커 사설 레지스트리)
EX) 도커 이미지 검색(search)
$ docker search ubuntu
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating sys… 14034 [OK]
websphere-liberty WebSphere Liberty multi-architecture images … 283 [OK]
ubuntu-upstart DEPRECATED, as is Upstart (find other proces… 112 [OK]
neurodebian NeuroDebian provides neuroscience research s… 88 [OK]
open-liberty Open Liberty multi-architecture images based… 51 [OK]
ubuntu-debootstrap DEPRECATED; use "ubuntu" instead 46 [OK]
ubuntu/nginx Nginx, a high-performance reverse proxy & we… 40
ubuntu/mysql MySQL open source fast, stable, multi-thread… 29
ubuntu/apache2 Apache, a secure & extensible open-source HT… 26
docker commit ${OPTION} ${CONTAINER} {REPOSITORY{:TAG}}
// 이미지로 만들 컨테이너 생성
$ docker run -it --name commit_test ubuntu:14.04
// 내가 만든 컨테이너라는 것을 표시하기 위해 간단한 파일 생성
# root@09c628aa8248:/# echo test_first >> first
// 생성한 commit_test 컨테이너로 이미지 생성
$ docker commit -a "mohadangKim" -m "commit message" commit_test my_repository:first
sha256:81902ebfff826a0c0b34ff1057ded52484a624a0ae4f17b858acfff161004b58
// 생성된 이미지 확인
# root@red-virtual-machine:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my_repository first 81902ebfff82 4 seconds ago 197MB
ubuntu 14.04 13b66b487594 12 months ago 197MB
EX) 도커 이미지 생성 2
$ docker run -it --name commit_test2 my_repository:first
# root@5f5d27a84128:/# echo test_second! >> second
$ docker commit -a "mohadangKim" -m "commit message 2" commit_test2 my_repository:second
sha256:6440b177e3559abcbcf57272053d2babf202567b5298818a80e07a56fb6ae68e
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my_repository second 6440b177e355 About a minute ago 197MB
my_repository first 81902ebfff82 12 minutes ago 197MB
ubuntu 14.04 13b66b487594 12 months ago 197MB
$ docker inspect ubuntu:14.04
"Layers": [
"sha256:f2fa9f4cf8fd0a521d40e34492b522cee3f35004047e617c75fadeb8bfd1e6b7",
"sha256:30d3c4334a2379748937816c01f5c972a8291a5ccc958d6b33d735457a16196e",
"sha256:83109fa660b2ed9307948505abd3c1f24c27c64009691067edb765bd3714b98d"
]
$ docker inspect my_repository:first
"Layers": [
"sha256:f2fa9f4cf8fd0a521d40e34492b522cee3f35004047e617c75fadeb8bfd1e6b7",
"sha256:30d3c4334a2379748937816c01f5c972a8291a5ccc958d6b33d735457a16196e",
"sha256:83109fa660b2ed9307948505abd3c1f24c27c64009691067edb765bd3714b98d",
"sha256:e8eb21d48746fc1fd0599a874f94cf2e8c862236a083a34af050950c25c1547b"
]
$ docker inspect my_repository:second
"Layers": [
"sha256:f2fa9f4cf8fd0a521d40e34492b522cee3f35004047e617c75fadeb8bfd1e6b7",
"sha256:30d3c4334a2379748937816c01f5c972a8291a5ccc958d6b33d735457a16196e",
"sha256:83109fa660b2ed9307948505abd3c1f24c27c64009691067edb765bd3714b98d",
"sha256:e8eb21d48746fc1fd0599a874f94cf2e8c862236a083a34af050950c25c1547b",
"sha256:e5677df50a1055c895cbb3c5212bef49134c163ea299b3d7e3aa8a1fe75008b9"
]
EX) 도커 레이어 구조 상세 확인(history)
$ docker history my_repository:second
IMAGE CREATED CREATED BY SIZE COMMENT
6440b177e355 8 minutes ago /bin/bash 13B commit message 2
81902ebfff82 19 minutes ago /bin/bash 11B commit message
13b66b487594 12 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 12 months ago /bin/sh -c mkdir -p /run/systemd && echo 'do… 7B
<missing> 12 months ago /bin/sh -c [ -z "$(apt-get indextargets)" ] 0B
<missing> 12 months ago /bin/sh -c set -xe && echo '#!/bin/sh' > /… 195kB
<missing> 12 months ago /bin/sh -c #(nop) ADD file:276b5d943a4d284f8… 196MB
$ docker rmi my_repository:first
Error response from daemon: conflict: unable to remove repository reference "my_repository:first" (must force) - container 5f5d27a84128 is using its referenced image 81902ebfff82
위의 명령어는 에러를 발생하는데 에러 내용은 이미지를 사용 중인 컨테이너가 존재하므로 해당 이미지를 삭제할 수 없다는 내용이다. 따라서 사용중인 컨테이너를 삭제한 뒤 이미지를 삭제해야 한다.
단 docker rmi -f 로 강제 삭제 가능하지만 이렇게 하면 댕글링(dangling) 이미지가 된다.
댕글링 이미지는 docker images -f dangling=true 명령어를 사용해 별도로 확인 할 수 있다
<none>
으로 되어 있다// my_repository:first 이미지 사용중인 commit_test2 컨테이너
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5f5d27a84128 my_repository:first "/bin/bash" 15 minutes ago Up 15 minutes commit_test2
09c628aa8248 ubuntu:14.04 "/bin/bash" 26 minutes ago Up 26 minutes commit_test
$ docker stop commit_test2
commit_test2
$ docker rm commit_test2
commit_test2
$ docker rmi my_repository:first
Untagged: my_repository:first
$ docker rmi my_repository:second
Untagged: my_repository:second
Deleted: sha256:6440b177e3559abcbcf57272053d2babf202567b5298818a80e07a56fb6ae68e
Deleted: sha256:502f34130232e16675b92b55579883bfd6ceeb7bddf47a0d989b8243267ea09c
Deleted: sha256:81902ebfff826a0c0b34ff1057ded52484a624a0ae4f17b858acfff161004b58
Deleted: sha256:6d77f093e94a4cc795513d0ec71ad1913f5a1036ca936c76e977f94d03a6b66e