Docker 활용하기
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
는 도커 공식 이미지에 붙는 특별한 네임스페이스입니다. 그 다음은 이미지 고유의 이름이고 :
뒤에는 추가적으로 이미지를 구분하기 위한 태그입니다.
도커 허브를 사용하려면 먼저 회원 가입을 진행해야합니다.
계정을 생성한 후, 도커 클라이언트를 사용해 로그인할 수 있습니다.
$ 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
이미지 저장소가 없더라도, 푸시 작업 과정에서 이미지 저장소를 생성해줍니다. 도커 허브에서도 푸시한 이미지를 확인할 수 있습니다.
이제 로컬에서 이 이미지를 삭제하더라도 도커 허브에서 받아서 사용할 수 있습니다. 또한 다른 서버에서 이 이미지를 받아 실행하는 것도 가능합니다.
Leave a comment