도커.. Docker..

HoDu PyTHON·2023년 4월 24일
post-thumbnail

도커.. 도커.. 도커.. 🐳
나는 연구실 생활을 하면서 개발을 할때 도커를 사용하지 않았었다.
사실 그 필요성을 느끼지 못 했다.
그 이유는 서버를 한번 세팅해두면 크게 무언가를 바꿀 필요가 없었고 쭉 그 환경에서 개발을 했기 때문이다. 문제가 생기거나 환경을 바꿀때는 그냥 밀고 깔면 된다라는 마인드를 가지고 있었기 때문이다.

하지만 도커는 거의 모든 기업들이 개발 아키텍처를 Monolithic에서 microsevice로 바꾸게 되면서 개발자라면 알고 있어야하는 필수적인 개발 도구가 되었다. 마이크로서비스 아키텍처는 애플리케이션이 독립적인 구성 요소로 구축되어 각 애플리케이션 프로세스가 서비스로 실행되는 구조이다. 거대 글로벌 기업들의 하나로 보이는 서비스가 사실은 수천개의 작은 애플리케이션으로 구성되어져 서비스를 제공한다.
이런 아키텍처는 각각의 구성 요소들을 따로 관리할 수 있어서 유연한 확장성을 가지고 있다. 그리고 각 구성요소에 문제가 생겨도 각각 디버깅할 수 있고 다른 요소에 문제를 일으키지 않는다는 안정성을 가지고 있다. 이러한 장점으로 많은 기업들이 Microservices 아키텍처를 선택하게 되었다.

이런저런 이유로 도커를 공부하게 되었고 그 내용을 정리하였다.

🐳 Why Docker?

무튼 그래서 도커가 무엇일까?
도커를 이해하기 위해서는 먼저 VMware와 Container에 대해서 알아야한다.

💻 VMware :

Hypervisor를 통해 가상 하드웨어를 구현하고 위에 OS를 설치하고 App을 구동하는데 기본적으로는 하이퍼바이저가 여러개의 vm을 실행시킨다.

이러한 이유로 vm1과 vm2가 동일한 os를 사용해도 데이터들을 공유하지 않기 때문에 vm 수에 비례해 메모리가 많이 필요하다.

💻 Container :

윈도우에서는 Hypervisor를 사용하기는 하지만 Linux에서는 Hypervisor 없다. Linux의 Cgroup, Namespace 등을 이용해 가상화한다.

Docker Engine을 이용해 가상화한 OS를 공유하는 느낌?이랄까..
많은 자원들을 컨테이너들끼리 공유하고 독립된 실행환경을제공하지는 않는다.

따라서 컨테이너 수가 늘어나도 디스크 공간을 많이 차지하지 않는다.

✔️ 성능 차이는?

VMware와 container를 비교한 논문에 따르면 실험결과 container가 수가 늘어날 경우 시간적인 효율성이 높게 나온다.
또한 cpu 튐도 줄어들고 안정성이 더 높다는 결론을 얻었다.

이제 우리는 도커를 사용해야하는 이유를 조금 알았다. 하지만 도커의 컨테이너가 너무 많아졌을때는 문제가 생긴다. 이런 문제를 다루는 기술들 오케스트레이션이 발전했고 그중에 하나는 쿠버네티스(kubernetes k8s)가 있다. → 나중에 공부하면 좋을 듯하다.

결론적으로 도커는 거의 네이티브라고 불릴정도로 가상환경이지만 일반 애플리케이션에 성능 저하없이 개발에 대한 많은 기능을 제공해 개발 프로세스를 많이 발전시킬 수 있다.

🐳 도커 (Docker)

컨테이너 기술을 지원하는 많은 프로젝트 중에 하나지만 도커로 인해 컨테이너 기술이 알려졌고 도커는 컨테이너 기술의 사실상 표준이 되었다.

많은 운영체제에서 사용 가능하다. 우리가 사용하는 거의 모든 OS (linux, windows, macOS)에서는 당연히 사용가능하다.

네임스페이스와 cgroups 같은 리눅스 커널 기능을 사용해서 가상화를 진행했다.
애플리케이션 뿐만 아니라 의존성, 파일 시스템까지 패키징 → 빌드,배포,실행을 단순화할 수 있다.
회사 차원에서는 devOps에 대한 변화/발전을 위해서 많이 도입되었고 필수가 되었다. 그리고 다양한 클라우드 서비스 모델과 같이 사용 가능하다.

도커를 이해하기 위해서는 이미지와 컨테이너 두가지 개념을 알아야한다.

  • 이미지 : 필요한 프로그램과 라이브러리, 소스를 설치한 뒤 만든 하나의 파일
  • 컨테이너 : 이미지를 격리하여 독립된 공간에서 실행한 가상 환경

동일 시스템에서 실행하는 소포트웨어의 컴포넌트가 충돌하거나 다양한 종속성을 가지는 경우에도 문제없이 사용가능하다.

컨테이너는 가상머신을 사용해 각 마이크로서비스를 격리하는 기술이라고 생각하면 되고 가상머신처럼 하드웨어를 전부 구현하지 않기 때문에 매우 빠른 실행을 가능하게 하였다.

