3 minute read

Docker container에서 작업한 것을 이미지로 만들고, docker hub에 업로드 하는 것을 해보겠습니다.

docker가 설치되어 있다고 가정하고 진행하겠습니다. 아직 설치가 안되어있는 분들은 여기를 참고해주시면 좋겠습니다.


도커 이미지와 컨테이너

도커에는 이미지랑 컨테이너라는 개념이 있습니다.

이미지는 어떤 애플리케이션을 실행하기 위한 환경이라고 할 수 있습니다. 이러한 환경을 구축하기 위해 파일들을 모아놓은 것입니다.

컨테이너는 반드시 이미지가 있어야합니다. 컨테이너는 이미지에 있는 파일들의 집합 위에서 실행된 특별한 프로세스입니다.


도커 이미지를 받고 컨테이너에서 작업한 후 이미지 만들기

이미지는 불변이지만, 그 대신 도커에서는 이 이미지 위에 무언가를 더해서 새로운 이미지를 만들어내는 일이 가능합니다. 특정한 이미지로부터 생성된 컨테이너에 어떠한 변경사항을 추가하고, 이 변경된 상태를 새로운 이미지로 만들어내는 것이 가능합니다.

먼저 우분투 바이오닉 비버 Ubuntu Bionic Beaver (우분투 18.04 LTS의 코드명) 이미지를 다운로드 받고 컨테이너를 실행시켜 git을 설치해보겠습니다.

$ docker pull ubuntu:bionic
...
$ docker run -it ubuntu:bionic bash
root@2bc26d18d74f:/#

먼저 이 우분투 기본 이미지에는 git이 설치되어있지 않다는 것을 확인해봅니다.

root@2bc26d18d74f:/# git --version
bash: git: command not found


또한 git diff 명령어로 프로젝트의 변경사항을 확인하듯이, docker diff 명령어로 부모 이미지와 여기서 파생된 컨테이너의 파일 시스템 간의 변경사항을 확인할 수 있습니다. 셸을 그대로 두고 다른 셀에서 아래의 command를 실행해봅니다.

$ docker ps
CONTAINER ID   IMAGE           COMMAND   CREATED         STATUS         PORTS     NAMES
2bc26d18d74f   ubuntu:bionic   "bash"    2 minutes ago   Up 2 minutes             distracted_khorana

$ docker diff 2bc26d18d74f

이 컨테이너는 아직 이미지 파일 시스템 상태 그대로이기 때문에 아무것도 출력되지 않을 것입니다. 이제 git을 설치해봅니다.

root@2bc26d18d74f:/# apt update
...
root@2bc26d18d74f:/# apt install -y git
...
root@2bc26d18d74f:/# git --version
git version 2.17.1

다시 셸을 그대로 두고 다른 셀에서 diff를 실행해봅니다.

$ docker diff 2bc26d18d74f | head
C /lib
C /lib/aarch64-linux-gnu
A /lib/aarch64-linux-gnu/libbsd.so.0.8.7
A /lib/aarch64-linux-gnu/libexpat.so.1.6.7
A /lib/aarch64-linux-gnu/libexpat.so.1
A /lib/aarch64-linux-gnu/libkeyutils.so.1.5
A /lib/aarch64-linux-gnu/libkeyutils.so.1
A /lib/aarch64-linux-gnu/libbsd.so.0
C /var
C /var/cache

결과가 너무 많기 때문에 head로 앞부분만 출력하도록 했습니다. 여기서 A는 ADD, C는 Change, D는 Delete를 의미합니다. 패키지 하나를 설치해도 많은 파일들이 생성되고 수정되는 것을 확인할 수 있습니다.


컨테이너에서 git을 설치해도 이미지는 바뀌지 않습니다. 이미지는 불변이기 때문입니다. 이미지로 컨테이너를 다시 하나 만들고, git이 설치되어 있는지 확인해보겠습니다.

$ docker run -it --rm ubuntu:bionic bash
root@2b68150aaeb5:/# git --version
bash: git: command not found
root@2b68150aaeb5:/# exit

git 명령어가 없는 것을 확인할 수 있습니다. 왜냐하면 ubuntu:bionic 이미지에 깃이 설치되어 있지 않기 때문입니다. 그러면 ubuntu:bionic 을 base 이미지로 하고, 깃이 설치된 새로운 이미지를 생성해보겠습니다. 도커에서는 이 작업을 commit이라고 합니다.

