[DevOps/Docker] Docker Image Commands (push, pull, ls, inspect, tag, search, rm, prune, login, logout) & DCT
이미지 다운로드 (docker image pull)
Docker Hub에서 이미지를 다운로드 해 보자. 이미지 취득은 docker image pull 명령을 사용한다.
docker image pull [옵션] 이미지명 [:태그명]
예를 들어 CentOS의 버전 (태그명: 7)을 다운로드하려면 아래의 명령을 실행한다.
$ docker image pull centos:7
태그명을 생략하면 최신판(latest)을 취득한다. 또한 아래의 명령을 실행하면 모든 태그의 Docker 이미지를 취득할 수 있다.
$ docker image pull -a centos
-a 옵션을 지정하면 모든 태그를 취득할 수 있다. 또한 -a 옵션을 지정할 때는 Docker 이미지명에 태그를 지정할 수 없으므로 주의해야 한다.
Docker 이미지명에 이미지를 취득할 URL을 지정할 수도 있다. URL은 프로토콜 (https://)을 제외하고 지정한다.
예를 들어 아래의 명령을 실행하면 오픈소스 기계학습용 프레임워크인 TensorFlow의 Docker 이미지를 'https://gcr.io.tensorflow/tensorflow' 로부터 취득할 수 있다.
$ docker image pull gcr.io.tensorflow/tensorflow
이미지 목록 표시 (docker image ls)
취득한 이미지의 목록을 표시하려면 docker image ls 명령을 사용한다. 이 명령의 구문은 다음과 같다.
docker image ls [옵션] [리포지토리명]
지정할 수 있는 주요 옵션
옵션 | 설명 |
-all, -a | 모든 이미지를 표시 |
--digests | DIGEST 표시 여부 |
--no-trunc | 결과를 모두 표시 |
--quiet, -q | Docker 이미지 ID만 표시 |
docker iamge ls 명령으로 취득한 Docker 이미지의 목록을 표시하려면 아래의 명령을 실행한다.
$ docker image ls
// 결과
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7 8122s9fxc4hc 5 days ago 204MB
Docker 이미지를 작성하면 고유한 이미지 ID (IMAGE ID)가 부여된다. 이미지 ID는 랜덤한 문자열이다.
명령의 실행 예를 확인하면 이미지 ID가 '8122s9fxc4hc' 인 centos 이미지의 최신판이 로컬 환경에 다운로드되어 있다는 것을 알 수 있다. -a 옵션을 지정하면 중간 이미지도 모두 표시된다.
항목 | 설명 |
REPOSITORY | 이미지 이름 |
TAG | 이미지 태그명 |
IMAGE ID | 이미지 ID |
CREATED | 작성일 |
SIZE | 이미지 크기 |
또한 Docker 레지스트리에 업로드한 이미지는 이미지를 고유하게 식별하기 위한 digest가 부여된다. digest를 표시하고 싶을 때는 --digests 옵션을 설정한다.
이미지의 위장이나 변조를 막으려면?
Docker에는 인프라 구성이 포함되기 때문에 악의를 가진 제3자가 '위장'이나 '변조'를 하지 못하도록 이미지를 보호해야 한다. 이 때 Docker Content Trust(DCT)라는 기능을 사용하면 Docker 이미지의 정당성을 확인할 수 있다.
서명
이미지 작성자가 Docker 레지스트리에 이미지를 업로드 (docker image push) 하기 전에 로컬 환경에서 이미지 작성자의 비밀키를 사용하여 이미지에 서명한다. 이 비밀키를 Offline Key라고 한다. 이 키는 보안상 매우 중요한 키이므로 엄중하게 관리할 필요가 있다.
검증
서명이 된 이미지를 다운로드 (docker image pull) 할 때, 이미지 작성자의 공개키를 사용하여 이미지가 진짜인지 아닌지를 확인한다. 만일 변조된 경우는 그 이미지를 무효로 만든다. 이 공개키를 Tagging Key라고 한다.
DCT 기능을 사용하려면 아래처럼 설정한다.
// DCT 기능의 유효화
$ export DOCKER_CONTENT_TRUST=1
이 기능을 유효화해 놓으면 docker image pull 명령을 사용하여 이미지를 다운로드할 때 아래와 같이 이미지의 검증이 일어나는 것을 알 수 있다.
// DCT 기능을 사용했을 때의 이미지 다운로드
$ docker image pull ubuntu:latest
// 결과
Pull (1 of 1): ubuntu:latest@sha256:aaa1235a1a8ae92867721d90c59a75652ea66d29c05294e6e2f898704bdb8cf1
sha256:aaa1235a1a8ae92867721d90c59a75652ea66d29c05294e6e2f898704bdb8cf1: Pulling from library/ubuntu
Digest: sha256:aaa1235a1a8ae92867721d90c59a75652ea66d29c05294e6e2f898704bdb8cf1
Status: Image is up to date for ubuntu@sha256:aaa1235a1a8ae92867721d90c59a75652ea66d29c05294e6e2f898704bdb8cf1
Tagging ubuntu@sha256:aaa1235a1a8ae92867721d90c59a75652ea66d29c05294e6e2f898704bdb8cf1 as ubuntu:latest
docker.io/library/ubuntu:latest
또한 서명이 되어 있지 않은 이미지를 사용하면 오류가 발생한다. DCT 기능을 무효화하려면 다음의 명령을 실행한다.
export DOCKER_CONTENT_TRUST=0
DCT 기능에 대한 자세한 정보는 공식 사이트에서 확인하면 된다.
docs.docker.com/engine/security/trust/
Content trust in Docker
docs.docker.com
이미지 상세 정보 확인 (docker image inspect)
이미지 상세 정보를 확인하려면 docker image inspect 명령을 사용한다. 예를 들어 centos:7 이라는 이미지 상세 정보를 확인하려면 다음과 같이 명령을 실행한다.
결과는 JSON 형식으로 표시된다. JSON은 JavaScript Object Notation의 약자로, 텍스트 기반 데이터 포맷이다. 예를 들어 OS의 값을 취득하고 싶을 때는 --format 옵션에서 JSON 형식 데이터의 계층 구조를 지정한다. OS의 값은 루트 아래에 있는 "OS" 안에 설정되어 있으므로 아래의 명령처럼 --format 옵션에서 {{.OS}}를 지정한다.
// OS 정보 취득
$ docker image inspect --format="{{.Os}}" centos:7
// 결과
linux
마찬가지로 ContainerConfig의 Image 값을 취득하고 싶을 때는 아래의 같이 실행한다.
// image 정보 취득
$ docker image inspect --format="{{.ContainerConfig.Image}}" centos:7
// 결과
sha256:sadfasdf234231412348efd0d4dd0969ea27c743214365sadfsd25c4f13f932e2345983
이미지 태그 설정 (docker image tag)
이미지에 표식이 되는 태그를 붙이려면 docker image tag 명령을 사용한다. 이미지 태그에는 식별하기 쉬운 버전명을 붙이는 것이 일반적이다. 또한 Docker Hub에 작성한 이미지를 등록하려면 다음과 같은 규칙으로 이미지에 사용자명을 붙여야 한다.
<Docker Hub 사용자명>/이미지명:[태그명]
예를 들어 nginx라는 이름의 이미지에 대해 사용자명이 scii이고, 컨테이너명이 webserver이며, 태그에 버전 정보가 1.0인 태그를 붙일 때는 다음과 같이 명령을 실행한다.
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest asd4323b5153 31 hours ago 133MB
// 이미지에 대한 태그 설정
$ docker image tag nginx scii/webserver:1.0
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest asd4323b5153 31 hours ago 133MB
scii/webserver 1.0 asd4323b5153 31 hours ago 133MB
여기서 확인해 둘 것은 태그를 붙인 이미지 (scii/webserver:1.0) 와 원래의 이미지 (nginx) 의 'IMAGE ID' 가 똑같다는 것이다. 이는 이 둘의 실체가 똑같다는 것을 의미한다. 즉, 이미지에 별명을 붙일 뿐 이미지 자체를 복사하거나 이름을 바꾼 것이 아니라는 점에 주의해야 한다.
이미지 검색 (docker search)
Docker Hub에 공개되어 있는 이미지를 검색할 때는 docker search 명령을 사용한다. 이 명의 구문은 다음과 같다.
$ docker search [옵션] <검색 키워드>
지정할 수 있는 주요 옵션
옵션 | 설명 |
--no-trunc | 결과를 모두 표시 |
--limit | n건의 검색 결과를 표시 |
--filter=stars=n | 즐겨찾기의 수(n 이상)를 지정 |
docker search 명령을 사용하여 Docker Hub에서 공개되어 있는 'nginx'에 관한 Docker 이미지를 검색하려면 아래의 명령을 실행한다.
// Docker Hub에 공개되어 있는 이미지 검색
$ docker search nginx --filter=stars=1000
// 결과
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 14045 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1910 [OK]
검색 조건과 일치한 Docker 이미지의 목록이 표시된다. 공식 Docker 이미지는 [OFFICIAL]이 [OK]로 표시된다. 또한 [STARTS] 는 사용자가 즐겨찾기로 표시한 건수를 나타내므로, [STARS]가 많으면 많을수록 인기 있는 Docker 이미지라는 것을 알 수 있다.
항목 | 설명 |
NAME | 이미지 이름 |
DESCRIPTION | 이미지 설명 |
STARS | 즐겨찾기 수 |
OFFICIAL | 공식 이미지 여부 |
AUTOMATED | Dockerfile을 바탕으로 자동 생성된 이미지 여부 |
Docker Hub에 공개되어 있는 이미지가 모두 안전한 것이라고 할 수 없다. 그래서 Docker 이미지를 이용할 때는 안전을 위해 공식 이미지이거나 Dockerfile이 제대로 공개되어 있는 것을 선택하여 확인해야 한다.
Docker 이미지의 명명 규칙 |
Docker Hub에는 사용자가 작성한 임의의 Docker 이미지를 공개할 수 있다. 그래서 Docker 이미지의 이름을 고유하게 하기 위해 '사용자명/이미지명' 형식으로 이름을 붙인다. 또한 centos나 ubuntu와 같이 사용자명을 갖지 않는 이미지도 있다. 이러한 것은 Docker의 공식 이미지라는 것을 나타낸다. 예를 들어 scii라는 사용자가 webapp이라는 이름의 이미지를 작성할 때 Docker 이미지의 이름은 scii/webapp 이 된다. |
이미지 삭제 (docker image rm)
작성한 이미지를 삭제하려면 docker image rm 명령을 사용한다. 이 명령의 구문의 다음과 같다.
$ docker image rm [옵션] 이미지명 [이미지명]
지정할 수 있는 주요 옵션
옵션 | 설명 |
--force, -f | 이미지를 강제로 삭제 |
--no-prune | 중간 이미지를 삭제하지 않음 |
이미지명은 [REPOSITORY] 또는 [IMAGE ID]를 지정한다. 예를 들어 [REPOSITORY]가 nginx인 이미지를 삭제하려면 다음과 같이 명령해야 한다.
$ docker image rm nginx
docker image rm 명령을 실행하면 중간 이미지도 함께 삭제된다. 또한 명령의 인수로 컨테이너의 [IMAGE ID]를 지정할 수도 있다. [IMAGE ID]는 이미지를 고유하게 지정할 수만 있으면 되므로 모든 자리를 지정하지 않아도 처음 3자리 정도만 지정해도 된다. 여러 개의 이미지를 삭제하고 싶을 때는 여러 이미지명을 스페이스로 구분하여 지정한다.
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest aa15903b4e43 34 hours ago 133MB
scii/webserver 1.0 aa15903b4e43 34 hours ago 133MB
// nginx 이미지 삭제
$ docker image rm nginx
Untagged: nginx:latest
Untagged: nginx@sha256:c3a1592d2b6d275bef4087573355827b200b00ffc2d9849890a4f3aa2128c4ae
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
scii/webserver 1.0 aa15903b4e43 34 hours ago 133MB
또한 사용하지 않은 Docker 이미지를 삭제할 때는 docker image prune 명령을 사용해야 한다. 이 명령의 구문은 다음과 같다.
$ docker image prune [옵션]
지정할 수 있는 주요 옵션
옵션 | 설명 |
--all, -a | 사용하지 않은 이미지를 모두 삭제 |
--force, -f | 이미지를 강제로 삭제 |
사용하지 않은 Docker 이미지는 디스크 용량을 쓸데없이 차지하기 때문에 "docker image prune" 명령을 사용하여 정기적으로 삭제하는 것이 좋다.
Docker Hub에 로그인 (docker login)
Docker 저장소에 업로드를 하려면 docker login 명령을 사용하여 로그인한다.
docker login [옵션] [서버]
지정할 수 있는 주요 옵션
옵션 | 설명 |
--password, -p | 비밀번호 |
--username -u | 사용자명 |
옵션을 지정하지 않으면 사용자명과 비밀번호를 물어보므로 Docker Hub에 등록한 계정을 지정한다.
로그인에 성공하면 'Login Succeeded' 라는 메시지가 표시된다. 서버명을 지정하지 않았을 때는 Docker Hub에 액세스된다. 다른 환경에 Docker 저장소가 있는 경우 서버명을 지정한다.
Docker Hub에서 로그아웃 (docker logout)
Docker Hub에서 로그아웃하려면 docker logout 명령을 사용한다.
docker logout [서버명]
서버명을 지정하지 않았을 때는 Docker Hub에 액세스한다. 다른 환경에 Docker 저장소가 있는 경우 서버명을 지정한다.
이미지 업로드 (docker image push)
Docker Hub에 이미지를 업로드하려면 docker image push 명령을 사용한다.
docker image push 이미지명:[태그명]
Docker Hub에 업로드할 이미지는 다음과 같은 형식으로 지정한다.
<Docker Hub 사용자명>/이미지명:[태그명]
또한 사전에 Docker Hub에 계정을 만들고 docker login 명령으로 로그인해 둘 필요가 있다.예를 들어 Docker Hub에 scii 라는 계정으로 webserver라는 이미지명의 태그가 1.0인 이미지를 업로드할 때는 다음과 같은 명령을 실행한다.
$ docker image push scii/webserver:1.0
업로드가 완료되면 Docker Hub에 새로운 이미지가 등록된 것을 확인할 수 있다. 또한 docker search 명령을 사용하여 검색도 할 수 있다.