Page History
Table of Contents | ||
---|---|---|
|
도커 이미지
이미지는 컨테이너를 생성할 때 필요한 추상적인 요소이다.
여러개의 계층 및 레이어 형태로 된 바이너리 파일들이 존재하고,
그 위로 컨테이너를 생성하여 실행할때 읽기 전용으로 사용된다.
이미지는 도커 명령어로 내려받을 수 있으며 별도 설치할 필요가 없는 개념이다.
■ 이미지의 기본적 형태
Panel |
---|
[저장소] / [이미지이름] : [태그] |
레지스트리(Registry)
- 이미지를 운영하고 배포하는 역할. (기본 레지스트리는 도커 허브를 나타냄)
저장소(Repository)
- 이미지의 저장된 장소, 저장소 이름이 명시되지 않는 경우 도커에서 기본적으로 제공함.
이미지 이름(Name)
- 해당 이미지가 어떤 역할을 하는지 나타냄, 이미지의 이름은 생략할 수 없으며 필수설정해야 함..
태그(Tag)
- 이미지의 버전관리, 리비전(Revision) 관리에 사용됨, 태그를 생략하면 도커엔진은 이미지의 태그를 latest로 인식함.
도커 이미지 생성
다음의 명령어를 통하여 이미지로 만들 컨테이너를 생성한다.
생성 1
실제 허브에 존배하는 redis 이미지를 가져온다실제 허브에 존재하는 Redis 이미지 생성 예제.
Code Block |
---|
[root@localhost ~]# docker pull redis Using default tag: latest latest: Pulling from library/redis d2ca7eff5948: Pull complete 1d1a2245aaa6: Pull complete 9a483dd2a28b: Pull complete 7b78ebdc44f0: Pull complete 79b76500ef26: Pull complete b2991d9a5624: Pull complete... Digest: sha256:e55dff3a21a0e7ba25e91925ed0d92... Status: Downloaded newer image for redis:latest |
그리고 redis 컨테이너를 시작한다.이번에는 -d 인자를 이요하여 컨테이너를 시작한다.
Code Block |
---|
[root@localhost ~]# docker run --name myredis -d redis 4f839c854df62fc59e6d0d42b87be51fe8... |
-d 는 백그라운드에서 실행하라는 것을 의미한다.
데이터베이스를 연결한다.,
응용프로그램이 없기 때문에 redis-cli 도구를 이용한다. |
redis-cli를 설치할수도 있지만, redis-cli를 실행하기 위한 새로운 컨테이너를 시작하고
두 컨테이너를 연결한다. |
Code Block |
---|
[root@localhost ~]# docker run --rm -it --link myredis:redis redis /bin/bash
root@de37625b5996:/data# redis-cli -h redis -p 6379
redis:6379> ping
PONG
redis:6379> set "abc" 123
OK
redis:6379> get "abc"
"123"
redis:6379> exit
root@de37625b5996:/data# exit
exit |
--link myredis:redis 는 새로운 컨테이너와 기존의 myredis 컨테이너를 연결하고,
새로운 컨테이너 안에서 myredis 컨테이너를 redis라는 이름으로 참조하는 작업을 수행했다. |
생성 2
컨테이너 내부에 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 명령어로 한꺼번에 삭제할 수 있다. |
도커 이미지 추출
도커 이미지를 별도로 저장하거나 옮기는 등, 필요에 따라 이미지를 단일 바이너리 파일로 저정해야 할 때가 있다.
docker save 명령어를 사용하여 컨테이너의 커맨드, 이미지 이름과 태그 등 이미지의 모든 메타데이터를 포함해 하나의 파일로 추출한다.
Code Block |
---|
[root@localhost ~]# docker save -o ubuntu_14_04.tar ubuntu:14.04 [root@localhost ~]# docker load -i ubuntu_14_04.tar Loaded image: ubuntu:14.04 |
-o 옵션은 추출될 파일명을 입력한다.
추출된 이미지는 load 명령어로 도커에 다시 로드할 수 있다.
save 로 추출된 이미지는 모든 메타데이터를 포함하고 있기 때문에 load 로 다시 이전의 이미지와 동일하게 도커 엔진에 생성된다.
save, load 명령어와 유사하게 사용될 수 있는 명령어로 export,import가 있다.
export 명령어는 컨테이너의 파일 시스템을 tar 파일로 추출하며 컨테이너 및 이미지에 대한 설정 정보를 저장하지 않는다.
Code Block |
---|
[root@localhost ~]# docker export -o rootFS.tar mycontainer [root@localhost ~]# docker import rootFS.tar myimage:0.0 |
mycontainer 라는 컨테이너의 파일시스템을 rootFS.tar 파일로 추출하고, 이 파일을 import 로 myimage:0.0 이라는 이미지로 다시 저장하는 기능이다.
도커 이미지 배포
위의 save나 export로 이미지를 단일 파일로 추출해서 배포할 수 도 있다.
하지만 이미지 파일의 크기가 너무 크거나 도커 엔진의 수가 많을 경우 이미지를 파일로 배포하기 어렵다.
또한 도커의 이미지 구조인 레이어 형태를 이용하지 않으므로 매우 비효율적이다.
- 이미지를 배포하는 첫번째 방법.
도커에서 공식적으로 제공하는 도커 허브 이미지 저장소를 사용한다. - 이미지를 배포하는 두번째 방법.
도커 사설 레지스트리(docker Private Registry)를 사용한다.
도커 허브 공식 저장소에 이미지 올리기
Code Block |
---|
# docker run # docker commit # docker tag # docker login # docker push |
※ 이미지 이름의 접두어는 이미지가 저장되는 저장소 이름을 설정한다.
즉, 특정 이름의 저장소에 이미지를 올리기 위해서는 저장소이름(사용자이름)을 이미지 앞에 접두어로 추가해야 한다.
# docker tag imagename [계정이름] / [레파지토리명]
도커 사설 저장소에 이미지 올리기
준비중.....