Page History
Table of Contents | ||
---|---|---|
|
도커 이미지
이미지는 컨테이너를 생성할 때 필요한 추상적인 요소이다.
여러개의 계층 및 레이어 형태로 된 바이너리 파일들이 존재하고,
그 위로 컨테이너를 생성하여 실행할때 읽기 전용으로 사용된다.
이미지는 도커 명령어로 내려받을 수 있으며 별도 설치할 필요는 없다.다시 말하지만, 이미지는 추상적인 필요가 없는 개념이다.이미지는 기본적으로 다음가 같은 형태로 구성된다.
■ 이미지의 기본적 형태
Panel |
---|
[저장소이름저장소] / [이미지이름] : [태그] |
레지스트리(Registry)
- 이미지를 운영하고 배포하는 역할. (기본 레지스트리는 도커 허브를 나타냄)
저장소(Repository)
이름은 이미지가- 이미지의 저장된 장소, 저장소 이름이 명시되지 않는 경우 도커에서 기본적으로 제공함.
이미지
이름이름(Name)
- 해당 이미지가 어떤 역할을 하는지
- 나타냄, 이미지의 이름은 생략할 수 없으며
- 필수설정해야 함..
태그(Tag)
- 이미지의 버전관리, 리비전(Revision) 관리에
- 사용됨, 태그를 생략하면 도커엔진은 이미지의 태그를 latest로 인식함.
도커 이미지 생성
Hello world
Code Block |
---|
# docker run -i -t ubuntu echo Hello world |
실제 허브에 존재하는 Redis 이미지 생성 예제.
Code Block |
---|
# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
d2ca7eff5948: Pull complete
1d1a2245aaa6: Pull complete
...
Digest: sha256:e55dff3a21a0e7ba25e91925ed0d92...
Status: Downloaded newer image for redis:latest |
그리고 redis 컨테이너를 시작한다.
Code Block |
---|
# docker run redis
4f839c854df62fc59e6d0d42b87be51fe8... |
생성 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 [계정이름] / [레파지토리명]
도커 사설 저장소에 이미지 올리기
준비중.....
이미지 History, 파일(복사)꺼내기, 재생성(Commit), Diff 변경
이미지 및 컨테이너를 운영중일때에는 다음과 같은 변수가 발생된다.
이미지 히스토리 추척, 컨테이너 안의 파일 꺼내기, 수정된 이미지 재생성 하기, 변경사항 확인이 세부사항 확인하기등이 자주 발생되며,
다음과 같이 히스토리, 꺼내기, 재생성, 변경, 확인등을 확인 할 수 있다.
이미지 History
다음의 명령어로 nginx hello:0.1 의 이미지의 히스토리를 조회한다.
Code Block |
---|
[root@localhost opt]# docker history hello:0.1
IMAGE CREATED CREATED BY SIZE COMMENT
999c684d0bcd 41 minutes ago /bin/sh -c #(nop) EXPOSE 443 0B
55e4338ae9e4 41 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
d3b6a7848498 41 minutes ago /bin/sh -c #(nop) CMD ["nginx"] 0B
848977648f81 41 minutes ago /bin/sh -c #(nop) WORKDIR /etc/nginx 0B
bf956649b02f 41 minutes ago /bin/sh -c #(nop) VOLUME [/data /etc/nginx/... 0B
af602693981f 41 minutes ago /bin/sh -c chown -R www-data:www-data /var/l... 0B
d1732b40bc70 41 minutes ago /bin/sh -c echo "\ndaemon off;" >> /etc/ngin... 1.61kB
6c9a688400e8 41 minutes ago /bin/sh -c apt-get install -y nginx 20.8MB
fddb32abbb4f 41 minutes ago /bin/sh -c apt-get update 21.2MB |
docker history <이미지 이름>:<태그>
형식이며,
이렇게 Dockefile에 설정한 대로 히스토리가 생성된다.
cp 명령어로 파일 꺼내기
컨테이너에서 파일을 꺼내기 또는 복사하기를 사용한다.
Code Block |
---|
[root@localhost example]# docker cp hello-nginx:/etc/nginx/nginx.conf ./
[root@localhost example]# ll
합계 8
-rw-r--r-- 1 root root 316 2월 26 16:07 Dockerfile
-rw-r--r-- 1 root root 1614 2월 26 16:24 nginx.conf |
docker cp <컨테이너 이름>:<경로> <호스트 경로>
형식이며,
컨테이너 내의 /etc/nginx/nginx.conf 파일이 호스트 디렉토리, 현재 디렉터리에 nginx.conf 파일이 복사되었다.
commit 으로 컨테이너의 변경사항을 이미지로 재생성 하기
docker commit 명령은 컨테이너의 변경 사항을 이미지 파일로 재생성한다.
Code Block |
---|
[root@localhost example]# docker commit -a "Foo Bar<foo@bar.com>" -m "add hello.txt" hello-nginx hello:0.2
sha256:d8331a7bec63aa5e3573a2cb9b5911cf6ee87b6c481142ae90284dea9cee0876
[root@localhost example]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6e4182c519b5 hello:0.1 "nginx" About an hour ago Up About an hour 443/tcp, 0.0.0.0:8000->80/tcp hello-nginx
[root@localhost example]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello 0.2 d8331a7bec63 7 seconds ago 264MB
hello 0.1 999c684d0bcd About an hour ago 264MB
ubuntu 14.04 dc4491992653 4 weeks ago 222MB
centos 7 ff426288ea90 6 weeks ago 207MB |
docker commit <옵션> <컨테이너 이름> <이미지 이름>:<태그>
형식이며,
-a "Foo Bar <foo@bar.com>"과 -m "add hello.txt"
옵션으로
커밋한 사용자와 로그 메시지를 설정, hello-nginx 컨테이너를 hello:0.2 이미지로 재생성한다.
diff 명령으로 컨테이너에서 변경된 파일 확인하기
docker diff
명령은 컨테이너가 실행되면서 변경된 파일 목록을 출력한다.
Code Block |
---|
[root@localhost example]# docker diff hello-nginx
A /data
C /etc
C /etc/nginx
A /etc/nginx/site-enabled
C /run
A /run/nginx.pid
C /var/lib/nginx
A /var/lib/nginx/body
A /var/lib/nginx/fastcgi
A /var/lib/nginx/proxy
A /var/lib/nginx/scgi
A /var/lib/nginx/uwsgi |
docker diff <컨테이너 이름>
형식으로 컨테이너 이름 대신 컨테이너 ID를 사용해도 된다.
※ A
는 추가된 파일, C
는 변경된 파일, D
는 삭제된 파일입니다.
inspect 으로 이미지와 컨테이너 세부정보 확인하기
Code Block |
---|
[root@localhost example]# docker inspect hello-nginx
[
{
"Id": "6e4182c519b5149824f6ea87d3f04c4cd2e4ff3d3f8b7be8a6aa60d0aea9dd4d",
"Created": "2018-02-26T07:26:11.375748628Z",
"Path": "nginx",
"Args": [],
"State": {
"Status": "running",
... |
docker inspect <이미지 또는 컨테이너 이름>
형식이며,
이미지, 컨테이너 이름 대신 이미지 ID나, 컨테이너 ID를 사용해도 된다.