도커는 크게 도커 이미지와 도커 컨테이너로 나뉜다
그 중 도커 이미지는 컨테이너를 생성하는 템플릿 역할을 한다
아래는 도커 이미지를 관리하면서 자주 사용하는 명령어들과 그에 대한 간단한 설명이다
추가적인 명령어나 옵션이 궁금하다면 https://docs.docker.com/engine/reference/commandline/image/ 를 참조한다
docker image build
1 | $ docker image build [options] Dockerfile_경로 |
Dockerfile
에 기술된 내용을 따라 도커 이미지를 생성하는 명령이다
Dockerfile
은 필수로 필요하다
마지막 인자로 Dockerfile의 경로
를 주는것에 유의해야한다
-t 옵션
1 | $ docker image build -t javatest:latest . |
도커 이미지에 이름과 태그를 붙이는 옵션으로 실제 사용에선 거의 필수적으로 쓰인다
지정한 경로에서 Dockerfile
이라는 이름의 파일을 찾고 그 내용을 토대로 이미지를 만든다
태그명은 생략 가능한데, 생략하면 기본적으로
latest
가 붙는다
-f 옵션
1 | $ docker image build -f Dockerfile_test -t javatest:latest . |
Dockerfile
이 아닌 다른 이름을 쓰고 싶을 경우 사용한다
–pull 옵션
1 | $ docker image build --pull=true -t javatest:latest . |
기본적으로 도커 이미지 빌드 시 FROM
인스트럭션에 지정한 이미지를 레지스트리에서 받은 후, 이를 호스트 운영체제 저장해놓고 재사용한다
이를 매번 새로 받아오게 하고 싶을 경우 사용하면 좋다
이 옵션은 아래와 같은 상황을 대비하기 위해 사용하면 좋다
1 | FROM somelibrary:latest |
- 도커 이미지를 빌드한다
FROM
인스트럭션의somelibrary:latest
이미지를 받고 로컬에 저장해둔다
somelibrary
이미지에 버그가 있어서 수정하고, 다시latest
태그로 레지스트리에 올렸다- 위의 Dockerfile 로 이미지를 새로 빌드한다
- 레지스트리의 변경사항이 생성된 이미지에 반영되지 않는다
somelibrary:latest
가 이미 로컬에 있기 때문에 새로 받아오지 않고 재사용한다
이러한 이유로 실무에서는 latest 대신 보통 태그명을 직접 입력한다
docker search
1 | $ docker search [options] 검색_키워드 |
도커 레지스트리에서 이미지를 검색할 때 사용한다
레지스트리를 따로 설정하지 않았다면 기본적으로 도커 허브가 사용된다
도커 허브(Docker Hub)?
도커 사 자체에서 관리하는 도커 이미지 레지스트리로, 깃허브처럼 자신의 계정이나 조직 이름으로 리포티저티를 만들고 이미지를 올릴 수 있다
도커 허브에는 이미 매우 많은 리포지터리가 등록되어 있어서, 직접 도커 이미지를 만들 필요없이 만들어놓은 이미지를 간단하게 사용할 수 있다
참고로 여기서 몇가지 용어의 혼재가 있을 수 있다
- 도커 이미지가 저장되고 관리되는 공간을 도커 레지스트리라고 부른다
도커 허브, ECR, 사내 도커 레지스트리 등등이 될 수 있다
- 이러한 도커 레지스트리내에서 이미지를 저장해두는 공간을 리포지터리라고 부른다
- 그러므로 레지스트리에서 리포지터리를 찾는것은 이미지를 찾는것과 동일한 행위이다
리포지터리명:태그
로 접근한다 - 네임스페이스는 레지스트리내에서 리포지터리의 이름이 중복되는 것을 막기 위해 리포지터리 이름 앞에 작성하는 것을 말한다
1 | $ docker search mysql |
검색결과는 STARS(깃헙과 동일) 순으로 출력되고, 태그명까지는 검색할 수 없다
mysql
처럼 namespace가 없는 애들도 있는데 이는 mysql의 공식 리포지터리라서 그렇다
docker image name format
로컬 내에서는 상관없지만, 도커 허브와 같은 registry 를 끼게 되면 이미지 이름(태그)에 일종의 포멧이 생기게 된다
1 | [레지스트리_호스트/]리포지터리명[:태그] |
- 레지스트리 호스트를 지정해서 리포지터리를 땡겨올 수 있다
생략하면 기본적으로
docker.io
가 추가된다(도커 허브) - 도커 허브를 사용할 경우 리포지터리명 앞에 namespace로 자신의 계정을 줘야한다
그래야 도커 허브 시스템 내에서 리포지터리를 구분할 수 있다
docker image pull
1 | $ docker image pull [options] 리포지터리명[:태그명] |
도커 레지스트리에서 도커 이미지를 내려받을 때 사용한다
1 | $ docker image pull jenkins |
태그명을 생략하면 default 태그가 사용된다(latest
)
docker image ls
1 | $ docker image ls [options] [이미지명[:태그명]] |
현재 호스트 운영체제에 저장된 도커 이미지의 목록을 보여준다
참고로 여기서 조회되는 IMAGE ID는 CONTAINER ID와는 별개의 것이므로 주의해야 한다
도커 IMAGE ID
도커는 이미지를 빌드할 때 마다 새로운 이미지 ID가 부여된다
-
docker 파일을 빌드하여 이미지를 만든다
1
$ docker image build -t javatest:latest .
-
docker image ls로 빌드된 이미지가 잘 저장되었는지 확인한다
1
2
3
4$ docker image ls -a
REPOSITORY TAG IMAGE ID CREATED SIZE
javatest latest 2327e281c9b2 1 hour ago 4.41MB -
Dockerfile을 조금 수정하고 다시 빌드하고, docker image ls 로 확인해본다
1
2
3
4
5
6$ docker image build -t javatest:latest .
$ docker image ls -a
REPOSITORY TAG IMAGE ID CREATED SIZE
javatest latest 57ca5e531d73 1 hour ago 4.40MB
<none> <none> 2327e281c9b2 2 hour ago 4.41MBIMAGE ID가 다른 이미지가 새롭게 빌드되었음을 볼 수 있다
(Dockerfile을 수정할 때 뿐만 아니라 COPY 되는 대상이 바뀌거나 하여도 새로운 이미지로 빌드된다)
똑같은이미지명:태그명
으로 빌드했기 때문에 기존의 이미지에서 REPOSITORY와 TAG가<none>
으로 표시되는 것을 볼 수 있다
결국 IMAGE ID는 도커 이미지의 버전이라고 봐도 무방하다
docker image tag
위에서 봤다시피 태그는 이미지 ID를 식별하기 위해 붙이는 일종의 별칭이다
1 | $ docker image tag 기반이미지명[:태그] 새이미지명[:태그] |
이미지를 가리키는 태그를 추가 생성할 떄 사용한다
새이미지명[:태그]
가 기반이미지명[:태그]
가 가리키고 있던 이미지 ID를 가리키는 상태로 추가된다
1 | $ docker image tag joont92/javatest:latest joont92/javatest:1.0.0 |
보통은 이처럼 latest의 특정 시점에 버전 넘버를 태그로 붙이기위해 사용한다
이렇게 하면 아래와 같이 생성된다
1 | joont92/javatest 1.0.0 4a1fc394fbef |
latest 가 가지고 있던 이미지를 가리키는 1.0.0 이 추가로 생성되었다
docker image push
1 | $ docker image push [options] 리포지터리명[:태그] |
레지스트리로 도커 허브를 사용할 경우 리포지터리명 앞에 자신의 도커 ID로 네임스페이스를 붙여줘야한다
1 | # 네임스페이스를 추가해주고 |
리포지터리에 올라갔음을 볼 수 있다
참고 :