실습 환경
도커 이미지 저장소
- 도커 이미지는 도커허브(Docker Hub)라는 중앙 이미지 저장소에서 이미지를 내려받는다.
$ docker search ubuntu
docker search
명령으로 docker hub
에 저장된 이미지를 검색할 수 있다.
- 다른 여러사람들이 올린 이미지도 존재하니
OFFICIAL
이미지를 사용하도록 하자.
도커 이미지 생성하기
$ docker run -i -t --name commit_prac ubuntu:16.04
# touch abc
Ctrl+p+q
- 새로운 이미지를 생성하기 위해
ubuntu:16.04
기반의 컨테이너를 생성하고 변경사항을 만들고 호스트로 빠져나온다.
$ docker commit -a "hschoi1104" -m "commit_prac_message" commit_prac commit_prac:first
$ docker images
- 이미지를 생성하고
docker images
명령을 통해 확인하면 생성되어있는 것을 확인할 수 있다.
docker commit -a "{작성자}" -m "{커밋메세지}" {컨테이너명} {이미지이름{:태그}}
형태이다.
ubuntu:16.04
이미지를 기반으로 변경사항을 추가한 commit_prac:first
이미지가 생성된 것이다.
$ docker run -i -t --name commit_prac_2 commit_prac:first
# ls
# touch abcd
# ls
Ctrl+p+q
$ docker commit -a "hschoi1104" -m "commit_prac_message" commit_prac_2 commit_prac:second
$ docker images
- 이전에 만든
commit_prac:first
이미지로 commit_prac:second
이미지를 생성한다.
commit_prac:first
이미지를 컨테이너로 실행시키고 ls 를 확인해보면 이전에 commit_prac:first
를 만들때 touch abc 로 생성한 파일이 남아있음을 볼 수 있다.
이미지 구조의 이해
$ docker inspect {이미지명}
docker inspect
명령으로 이미지에대한 정보를 확인할 수 있다.
$ docker inspect unbuntu:16.04
$ docker inspect commit_prac:first
$ docker inspect commit_prac:second
- 처음 도커허브에서 받은
ubuntu:16.04
이미지와 그 이미지를 기반으로 생성한 commit_prac:first
이미지, 그리고 그 이미지를 기반으로 생성한 commit_prac:second
이미지의 layer정보를 살펴보자
- 위에서 부터 layer1,layer2... 라고 할때 ubuntu:16.04 이미지의 layer1~4 와 다른 두개의 이미지의 layer1~4가 전부 똑같은것을 알 수 있다.
commit_prac:first
이미지는 ubuntu:16.04 이미지의 레이어 전부와 추가된 한개의 레이어로 구성되어있다. 이는 ubuntu:16.04 이미지를 기반으로 만들어서 ubuntu:16.04 이미지의 레이어를 모두 가지고 있는 것이고 추가된 한개의 레이어는 commit_prac:first
이미지를 만들 때 변경사항이 기록된 레이어이다.
commit_prac:second
이미지와 commit_prac:fisrt
이미지의 구조 비교도 ubuntu:16.04, commit_prac:first
이미지의 구조 비교와 동일하다.
이미지 삭제
$ docker rmi commit_prac:fisrt
docker rmi
명령으로 이미지 삭제가 가능하다. 하지만 위 명령을 실행했을때 에러가 나는 것을 볼 수 있다. commit_prac:first
이미지를 사용하는 컨테이너가 실행중이기 때문이다. 이런 이미지를 -f
옵션으로 제거할 수 있지만 이것은 파일을 실제로 삭제하지 않고 이름만 지우는 것이다. 그런 이미지들을 댕글링 이미지라고 한다.
$ docker rmi commit_prac:second
$ docker images
commit_prac:second
이미지는 실행되는 컨테이너가 없기때문에 삭제가 가능하다.
이미지 추출하기
$ docker images
$ docker save -o commit_prac commit_prac:first
$ ls
docker save
명령을 통해 이미지를 추출해 낼 수 있으며 -o 옵션은 추출한 파일명을 입력한다.
docker save -o {저장될 파일명} {저장할 이미지{:태그}}
형태이다.
- ls 명령을 통해 파일이 추출된 것을 확인 할 수 있다.
$ docker images
$ docker rmi commit_prac:first
$ docker images
$ docker load -I commit_prac.tar
$ docker images
- 위에서 추출한 이미지를 지우고 추출된 파일에서부터 불러와보자. 불러오기는
docker load
명령을 통해 할 수 있다.
save/load
명령과 비슷한 명령으로 export/import
가 있다.
save/load
명령은 컨테이너의 변경사항과 컨테이너의 설정까지도 저장하지만 export
는 그렇지 않다. 컨테이너 시스템파일만 저장하며 설정파일을 저장하지 않는다.
- 추출된 이미지는 레이어 형식이 아닌 이미지용량 전체를 가지는 파일이 된다. 따라서 비효율적이다.
이미지 배포하기
$ docker tag commit_prac:first hschoi1104/commit_prac:first
$ docker images
- 도커 이미지를 저장소에 올릴땐 도커이미지의 이름이 저장소이름(사용자이름)을 이미지 앞에 접두어로 추가해야한다.
- docker tag 명령으로 수행할 수 있다. docker images 명령으로 확인해보면 이미지가 하나가 더 생겼는데 파일이 복사된게 아닌 가리키는 새로운 이름을 추가한 것이다.
$ docker login
- docker login 명령으로 docker hub 에 로그인 한다.
$ docker push hschoi1104/commit_prac:first
- commit_prac:first 는 우분투 16.04 이미지를 기반으로 만들어졌다. 중복되는 레이어는 업로드 되지 않는다.
- 실제로 전송되는것은 이미지를 생성할때 쓰기 레이어 뿐이다.
- dockerhub 레포지토리에 들어가서 확인한다.
- push 할 이미지 명이 레포지토리와 같다면 레포지토리를 미리 생성하고 업로드 해도 되지만 레포지토리를 만들지 않고 푸시해도 이미지 명과 같은 이름의 레포지토리가 자동으로 생성된다.
$ docker images
$ docker rmi hschoi1104/commit_prac:first commit_prac:first
$ docker images
- 방금 푸시한 이미지를 받아와보자
- 먼저 로컬에 저장된 이미지들을 지운다.
$ docker pull hschoi1104/commit_prac:first
- 이미지를 가져올때도 로컬에
commit_prac:first
이미지의 기본이 됬던 ubuntu:16.04
이미지가 남아있어 중복 레이어는 제외하고 나머지 레이어만 들고오는 것을 확인 할 수 있다.
- 우분투 파일을 지우고 다시
pull
을 실행 해 보았다.
- 모든 레이어를 다운받는 것을 확인할 수 있다.