본문 바로가기

IT Tools/k8s & Docker

[Docker] Docker란? Docker 기초 : Hello-world 컨테이너 실행

docker logo

IT의 I자도 모르던 새싹 윈도우 사용자 시절에, 저는 패기롭게 AI 공부를 해보겠다고 무작정 책을 들고 TensorFlow를 설치했던 경험이 있습니다. 당시 펜티엄 CPU(굉장히 오래된 CPU를)가 장착된 윈도우 노트북을 가지고 익숙하지 않은 커맨트 창에서 이리저리 명령어를 치며 장장 5시간을 설치에만 매달렸죠.. 알 수 없는 이유로 TensorFlow는 계속 설치되지 않고, 실행되지 않았습니다. 지금의 저라면 그 때의 오류를 조금이나마 알아볼 수 있었겠으나 그때의 저는 왜 책 그대로 했는데 안되지..? 였습니다. 답답한 마음에 컴퓨터공학과 다니는 지인에게 물어봤지만 차라리 linux나 mac과 같은 환경이었다면 설치가 쉬웠을테지만 윈도우라서 권한,파이썬 버전 등등의 문제로 되지 않는 거 같다는 답변만 들을 수 있었습니다. 물론 그런 문제가 아니었을수도 있겠지만 어쨌든 그때의 윈도우 환경은 지금의 리눅스 환경보다 자유롭지 않았고, 저 또한 그런 자유를 조절할만큼 컴퓨터를 알지도 못했습니다. docker 소개 자료에서 갑자기 무슨 뜬금없는 소린가 하시겠지만은 ㅋㅋ 지금의 제가 docker의 편리함을 충분히 느끼도록 해준 경험이 바로 저때의 삽질 경험이기 때문에 이야기 하게 되었습니다. 그때의 제가 만약 docker와 container의 개념을 알았다면은, 5시간의 삽질의 경험이 1시간의 삽질로 줄었지 않았을까 싶기 때문입니다. 서로 다른 컴퓨팅환경에서도 프로그램이 잘 작동되고 빠른 배포가 가능한 컨테이너 기반의 d...ocke..r... 과연.. 어떤 것인지 제가 지금 한번 소개해드리도록 하겠습니다.

 


Docker 란?

docker 는 간단히 컨테이너 기반의 가상화 도구 입니다.

가상화 도구 라고 하면 VMware 나 VirtualBox 처럼 윈도우에 Linux OS를 따로 띄우는 가상머신을 생각하시는 분들이 있으실 겁니다. 
그러한 하드웨어(H/W)를 소프트웨어(S/W)로 재구현하는 가상 머신과 달리,

컨테이너는 그 중에서 프로세스의 실행 환경을 따로 재구현하는 기술입니다.

그렇기에 컨테이너는 VM 보다 가볍고 빠르고 하드웨어 손상이 훨씬 덜합니다.

 

docker vs VM

도커는 이런 컨테이너(프로세스)를 실행하기 위한 별도의 환경이 저장된 파일 시스템을 저장하고, 리눅스 네임스페이스와 다양한 커널 기능을 조합해 프로세스를 특별하게 실행합니다. docker 에서는 이렇게 미리 구성된 환경을 저장해놓은 파일들의 집합을 이미지(Image)라고 합니다. 즉, 컨테이너는 이 이미지(파일들의 집합)위에서 실행된 격리된 하나의 프로세스라고 할 수 있습니다.

 

예를 들어서, 제가 파이썬 2.5 버전에서만 잘 작동하는 프로그램을 제 노트북으로 작성했다고 합시다.

분명 여기서는 작동이 잘 되었는데 파이썬 3.6만 설치된 제 친구의 노트북에서 이 프로그램을 실행시키면 여지없이 에러가 나곤 합니다.

이 프로그램을 작동시키기 위해 해당 노트북에 파이썬 3.6을 설치하고 프로그램에 필요한 라이브러리를 다시 설치하는 복잡한 과정을 거쳐야 합니다.

이런 상태에서 원래의 실행환경과 작성된 코드를 저장한 컨테이너를 이용한다면, 제가 작성한 프로그램은 친구의 노트북에서 별도의 환결 설정 없이 잘 작동하게 될 것입니다.

이렇듯, 여러가지 각각의 환경을 통합하기가 어려운 상황에서 모든 개발 환경이 종합 세트로 배달되는 컨테이너 개념은 혁명이 아닐 수 없습니다.

 

도커에서 이미지는 불변이지만, 기존의 이미지를 이용해 새로운 이미지를 만드는 것이 가능합니다. 

도커는 계층화된 파일 시스템을 하기 때문에 특정한 이미지로부터 생성된 컨테이너에 어떤 변경사항을 더하고(파일들을 변경하고), 이 변경된 상태를 새로운 이미지로 만들어낼 수 있습니다.

예로, 위에서 설명된 상황처럼 파이썬 2.5 + 작성된 프로그램이 있던 이미지를 친구 노트북에서 다운 받고,
그 컨테이너 안에서 새로운 기능이 담긴 코드 파일을 추가해서 새로운 이미지를 만들 수 있고, 이 이미지로 컨테이너를 생성할 수 있습니다.

결국 쉽게 생각하면, 한국에서만 열리는 작물들이 담긴 실제 컨테이너를 선박에 싣고 중간에 호주에 들러서 작물 몇 박스를 주고, 다른 캥거루 고기를 싣고, 미국으로 컨테이너를 배달하는 것이라고 생각하면 될 것 같습니다.

이렇게 간단히 Docker의 개념을 알고, 그럼 어떻게 이것이 실행되는 것인지 간단 튜토리얼을 해보겠습니다.


Docker에서 Hello-world 실행해보기

  • docker install
$ apt install curl
$ curl -s https://get.docker.com | sudo sh

 

  • basic of docker
# sudo 를 붙일 필요 없도록 사용자에도 권한 부여
$ sudo usermod -aG docker $USER
$ sudo su - $USER

# 현재 실행중인 컨테이너 목록 출력
$ sudo docker ps

# 죽은(멈춘) 컨테이너의 목록까지 출력
$ docker ps -a

# docker 에 받아진 image 목록 출력
$ docker images

 

  • docker image 받아오기
$ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete 
Digest: sha256:1a523af650137b8accdaed439c17d684df61ee4d74feac151b5b337bd29e7eec
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest

# image 목록에 hello-world가 추가됐음을 확인
$ docker images
REPOSITORY     TAG    IMAGE ID        CREATED       SIZE
hello-world   latest  bf756fb1ae65   11 months ago 13.3kB

 

  • 받은 이미지 실행
$ docker run hello-world:latest
# 아래 문자가 나오면 성공
Hello from Docker!
This message shows that your installation appears to be working correctly.

$ docker status -a
CONTAINER ID    IMAGE              COMMAND    CREATED             STATUS
2e8abe1d54e9   hello-world:latest  "/hello"   About a minute ago  Exited 

 

  • 실행했던 컨테이너 지우기 & 이미지 지우기
# docker container 삭제
$ docker rm (container id | names)
# docker images 삭제
$ docker rmi (image id | names)

이렇게 간단히 docker의 hello-world 이미지를 받아보고, 실행하고 제거하는 과정까지 해보았습니다.

 


이외에도 docker 에는 다양한 옵션과 사용법들이 있으니 아래 링크를 참고해서 배워도 좋을 것 같습니다.
docs.docker.com/get-started/

 

Orientation and setup

 

docs.docker.com

 

반응형