$ docker commit 2bc26d18d74f ubuntu:git
sha256:ecf2ba41f94d4c9c6c119211d15d53f6dac729b2caf5f54c599c88f1cbe1987a
$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
ubuntu       git       ecf2ba41f94d   19 seconds ago   175MB
ubuntu       bionic    1e7ccc70f4ca   4 days ago       56.6MB

커밋을 하고 뒤에 이름을 붙여주면 새로운 이미지가 생성됩니다! docker images 로 이미지의 정보들을 확인할 수 있습니다. 그러면 해당 이미지로 컨테이너를 만들었을 때, git이 설치되어 있는지 확인해보겠습니다.

$ docker run -i -t ubuntu:git bash
root@9e08e6a78ca9:/# git --version
git version 2.17.1
root@9e08e6a78ca9:/# exit

git이 설치되어 있는 것을 확인할 수 있습니다.


도커 허브에 이미지 올리기

지금까지 도커 공식 이미지를 도커 허브에서 받아서 사용했습니다. 그러면 이번에는 우리가 만든 이미지를 도커 허브 공개 저장소에 업로드해봅시다.

우리가 지금까지 사용했던 ubuntu:bionic 이미지의 풀네임은 docker.io/library/ubuntu:bionic 입니다. 이미지의 풀네임은 크게 4부분으로 구성되어있습니다.

맨 앞의 docker.io는 도커 레지스트리의 서버 주소, library는 네임스페이스입니다. 네임스페이스는 사용자 이름이고, library는 도커 공식 이미지에 붙는 특별한 네임스페이스입니다. 그 다음은 이미지 고유의 이름이고 :뒤에는 추가적으로 이미지를 구분하기 위한 태그입니다.

도커 허브를 사용하려면 먼저 회원 가입을 진행해야합니다.

스크린샷 2022-02-06 오후 2 19 12


계정을 생성한 후, 도커 클라이언트를 사용해 로그인할 수 있습니다.

$ docker login
...
Login Succeeded

ID와 패스워드를 입력하면 로그인이 됩니다. 로그인 명령어에도 서버를 지정할 수 있는데, 지정하지 않으면 기본값으로 도커 허브에 로그인을 합니다. 이제 이미지를 도커 허브에 올려보겠습니다.

저는 아까 만들었던 ubuntu:git 이미지 이름을 upskyy/ubuntu:latest 라고 지었습니다. upskyy는 네임스페이스에 해당하는 부분으로 도커 허브에서는 사용자 이름을 의미합니다.

$ docker tag ubuntu:git upskyy/ubuntu:latest
$ docker images
REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
ubuntu          git       ecf2ba41f94d   25 minutes ago   175MB
upskyy/ubuntu   latest    ecf2ba41f94d   25 minutes ago   175MB
ubuntu          bionic    1e7ccc70f4ca   4 days ago       56.6MB

이름이 변경된 이미지가 생성된 것을 확인할 수 있습니다. 이름이 변경되었으면 바로 이미지를 푸시해봅니다. 푸시한 이미지는 공개 저장소로 등록됩니다.

$ docker push upskyy/ubuntu:latest
The push refers to repository [docker.io/upskyy/ubuntu]
8b298edb8b32: Pushed
07e2595a669e: Mounted from library/ubuntu
latest: digest: sha256:801be96b07f48fce95847b225f9531dccdb72dcacc8825c1826a87f0c90f4da8 size: 741

도커 허브는 <DOCKER_HUB_ID>/ubuntu 이미지 저장소가 없더라도, 푸시 작업 과정에서 이미지 저장소를 생성해줍니다. 도커 허브에서도 푸시한 이미지를 확인할 수 있습니다.

스크린샷 2022-02-06 오후 2 41 34


이제 로컬에서 이 이미지를 삭제하더라도 도커 허브에서 받아서 사용할 수 있습니다. 또한 다른 서버에서 이 이미지를 받아 실행하는 것도 가능합니다.


Reference

도커(Docker) 입문편: 컨테이너 기초부터 서버 배포까지 | 44BITS

Leave a comment