💻 이미지 검색 / 설치

도커 이미지는 이미 많은 회사들과 사람들이 공유하며 이미지를 검색하고 설치할 수 있다.

docker search [이미지이름]

위의 결과는 pytorch 이미지를 검색한 결과이다. 앞에 bitnami/pytorch, armswdev/pytorch와 같은 개인이 올린 이미지들을 발견할 수도 있다. 실제 pytorch는 이미지 이름이 pytorch/pytorch이다.

그러면 이번에는 간단히 tomcat이라는 이미지를 다운 받고 실행해보자. 아래와 같은 명령어를 사용하면 된다.

docker run -d -p 8080:8080 --name tc tomcat

run 명령어는 이미지를 다운받고 컨테이너를 실행해주는 명령어이다. --name tc는 컨테이너의 이름을 tc로 해라~ 하는 옵션이다. -d, -p는 백그라운드에서 실행한다, 포트번호를 설정하는 옵션이다.

이렇게 도커 이미지를 검색하고 간편하게 설치 가능할 수 있는게 도커의 큰 장점이다.

💻 도커 registry

도커 레지스트리에는 사용자가 사용할 수 있도록 데이터베이스를 통해 image를 제공한다. 누구나 이미지를 만들어 푸쉬할 수 있고 다른 사람에게 공유도 가능하다. 마치 깃 명령어와 비슷하다!

하지만 대부분의 이미지들은 도커 허브에 많이 있다. 그러니 도커 허브에서 찾아서 편하게 사용하자.

앞서 설명했듯 명령어로는 docker search [이미지이름] 으로 검색 가능하다.

다운로드만하는 경우는 docker pull [이미지이름]로 이미지를 다운로드할 수 있다.

그리고 다운 받은 많은 이미지들은 docker images 명령어를 통해 이미지 리스트를 확인할 수 있다.

위는 docker images 명령어를 통해 살펴본 설치된 이미지들이다.

💻 도커 라이프 사이클

이번에는 도커의 라이프 사이클에 대해서 알아보자. 아래 그림을 잘 이해해야 도커를 이해했다고 볼 수 있다. 각 화살표에 표기된 단어들은 명령어이다.

registry에서 image들을 pull(다운로드) / push(업로드) 가능하다.

push할 때는 권한이 필요하고 이미지만 다운로드해서는 실행을 할 수가 없다. 따라서 컨테이너가 필요하다.
이미지를 다운 받았으면 컨테이너를 만들어줘야하는데 명령어는 create이다.
그리고 컨테이너를 실행하려면 start를 이용하면 된다.
이 둘은 run을 이용하면 한번에 실행할 수 있다.

만약 이미지 pull이 안되어있다면, run으로 pull-create-start까지 한번에 실행 할 수 있다.
하지만 만약 컨테이너가 이미 create된 상태라면 run을 했을때 create가 한번더 실행되므로 start를 이용하는게 좋다.
만약 start된 컨테이너의 프로세스를 종료하고 싶다면 stop을 하면된다.

컨테이너 삭제는 rm 명령어를 이용하고, commit은 깃에서 사용했던 것과 같이 기존 이미지를 현재 사용하던 컨테이너의 상태로 만들어줄 수 있는 명령어이다. 이미지 삭제는 rmi를 이용하면 된다.

이렇게 이미지 설치, 컨테이서 생성 및 삭제에 대한 명령어를 확인해보았다.

💻 도커 명령어

아래에는 앞서 언급한 몇개의 명령어들과 추가적인 명령어를 적어놨다. 직접 입력해보면서 확인하면 이해가 빨리되니 한번씩 사용해보는것을 추천한다.

도커 이미지 다운로드, 삭제

sudo docker pull [image name]

sudo docker rmi [image name]

도커 컨테이너 생성
sudo docker run -d —name [container name] [image name]

  • d 백그라운드에서 돌림

  • p port 설정

컨테이너 실행
sudo docker start [container name]

실행중인 컨테이너 확인
sudo docker ps

모든 컨테이너 확인
sudo docker ps -a

컨테이너 중지
sudo docker stop [container id]

컨테이너 삭제
sudo docker rm [cont**ai**ner id]

이미지 확인
sudo docker images

이미지 삭제
sudo docker rmi [image name]

도커 이미지나 컨테이너 삭제할 때는 컨테이너가 실행 중일 때는 삭제가 안된다. 따라서 컨테이너는 stop하고 삭제를 해야한다.
세부 옵션에 따라서 다르니 -h를 참고하자. 이미지 삭제 rmi에서 -f의 옵션을 통해 강제로 삭제는 가능하다.

오늘은 일단 여기까지 알아보도록 하자. 사실 도커는 익숙해지면 크게 어렵지 않고 굉장히 편리하다. 하지만 처음에 이해를 위해 시간이 조금 소요되는 것 같다. 그래도 개발자라면 필수적으로 알아야하는 개념이므로 익숙해지자!


본 포스트는 재즐보프님의 왕초보도 따라하는 도커 기초강의를 기반으로 작성되었습니다.

profile
나는야 척척'박사' & ML/DL & Coffee

0개의 댓글