Docker 간단하고 빠르게 정리해 보자.

Docker 간단하고 빠르게 정리해 보자.

Docker 는 Go언어로 작성된 리눅스 컨테이너 기반 오픈소스 가상화 플랫폼이다.

가상화를 사용하는 이유가?

서버의 리소스 (CPU, Memory, Disk)는 모두 비용 이다. 한마디로 돈이다.
설치한 리소스를 놀리면 돈만 내고 사용하지 않는 것. 돈만 써버린 돈 낭비가 되는것이다.
리소스를 최대한 활요하는 방법으로 생각하고 구현한것이 서버 가상화 이다.
서버 가상화의 중요 포인트는 가상 서버의 안전성 이다.

컨테이너는 또 뭔데?

현실 세계에서 컨테이너는 물자를 운송할 때 쓰는 물건이다.
컨테이너에 담아 잘~ 안전하게 전달해 주면 내용물의 소유자는 컨테이너가 배송되는 방법에 신경 쓸 필요가 없다. 또한 배송사는 내용물을 알거나 관리할 필요 없이 컨테이너를 목적지까지 운송한다.

컨테이너는 OS 레벨위의 가상화로 필요한 바이너리, 라이브러리까지 격리시켜 컨테이너라는 가상화 이미지를 만드는 것이다.

VM 가상화 vs 컨테이너 가상화

VM 가상화는 게스트 OS를 포함하고, 컨테이너 가상화는 도커엔진 위에서 어플리케이션 실행에 필요하 파일들만 포함한다.
OS를 포함하지 않기 때문에 당연히 크기도 작고, 어플리케이션에 집중된 이미지 이다.
그러나 컨테이너를 실행하기 위해서는 도커 엔진이 꼭 필요하다. (이것이 단점 같지만 VM역시 하이퍼바이저가 필요하다.) 즉, 도커엔진만 있으면 호스트가 무엇인가에 상관 없이 컨테이너의 동작이 가능 하다.

컨테이너는 OS를 포함하지 않기 때문에 더 가볍고 더 적은 메모리와 리소스로 구동이 가능 하다.
VM의 성능적 단점을 보다 개선한 시스템이다. 컨테이너 기반 가상화는  도커 엔진 위에 OS가 아닌 Application 실행에 필요한 바이너리만을 올린다. 또한 컨테이너 기반 가상화는 Host의 커널을 공유하기 때문에 성능의 효율을 더 높일 수 있다.

컨테이너를 사용하는 것은 가상 머신을 생성하는 것과는 다른 개념이다. 호스트 OS가 사용하는 자원을 분리하여 여러 운영 환경을 만들 수 있도록 하는 것이다.

도커 (docker)

컨테이너를 사용할 때 도커를 사용하면 간단한 명령으로 컨테이너 이미지를 만들고 저장할 수 있다. 또한 도커를 설치한 호스트에 컨테이너 이미지를 다운로드해서 컨테이너를 실행할 수 있다.

실제 화물 선박의 컨테이너처럼 규격화한 컨테이너를 만든 후, 호스트로 옮겨 그대로 사용할 수 있다.

컨테이너 이미지는 또 뭐야?

Container Image는 컨테이너를 실행할 수 있는 실행 파일설정값 등을 가지고 있는 것이다. 이미지는 상태값을 가지지 않고 변하지 않는다.(immutable) 아래 그림과 같이 Image를 컨테이너에 담고 실행시킨다면, 해당 프로세스들이 동작할 것이다.

에를 들어 ubuntu 이미지는 ubuntu를 실행하기 위한 모든 파일을 가지고 있으며, MySQL 이미지는 MySQL을 실행하는 데 필요한 파일과 실행 명령어, 포트 등을 가지고 있다. 말 그대로 이미지는 컨테이너를 실행하기 위한 모든 것을 가지고 있기 때문에, 더 이상 의존성 파일을 컴파일하고 새로운 환경에서 이것저것 설치할 필요가 없어진다.

이제 새로운 서버가 추가된다면, 미리 만들어놓은 이미지를 다운받고 컨테이너를 생성하기만 하면 된다. 물론 한 서버에 여러 컨테이너를 실행할 수 있다.

기본적이 도커 사용 명령어

도커에서는 도커 이미지를 이용하여 컨테이너를 생성할 수 있다.
도커 이미지를 사용해 이미지에 설정해둔 대로 컨테이너의 구성 환경을 적용할 수 있다.

이미지 목록 보기

$ sudo docker images

이미지 검색

$ sudo docker search [이미지 이름]

이미지 받기

$ sudo docker pull [이미지 이름]:[버전]

이미지 삭제

$ sudo docker rmi [이미지 id]

컨테이너 목록 보기

$ sudo docker ps

컨테이너 실행

$ sudo docker run [options] image[:TAG|@DIGEST] [COMMAND] [ARG...]

컨테이너 시작/재시작

$ sudo docker start [컨테이너 id 또는 name]
$ sudo docker restart [컨테이너 id 또는 name]

컨테이너 접속

$ sudo docker attach [컨테이너 id 또는 name]

컨테이너 정지

$ sudo docker stop [컨테이너 id 또는 name]

컨테이너 삭제

$ sudo docker rm [컨테이너 id 또는 name]

docker를 쓰다보면 sudo를 항상 붙여줘야 하는데 이는 docker 명령을 root 권한으로 실행해야 하기 때문에 일반 계정에서는 sudo가 항상 붙는 것이다. 매번 입력하기 귀찮고 빠뜨릴 때도 많다. sudo를 입력하지 않는 방법은 2가지이다.

  1. 처음부터 root 계정으로 로그인하거나 root 계정으로 전환
    sudo su <– root 계정으로 사용
  2. 사용 계정을 docker 그룹에 포함
    sudo usermode -aG docker ${USER}
    sudo service docker restart

Leave a Reply

Your email address will not be published. Required fields are marked *