Versions Compared

Key

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

Table of Contents
maxLevel2


도커 이미지

이미지는 컨테이너를 생성할 때 필요한 추상적인 요소이다.

여러개의 계층 및 레이어 형태로 된 바이너리 파일들이 존재하고,

그 위로 컨테이너를 생성하여 실행할때 읽기 전용으로 사용된다.

이미지는 도커 명령어로 내려받을 수 있으며 별도 설치할 필요는 없다.다시 말하지만, 이미지는 추상적인 필요가 없는 개념이다.이미지는 기본적으로 다음가 같은 형태로 구성된다.

■ 이미지의 기본적 형태

Panel

[저장소이름저장소] / [이미지이름] : [태그]

레지스트리(Registry)

  • 이미지를 운영하고 배포하는 역할. (기본 레지스트리는 도커 허브를 나타냄)

저장소(Repository) 

이름은 이미지가
  • 이미지의 저장된 장소, 저장소 이름이 명시되지 않는 경우 도커에서 기본적으로 제공함.

이미지

이름 

이름(Name)

  • 해당 이미지가 어떤 역할을 하는지
나타낸다.
  • 나타냄, 이미지의 이름은 생략할 수 없으며
반드시 설정해야
  • 필수설정해야 ..

태그(Tag)

  • 이미지의 버전관리, 리비전(Revision) 관리에
사용된다.
  • 사용됨, 태그를 생략하면 도커엔진은 이미지의 태그를 latest로 인식함.



도커 이미지 생성

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


생성 1

실제 허브에 존배하는 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로 이미지를 단일 파일로 추출해서 배포할 수 도 있다. 

하지만 이미지 파일의 크기가 너무 크거나 도커 엔진의 수가 많을 경우 이미지를 파일로 배포하기 어렵다.

또한 도커의 이미지 구조인 레이어 형태를 이용하지 않으므로 매우 비효율적이다.

  1. 이미지를 배포하는 첫번째 방법.
    도커에서 공식적으로 제공하는 도커 허브 이미지 저장소를 사용한다.

  2. 이미지를 배포하는 두번째 방법.
    도커 사설 레지스트리(docker Private Registry)를 사용한다.

도커 허브 공식 저장소에 이미지 올리기

Code Block
# docker run
# docker commit
# docker tag
# docker login
# docker push

※ 이미지 이름의 접두어는 이미지가 저장되는 저장소 이름을 설정한다. 

즉, 특정 이름의 저장소에 이미지를 올리기 위해서는 저장소이름(사용자이름)을 이미지 앞에 접두어로 추가해야 한다.

# docker tag imagename [계정이름] / [레파지토리명]

도커 사설 저장소에 이미지 올리기

준비중.....