도커로 외부 이미지 다운받아 실행해보기

5044 단어 도커도커

이전 포스트까지 컨테이너에 대해 학습하였고 이제는 이미지를 알아볼 차례입니다.




이미지 vs 컨테이너

이미지로 여러 컨테이너를 만들 수 있습니다. 도장이란 비슷하죠. 도장을 한번 만들면 얼마든지 같은 것을 찍어낼 수 있는 것처럼 이미지도 한번 정의해두면 다른 시스템과 다른 서버에서 여러 번 실행할 수 있습니다. 이미지는 모든 설정 명령과 모든 코드가 포함된 공유 가능한 패키지입니다. 그리고 컨테이너는 그러한 이미지의 구체적인 실행 인스턴스입니다. 우리는 이미지를 기반으로 컨테이너를 실행하는 것입니다. 이것이 도커 핵심 개념이고 도커의 모든 것입니다.


외부 이미지 실행해보기

이미지를 생성하고 가져오는 방법은 두 가지가 있습니다. 첫번째 방법은 이미 존재하는 이미지를 사용하는 것입니다. 예를 들면 동료가 이미 구축했다거나, 매우 일반적이어서 미리 구축된 공식 이미지나 커뮤니티에서 공유한 이미지를 사용할 수 있습니다. 그 커뮤니티가 바로 Docker Hub 라는 곳입니다.

Docker Hub에서 node 를 검색해봅시다. 우리는 노드 애플리케이션 컨테이너를 구축하는데 사용할 수 있는 공식 노드 도커 이미지를 찾을 수 있습니다. 이 이미지는 누구나 사용할 수 있고 공식 노드 팀에서 배포, 생성, 유지, 관리합니다.

$ docker run node

이 명령은 도커 허브에서 찾은 노드 이미지를 기반으로 컨테이너를 만듭니다.

Unable to find image 'node:latest' locally
latest: Pulling from library/node
5492f66d2700: Pull complete 
540ff8c0841d: Pull complete 
a0bf850a0df0: Pull complete 
d751dc38ae51: Pull complete 
9720a112e886: Pull complete 
c0fdd5e0e250: Pull complete 
7f8aea8452c5: Pull complete 
ff64236f11e4: Pull complete 
d1c060206d96: Pull complete 
Digest: sha256:<image-id>
Status: Downloaded newer image for node:latest

위와 같이 node:latest 이미지를 로컬에서 찾을 수 없다고 뜨면서 바로 hub에 있는 이미지를 가져와 다운로드 합니다. hub에 있는 Node 이미지를 기반으로 컨테이너를 생성했습니다. 물론 노드는 단지 소프트웨어일 뿐입니다. 인터렉티브 쉘을 얻기 위해서 노드를 실행할 수는 있을 것입니다. 하지만 기본적으로 컨테이너는 주변 환경과 격리되어 있습니다. 그러니까 컨테이너 내부에서 실행 중인 인터렉티브 쉘이 있다고 해서 이 쉘이 우리에게 노출된다는 의미는 아닙니다.

아무튼 우리의 첫번째 컨테이너는 생성되었습니다. 터미널에 다음 명령어를 입력해봅시다.

$ docker ps -a

여기서 ps 는 프로세스의 약자입니다. -a 플래그를 이용하면 도커가 생성한 모든 컨테이너, 모든 프로세스가 표시됩니다.

CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                       PORTS     NAMES
945a5710bb09   node           "docker-entrypoint.s…"   7 minutes ago    Exited (0) 7 minutes ago               hopeful_diffie
9621be7a75a0   8a7a53128083   "docker-entrypoint.s…"   54 minutes ago   Exited (137) 9 minutes ago             nervous_cerf
bbad01a8ebcf   8a7a53128083   "docker-entrypoint.s…"   11 hours ago     Exited (137) 11 hours ago              condescending_margulis

가장 마지막으로 생성한 node 이미지가 만들어져있군요. 이름을 자동으로 받았고 Exited 로 중지되어 있는 상태입니다. 나중에 이름을 설정하는 방법과 일반적인 컨테이너를 구성하는 방법에 대해 자세히 알아볼 것입니다.

아무튼 무언가 발생은 했지만 더 이상 실행 중이지 않습니다. 왜냐하면 앞서 말했듯이 컨테이너가 격리되어 실행되기 때문입니다. 노드 이미지를 기반으로 컨테이너를 생성하여 실행했지만 이것만으로는 별 의미가 없습니다. 그럼 다음과 같은 명령어를 입력해봅시다.

$ docker run -it node

도커에게 컨테이너 내부에서 호스팅 머신으로 대화형 세션을 노출하고 싶다고 알리는 것입니다. 이제 실제로 노드 명령을 실행할 수 있는 인터렉티브 노드 터미널에 들어갑니다. 예를 들어 쉘에서 1+1 을 입력하면 다음과 같이 작동합니다.

Welcome to Node.js v17.7.2.
Type ".help" for more information.
> 1+1
2
> 

여기에서 노드 API를 사용한 결과를 얻을 수 있습니다. 여기서 중요한 것은 노드가 생성된 컨테이너 내부에서 실행 중이며 -it 를 추가함으로써 터미널로 들어가 그 컨테이너 및 컨테이너에서 실행 중인 노드와 상호작용할 수 있다는 것입니다. 하지만 노드는 우리 컴퓨터에서 실행되고 있지 않습니다. 위 쉘을 보면 노드는 17.7.2 버전으로 상호작용하고 있다는 사실을 알 수 있습니다. Ctrl + C 를 두번 눌러 프로세스를 종료하고 node -v 를 통해 제 컴퓨터 노드 버전을 확인해보겠습니다.

$ node -v
v16.14.0

제 컴퓨터 노드의 버전은 16.14 버전입니다. 즉 방금 전 노드는 제 컴퓨터의 노드를 사용한 것이 절대로 아니고 제 컴퓨터에 노드가 설치되어 있지 않다고 하더라도 똑같은 결과가 나왔을 것입니다. 이것이 바로 컨테이너로 작업하는 방식입니다. 컨테이너 작업의 첫 번째 단계이고 이미지와 컨테이너가 무엇인지 보여주는 시작일 뿐입니다.

다시 말하지만 이미지는 컨테이너에 필요한 모든 것을 보관하는데 사용되고 run 명령어를 사용하여 이미지의 인스턴스를 만듭니다. 이것이 이미지를 기반으로 하는 구체적인 컨테이너를 생성합니다. 다시 docker ps -a 명령어를 입력해보겠습니다.

CONTAINER ID   IMAGE          COMMAND                  CREATED             STATUS                        PORTS     NAMES
72fc81d7af38   node           "docker-entrypoint.s…"   10 minutes ago      Exited (0) 5 minutes ago                hardcore_swanson
945a5710bb09   node           "docker-entrypoint.s…"   26 minutes ago      Exited (0) 26 minutes ago               hopeful_diffie
9621be7a75a0   8a7a53128083   "docker-entrypoint.s…"   About an hour ago   Exited (137) 27 minutes ago             nervous_cerf
bbad01a8ebcf   8a7a53128083   "docker-entrypoint.s…"   12 hours ago        Exited (137) 11 hours ago               condescending_margulis

음, 동일한 node 이미지로 만든 컨테이너가 하나 더 생겼고 종료된 상태군요. 이것을 보면 알 수 있듯이 우리는 run 명령어로 동일한 이미지를 기반으로 하는 서로 다른 컨테이너를 생성하고 실행할 수 있습니다.

좋은 웹페이지 즐겨찾기