도커 이미지는 한마디로 정의해보면, 도커 컨테이너를 만들기 위한 템플릿이다.
이러한 도커 이미지를 사용하기 위한 기본 명령어를 살펴보자!
도커의 명령행 도구는 하위 명령 형태로 구성돼 있어, 아래와 같은 형태로 사용해야한다.
% docker COMMAND SUBCOMMAND
⌗ 도커 도움말
% docker help
Usage: docker [OPTIONS] COMMAND
A self-sufficient runtime for containers
Options:
--config string Location of client config files (default
"/Users/jenny/.docker")
-c, --context string Name of the context to use to connect to the
daemon (overrides DOCKER_HOST env var and
default context set with "docker context use")
-D, --debug Enable debug mode
-H, --host list Daemon socket(s) to connect to
-l, --log-level string Set the logging level
("debug"|"info"|"warn"|"error"|"fatal")
(default "info")
--tls Use TLS; implied by --tlsverify
--tlscacert string Trust certs signed only by this CA (default
"/Users/jenny/.docker/ca.pem")
--tlscert string Path to TLS certificate file (default
"/Users/jenny/.docker/cert.pem")
--tlskey string Path to TLS key file (default
"/Users/jenny/.docker/key.pem")
--tlsverify Use TLS and verify the remote
-v, --version Print version information and quit
...
⌗ 도커 이미지를 다루는 하위 명령어 도움말
% docker image --help
Usage: docker image COMMAND
Manage images
Commands:
build Build an image from a Dockerfile
history Show the history of an image
import Import the contents from a tarball to create a filesystem image
inspect Display detailed information on one or more images
load Load an image from a tar archive or STDIN
ls List images
prune Remove unused images
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rm Remove one or more images
save Save one or more images to a tar archive (streamed to STDOUT by default)
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
⌗ 생성된 도커 이미지의 Repository, tag, image ID, created SIZE 등 확인
% docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
docker101tutorial latest 72aa80c28588 4 days ago 26.5MB
<none> <none> c31a8d2204e2 4 days ago 122MB
<none> <none> cfb57bb470d4 4 days ago 108MB
<none> <none> f4843f035582 4 days ago 224MB
node 12-alpine 057fa4cc38c2 11 days ago 89.3MB
python alpine 8ecf5a48c789 5 weeks ago 78.9MB
nginx alpine 7d0cdcc60a96 5 weeks ago 21.3MB
docker/desktop-storage-provisioner v1.1 e704287ce753 3 months ago 41.8MB
docker/desktop-vpnkit-controller v1.0 79da37e5a3aa 4 months ago 36.6MB
docker/desktop-kubernetes kubernetes-v1.16.5-cni-v0.7.5-critools-v1.15.0 a86647f0b376 5 months ago 279MB
k8s.gcr.io/kube-controller-manager v1.16.5 441835dd2301 5 months ago 151MB
k8s.gcr.io/kube-apiserver v1.16.5 fc838b21afbb 5 months ago 159MB
k8s.gcr.io/kube-proxy v1.16.5 0ee1b8a3ebe0 5 months ago 82.7MB
k8s.gcr.io/kube-scheduler v1.16.5 b4d073a9efda 5 months ago 83.5MB
docker/kube-compose-controller v0.4.25-alpha1 129151cdf35f 8 months ago 35.6MB
docker/kube-compose-api-server v0.4.25-alpha1 989749268895 8 months ago 50.7MB
docker/kube-compose-installer v0.4.25-alpha1 2a71ac5a1359 8 months ago 42.3MB
k8s.gcr.io/etcd 3.3.15-0 b2756210eeab 10 months ago 247MB
k8s.gcr.io/coredns 1.6.2 bf261d157914 11 months ago 44.1MB
k8s.gcr.io/pause 3.1 da86e6ba6ca1 2 years ago 742kB
⌗ 도커 이미지 빌드
% docker image build -t 이미지명[:태그명] dockerfile의경로
docker image build 명령은 기본적으로 Dockerfile이라는 이름으로된 파일을 찾아 빌드한다.
한번 빌드되면 도커 이미지를 일부러 삭제하지 않는 한 호스트 운영 체제에 저장된다.
그러므로 이미지를 빌드할 때 매번 베이스 이미지를 받아오지는 않는다.
즉, 로컬에 베이스 이미지 캐시가 있으면 도커는 변경된 부분만 반영해 빌드를 시도한다.
[option]
- -t : 이미지명 및 태그명 설정
★ 실제 사용에서 거의 필수적으로 사용 - -f : 기본(Dockerfile) 외 다른 이름의 dockerfile을 설정
- --pull : 매번 베이스 이미지를 강제로 새로 받아옴 = 최신 베이스 이미지를 사용
→ 빌드 속도가 느림
★ latest로 지정하는 것을 피하고, 태그로 지정한 베이스 이미지를 사용
[Command]
% docker image build -t example/echo:latest .
% docker image build -f Dockerfile-test -t example/eho:latest .
% docker image build --pull=true -t example/echo:latest .
⌗ 도커 이미지 검색
도커 허브는 도커 이미지 레지스트리로,
사용자나 조직 이름으로 저장소(Repository)를 만들 수 있고, 이 Repository를 사용해 도커 이미지를 관리한다.
도커 이미지 검색 명령어를 사용하면, 도커 허브에 등록된 Repository를 검색할 수 있다.
[option]
- --limit : 검색 최대 건수를 제한
[Command]
% docker search --limit 5 mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 9727 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 710 [OK]
mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 73
bitnami/mysql Bitnami MySQL Docker Image 44 [OK]
circleci/mysql MySQL is a widely used, open-source relation… 19
그러나, 이 Repository에 공개된 이미지의 태그를 알고 싶다면, 도커 허브의 해당 Repository 페이지에서 Tags를 보는 방법이나, 다음과 같이 API를 사용하는 방법 중 하나를 사용하며면된다.
[Command]
% curl -s 'https://hub.docker.com/v2/repositories/library/golang/tags/?page_size=10' \|jq -r '.results[].name'
{"count":1509,"next":"https://hub.docker.com/v2/repositories/library/golang/tags/?page=2\u0026page_size=10","previous":null,"results":[{"creator":7,"id":15946,"image_id":null,"images":[{"architecture":"arm","features":"","variant":"v7","digest":"sha256:192ac62fcc68673a7a793c80d0da5cbf1daba1e429623bbcd1710eafcfe2ddaf","os":"linux","os_features":"","os_version":null,"size":264572970},{"architecture":"arm64","features":"","variant":"v8","digest":"sha256:e418737c8e38829dba12c52267c6f06bcd6c6bf8b40d11ebc9762428e9b82538","os":"linux","os_features":"","os_version":null,"size":282552051}]}
⌗ 도커 이미지 내려받기
도커 Repository 에서 도커 image를 내려받으려면 아래의 명령어를 쓰면 된다.
단, 인자로 지정한 저장소(Repository)명과 태그(tag)명은 도커 허브에 이미 존재하는 것이어야 한다 !
태그명을 생략하면 기본값으로 지정된 태그가 적용된다.
이렇게 docker image pull 을 통해 내려받은 이미지는 그대로 도커 컨테이너를 생성하는 데 사용할 수 있다.
% docker image pull [옵션] [저장소명[:태그명]]
% docker image pull jenkins:latest
latest: Pulling from library/jenkins
55cbf04beb70: Already exists
1607093a898c: Already exists
9a8ea045c926: Already exists
d4eee24d4dac: Already exists
c58988e753d7: Pull complete
...
1322ea3e7bfd: Pull complete
Digest: sha256:eeb4850eb65f2d92500e421b430ed1ec58a7ac909e91f518926e02473904f668
Status: Downloaded newer image for jenkins:latest
docker.io/library/jenkins:latest
⌗ 보유한 도커 이미지 목록 보기
현재 호스트 운영체제(도커 데몬이 동작하는 호스트 환경)에 저장된 도커 이미지의 목록을 보여준다.
즉, docker image pull 명령으로 원격 도커 레지스트리에서 내려받은 이미지 및 docker image build 명령을 실행하며 내려받은 이미지 모두 호스트 운영 체제에 저장된다.
% docker image ls [옵션] [저장소명[:태그명]]
% docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
example/echo latest 58c20071e472 30 hours ago 750MB
docker101tutorial latest 72aa80c28588 5 days ago 26.5MB
node 12-alpine 057fa4cc38c2 12 days ago 89.3MB
..
jenkins latest cd14cecfdb3a 24 months ago 696MB
여기서, IMAGE ID에 나온 해시값은 이미지마다 다르게 할당된 식별자로, 이미지를 구별하기 위해 사용한다.
그리고 이는 도커 이미지의 버전 넘버 역할을 한다.
애플리케이션을 수정하고 이미지를 빌드하면, 매번 다른 이미지가 된다.
(예시)
% docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
example/echo latest 58c20071e472 29 hours ago 750MB
<none> <none> ac4b96c6fb78 29 hours ago 750MB
<none> <none> 25ba805d10fe 29 hours ago 750MB
<none> <none> 5e39adee5384 29 hours ago 750MB
그리고, REPOSITORY와 TAG 칼럼을 보면 최신 이미지가 example/echo:latest이고, 그 이전의 이미지는 <none>이라고 돼있다.
<none>는 이전에 example/echo였던 도커 이미지의 잔재다.
도커에서 태크 하나에 연결될 수 있는 이미지는 하나뿐이다 !!
여기 나온 latest 태그는 최신 이미지에만 붙을 수 있고, 그 보다 오래된 태그가 해제됐기 때문에 <none>가 된다.
⌗ 도커 이미지에 태그 붙이기
도커 이미지는 빌드할때 마다 다시 생성되는데, 그 내요으이 해시값을 이미지 ID로 삼기 떄문에 내용이 바뀌면 이미지 ID도 새값이 부여된다.
즉, 도커 이미지의 태그는 '어떤 특정 이미지ID를 갖는 도커 이미지를 쉽게 식별하는 것'을 목적으로 한다.
태그를 지정하지 않고 빌드한 이미지는 기본적으로 latest 태그가 부여된다.
따라서, ★ 도커를 사용할 때는 latest의 특정 시점에 버전 넘버 등을 태그로 붙여두고, 이 특정 버전 이미지를 사용하도록 하는 것이 좋다.
% docker image tag 기반이미지명[:태그] 새이미지명[:태그]
% docker image tag example/echo:latest example/echo:0.1.0
% docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
example/echo 0.1.0 58c20071e472 31 hours ago 750MB
example/echo latest 58c20071e472 31 hours ago 750MB
⌗ 도커 이미지를 외부에 공개하기
현재 저장된 도커 이미지를 도커 허브등의 레지스트리에 등록하기 위해 사용한다.
% docker image push [옵션] [저장소명[:태그]]
1 ) 도커 허브(hub.docker.com)에서 계정을 생성한 후 docker longin 명령을 통해 도커 허브에 로그인 한다.
% docker login
Authenticating with existing credentials...
Login Succeeded
or
% docker login -u [계정 ID] -p [계정 패스워드]
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded
2 ) 태그 설정 명령을 사용해 도커 이미지의 네임스페이스를 바꿔야한다.
⇢ 도커 허브는 자신 혹은 소속 기관이 소유한 저장소(Repository)에만 도커 이미지를 등록할 수 있다.
따라서, 네임스페이스를 도커 허브 ID와 같이 변경한다.
% docker image tag example/echo:latest [계정ID]/echo:latest
3 ) docker image push 명령을 통해 등록할 이미지를 지정한다. 정상 등록이 되면 SHA256 해시값이 출력된다.
% docker image push lilylee9292/echo:latest
The push refers to repository [docker.io/lilylee9292/echo]
e99a749ec99e: Pushed
e9528af6e9d4: Pushed
186d94bd2c62: Mounted from library/golang
24a9d20e5bee: Mounted from library/golang
e7dc337030ba: Mounted from library/golang
920961b94eb3: Mounted from library/golang
fa0c3f992cbd: Mounted from library/jenkins
ce6466f43b11: Mounted from library/jenkins
719d45669b35: Mounted from library/jenkins
3b10514a95be: Mounted from library/jenkins
latest: digest: sha256:b04410f8f717d886038831ffdd6dc290edc2b06f62614a65baa8b9c1f38539c6 size: 2418
4 ) 도커 허브에 접속하면 아래와 같이 저장소(Repository)가 등록된 것을 확인할 수 있다.
- 이 저장소는 공개 Repository로 누구나 docker image pull 명령으로 이미지를 내려받을 수 있다.
- 따라서 공개 Repository에 등록할 이미지나 Dockerfile에는 민감한 정보(패스워드, API 키 값, ...)가 포함되지 않도록 주의하자 !
'Java > Deploy' 카테고리의 다른 글
[Docker] 도커 컴포즈로 여러 컨테이너 실행 및 젠킨스 연동 (0) | 2020.07.14 |
---|---|
[Docker] 도커 운영 및 관리를 위한 명령어 (0) | 2020.07.14 |
[Docker] 도커 컨테이너 사용을 위한 명령어 (0) | 2020.07.14 |
[Docker] 도커 포트포워딩 (0) | 2020.07.12 |
[Docker] 도커 이미지 / 컨테이너 다루기 (0) | 2020.07.12 |
[Docker] Mac에서 도커 시작하기, Docker Tutorial (0) | 2020.07.08 |