[docker] image 다루기

도커는 크게 도커 이미지와 도커 컨테이너로 나뉜다
그 중 도커 이미지는 컨테이너를 생성하는 템플릿 역할을 한다

아래는 도커 이미지를 관리하면서 자주 사용하는 명령어들과 그에 대한 간단한 설명이다
추가적인 명령어나 옵션이 궁금하다면 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
2
3
FROM somelibrary:latest

...
  1. 도커 이미지를 빌드한다
    • FROM 인스트럭션의 somelibrary:latest 이미지를 받고 로컬에 저장해둔다
  2. somelibrary 이미지에 버그가 있어서 수정하고, 다시 latest 태그로 레지스트리에 올렸다
  3. 위의 Dockerfile 로 이미지를 새로 빌드한다
  4. 레지스트리의 변경사항이 생성된 이미지에 반영되지 않는다
    • somelibrary:latest가 이미 로컬에 있기 때문에 새로 받아오지 않고 재사용한다

이러한 이유로 실무에서는 latest 대신 보통 태그명을 직접 입력한다

docker search

1
$ docker search [options] 검색_키워드

도커 레지스트리에서 이미지를 검색할 때 사용한다
레지스트리를 따로 설정하지 않았다면 기본적으로 도커 허브가 사용된다

도커 허브(Docker Hub)?
도커 사 자체에서 관리하는 도커 이미지 레지스트리로, 깃허브처럼 자신의 계정이나 조직 이름으로 리포티저티를 만들고 이미지를 올릴 수 있다
도커 허브에는 이미 매우 많은 리포지터리가 등록되어 있어서, 직접 도커 이미지를 만들 필요없이 만들어놓은 이미지를 간단하게 사용할 수 있다

참고로 여기서 몇가지 용어의 혼재가 있을 수 있다

  • 도커 이미지가 저장되고 관리되는 공간을 도커 레지스트리라고 부른다

    도커 허브, ECR, 사내 도커 레지스트리 등등이 될 수 있다

  • 이러한 도커 레지스트리내에서 이미지를 저장해두는 공간을 리포지터리라고 부른다
  • 그러므로 레지스트리에서 리포지터리를 찾는것은 이미지를 찾는것과 동일한 행위이다

    리포지터리명:태그로 접근한다

  • 네임스페이스는 레지스트리내에서 리포지터리의 이름이 중복되는 것을 막기 위해 리포지터리 이름 앞에 작성하는 것을 말한다
1
2
$ docker search mysql
$ docker search --limit 5 mysql # 5건만 검색

검색결과는 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가 부여된다

  1. docker 파일을 빌드하여 이미지를 만든다

    1
    $ docker image build -t javatest:latest .
  2. 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
  3. 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.41MB

    IMAGE 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
2
joont92/javatest           1.0.0               4a1fc394fbef
joont92/javatest latest 4a1fc394fbef

latest 가 가지고 있던 이미지를 가리키는 1.0.0 이 추가로 생성되었다

docker image push

1
$ docker image push [options] 리포지터리명[:태그]

레지스트리로 도커 허브를 사용할 경우 리포지터리명 앞에 자신의 도커 ID로 네임스페이스를 붙여줘야한다

1
2
3
4
# 네임스페이스를 추가해주고
$ docker image tag javatest:latest joont92/javatest:latest
# push
$ docker image push joont92/javatest:latest

도커허브-push
리포지터리에 올라갔음을 볼 수 있다

참고 :