본문 바로가기
2. 우당탕탕 개발자/2-2. 상세 노트

Docker란 무엇인가?

by Little Monkey 2021. 7. 1.
반응형

Docker

docker는 다른 작업 환경에서도 신속하고 안정성 있게 소프트웨어를 설치 및 실행할 수 있도록 도와주는 오픈 플랫폼입니다. 여러 사람들과 협업하는 환경에서 docker를 빼놓고 작업하기는 어려워보입니다. 그래서 저도 docker에 대해서 배우기 위해 인프런에서 '따라하며 배우는 도커와 CI환경' 강의를 듣고 있습니다(강력 추천!). 배운 내용 중에서 기억해야될 내용을 위주로 간단하게 정리할 계획입니다.


Container & Image

도커에서 핵심이라고 할 수 있는 container는 물류의 컨테이너처럼 application을 실행할 때 필요한 모든 것을 쉽게 전달할 수 있도록 패키징으로 묶은 것을 의미하는 것 같습니다.

Image 는 프로그램을 실행하는데 필요한 설정과 종속성 정보를 담고 있습니다. container는 이미지의 인스턴스로 프로그램을 실행합니다.


Docker 사용흐름

어느 프로그램과 마찬가지로, docker도 클라이언트에서 각종 명령어로 도커 서버에 접근하여 컨테이너들을 명령어에 맞게 실행하는 구조로 되어 있습니다. 도커는 Linux VM을 기반으로 여러 컨테이너들을 명령어에 맞게 실행시킵니다.

 

VM vs. Docker

기존의 가상화 기술(VM)은 하드웨어 < host OS < Hypervisor < 각각의 VM을 위치시켜놓고, 그 VM에서 또 사용자가 원하는 OS를 설치하여 그 설치된 OS기반에서 각각의 응용프로그램을 실행시킵니다. AWS나 Google computer VM 생각하면 이해가 쉬운 것 같아요. AWS EC2 초기 세팅할 때, 어떤 운영수단을 선택할 지 우리가 선택할 수 있잖아요. 그러면 우리가 설정한 OS에 맞게 가상화 머신에 필요한 프로그램을 다운 받고 실행 시킨 과정을 떠올리면 이해가 더 잘 될 거에요.

 

반면에, Docker는 하드웨어 < host OS < Docker Engine < 각각의 분리된 컨테이너가 위치해서 바로 그 안에서 실행하고자하는 응용프로그램을 실행할 수 있습니다. VM보다 훨씬 가벼울 것 같은 느낌적인 느낌 안드시나요? (강사님이 그렇다고 해서 그런거 같다고 생각)

 

각각의 컨테이너들은 분리되어 있지만, 컨테이너 사이를 모두 관통하는 하나의 '커널'이 존재합니다. 그 커널을 통해서 각 컨테이너를 한 번에 볼 수 있기도 하고, 하드 디스크/네트워크/RAM/CPU등을 얼마나 쓰고 있는지도 관리 할 수 있습니다. (강의 너무 좋아요... 설명을 잘 못했지만... 강사님 설명 들으면 바로 이해되니.. 들으세요...^^;; 내돈내산이지만 강력 추천..!)

 

docker run image_name ls

'도커 클라이언트야 / 생성하고 실행해라 / 그 이미지를 / 시작 파일 무시하고 폴더 구성물이 뭔지 말해봐' 란 뜻입니다. 이때 명령어 'run'새로운 컨테이너를 생성하고 실행하는 것으로 'exec'의 이미 기존에 존재하는 컨테이너를 실행하는 명령어와는 다릅니다.

 

docker ps

'도커클라이언트야 / process의 status는 어때?' 란 의미이며, docker ps -a 라고 하면 현재 돌아가지 않는 중단된 컨테이너 상황 모두 확인 할 수 있습니다.

 

docker container lifecycle

run (= create + run) -> stop -> delete

도커 컨테이너를 멈추는 명령어는 'stop'과 'kill'이 있습니다. stop은 명령어 전까지 실행되고 있는 프로세스를 마무리 짓고 점진적으로 끝내는 반면 kill은 그냥 바로 컨테이너를 즉시 중단합니다.

도커 컨테이너 삭제하기 (삭제하기 전, 컨테이너 실행이 멈춰야 합니다)

 

docker rm container_id/name  //특정 컨테이너 지우기
docker rm 'docker ps -a -q' //싹다 지우기

 

docker exec -it container_id command

'docker클라이언트야 / 실행해라 / 실행하자마자 나오지말고 / 그 컨테이너를 / 명령어'

-it는 도커 클라이언트가 컨테이너를 실행시키고 바로 나와버리는 것을 막아줍니다. reddis같은 경우는 클라이언트에 접속해서 계속 작업을 해줘야 할 때도 있잖아요. 그런데 -it를 안 써주면, 클라이언트 실행만 시키고 그 안에 접속해서 작업을 못합니다. 도커한테 실행하자마자 바로 나오지 말라고 안내해주는 거에요.

 

어떤 클라이언트에 접속해서 계속 작업해줘야 하는 shell환경에 머물러야 할때는 다음과 같은 명령어를 전달할 수 있습니다.

 

docker exec -it container_id sh

 

 

exec 대신에 run 을 하는 것도 가능합니다.

 

docker run -it image_name sh

 


docker image 생성

dockerfile -> docker client -> docker server -> created image

이 순서로 도커 이미지를 생성할 수 있습니다. 이 때 'dockerfile'은 컨테이너가 어떻게 행동해야 하는지 설정 정보를 정의하는 공간입니다.

 

FROM baseImage
RUN command 
CMD ["executable"]

 

FROM는 기존에 존재하는 이미지를 기반으로도 만들 수 있습니다. RUN은 추가적으로 어떤 파일을 다운 받는게 필요한지 명시해주는 곳이며, CMD는 시작할 때 실행할 명령어 목록을 적어줍니다. 베이스 이미지 기반으로 임시컨테이너가 생성이 되고, CMD에 적힌 명령어와 파일 시스템 스냅샷이 임시컨테이너의 하드디스크에 추가되면, 새로운 아이디를 가진 새로운 이미지가 완성이 됩니다.

 

새로 생성된 이미지에게 기억하기 쉬운 이름을 줄 때,

 

docker build -t docker_id/project_name:version ./

 

 

 

반응형

댓글