이 글은 Docker를 쓰는 이유, VM과 Docker의 차이점, Docker의 기본 개념과 특성, Docker 실습을 담고있다.
도커의 최고 장점은 간편한 환경 설정이다.
도커를 사용하면 15년 전에 작성된 Java코드와 1년전에 작성된 Go코드를 하나의 컴퓨터에서 돌릴 수 있다. 코드의 배경이 되는 Library Dependency를 컨테이너별로 설정할 수 있기 때문이다. 라이브러리의 버전 충돌때문에 낭비되는 시간을 줄일 수 있다.
규모가 있는 프로젝트를 인수인계할 때 특히 빛을 발한다. 인수인계를 하면 대여섯 가지나 되는 도구를 특정한 버전으로 설치해야 하고 운영 팀도 또 다른 도구 대여섯 가지를 설치해야 하는 경우가 다반사다. 도커를 도입하면서 모든 툴체인이 중앙집중화돼 어떤 역할의 조직에서도 이런 환경설정 작업이 간단해졌다.
VM도 도커와 마찬가지로 서로 다른 환경에서 동작하는 코드들을 하나의 컴퓨터에서 실행시키기 위한 툴이다. 도커와 VM의 차이를 살펴보자.
VM은 컴퓨터 자원을 Guest OS로 분할하여 컴퓨터 자원을 사용한다. Guest OS간에는 어떠한 간섭도 없이 별개의 컴퓨터처럼 사용된다. OS위에 OS가 올라가기 때문에 비교적 무겁다. Docker는 Guest OS를 만들지 않는다. 그래서 같은 컴퓨터 자원으로 5배 정도 많은 어플리케이션을 실행할 수 있다.
도커의 구조는 Linux 커널로 도커 Container들을 관리하는 방식이다. 리눅스 커널 기능으로 각 컨테이너들은 격리된다.
하나의 컨테이너는 OS처럼 고유의 환경변수, IP주소를 갖는다. 컨테이너 내부에서 사용되는 환경변수, IP주소는 도커가 임의로 부여한 가상의 값들이다. 그래서 Host(컴퓨터)의 환경변수, IP주소와 호환되지 않는다.
서버 프로그램, 소스코드 및 라이브러리, 컴파일된 모든 실행 파일을 묶어둔 Read-Only 파일이다. 보통 용량은 수백MB ~ 수GB으로 VM의 이미지보다는 작다. 파일들의 상태를 저장해둔 패키지라 이해하면 된다. Ubuntu이미지는 Ubuntu를 실행하기 위한 모든 파일을 가지고 있으며, Oracle이미지는 Oracle을 실행하는데 필요한 파일과 실행명령어, port정보를 가지고 있다. Ubuntu, Oracle 같은 유명한 이미지는 도커 허브 등의 공식 레지스트리에서 쉽게 다운받아 사용할 수 있다.
이미지는 팬케이크처럼 여러겹의 레이어로 이루어진다. 기존 이미지(레이어들)에 파일 하나를 추가하기 위해서 전체 이미지를 다시 빌드하지 않고, 추가 파일 레이어 하나만 쌓아서 이미지를 만든다. 레이어는 읽기 전용(read only)이므로 각각의 레이어를 수정할 수 없다. 새로운 레이어를 쌓기만 할 수 있다. 도커 파일(Docker File)은 레이어를 어떤 순서로 쌓아서 이미지를 만들지 적는 파일이다. DockerHub 및 개인 레지스트리에서 이미지를 공유할 때 바뀐 부분만 주고받을 수 있다.
이미지(Image)의 구조를 가져와 실행한 상태이다. 이미지는 Read-Only 파일로 직접 코드를 작성할 수 없다. 이미지의 레시피를 그대로 요리해 실제 음식으로 만든게 컨테이너다. “Docker conatiner run [이미지 이름]”을 통해 실행한다.
도커 이미지를 자동으로 빌드하기 위한 파일이다. 이 파일에서 라이브러리의 버전 충돌을 제어하여 쉽게 이미지를 빌드할 수 있다.
이미지에서 컨테이너를 구성할 때 이미지의 레시피를 가져와 컨테이너를 만든다고 했다. 이때 이미지의 내용을 복사하는 것이 아니라 Read-Only 형태로 참조하는 방식을 사용한다. 그래서 똑같은 내용으로 용량을 두번 차지하는 비효율을 없엤다.
컨테이너에서 수정되는 파일은 Container layer에서 이루어지고, 원래 이미지에서 수정할 내용이 있다면 Container layer로 가져와 수정한다. 이미지 레이어 자체는 건드리지 않는다.
컨테이너의 생명주기가 다해서 Exit되면 Container layer도 사라진다. 만약 DB와 같은 중요 정보를 컨테이너에서 수정하다가, DB의 이미지가 업데이트되어 새로운 컨테이너로 옮길 때 기존의 수정된 정보가 손실된다면 대참사가 일어날 것이다. 이를 방지하기 위해 도커 볼륨(Docker Volume)이 필요하다.
도커 볼륨은 이미지, 컨테이너와 다른 주기를 갖는 디렉토리이다. 도커 버전의 USB라고 생각하면 된다. 이 글에서는 내용이 너무 길어지므로 개념만 설명하고 넘어가겠다.
도커 기본 명령어 형식
> docker [container/image/volume...] [명령어]
> docker run [OPTIONS] [IMAGE:TAG]
run 명령어는 image를 컨테이너로 실행시킨다. 이미지가 로컬 registry에 없을 경우, 자동으로 docker hub를 통해 image를 pull 받아온 뒤 실행시킨다.
> docker run ubuntu:18.04
> docker ps -a
ps는 실행중인 컨테이너를 확인하는 명령어이다. -a는 모든 상태의 컨테이너를 확인한다.
docker run 옵션 | 옵션 설명 (docker run [option]) |
---|---|
-d / --detach | detached mode로 백그라운드 모드를 의미합니다. 호스팅 서버 등에 사용됩니다. |
-p / --publish | Host(로컬 컴퓨터)와 컨테이너의 포트를 연결해주는 옵션입니다. |
-v | Host와 컨테이너의 디렉토리를 연결해 볼륨을 만드는 옵션입니다. |
-e | 컨테이너 내 환경변수를 설정할 때 사용합니다. |
--name | 컨테이너의 이름을 설정합니다. |
-rm | 프로세스가 종료되면 자동으로 컨테이너를 제거하는 옵션입니다. |
-it / --tty | -i 옵션과 -t 옵션을 함께 사용한 것입니다. 직접 컨테이너에 접속해 터미널 입력을 위한 옵션입니다. |
-link | 컨테이너를 연결해주는 옵션입니다. |
> docker stop [CONTAINER ID]
docker ps의 CONTAINER ID를 확인하여 ID의 앞 4자리정도만 입력하면 알아서 식별하여 컨테이너를 stop한다.
> docker rm [CONTAINER ID]
stop과 동일하다.
> docker kill [CONTAINER ID]
ㅇㅇ
도커를 쓰면 우분투나 파이썬 하나만 있는 이미지를 쓰지 않는다. 도커파일로 모든 레이어를 기술하여 한번에 빌드할 수 있다. (도커파일 사용법 알아보기)
> docker build –t [Docker File]
docker file을 빌드할 수 있다.
빌드를 완료하면 위처럼 image가 생성된다.
이미지로 만들기 전에 컨테이너를 Pause(멈춤) 상태로 만든다.
> docker stop [컨테이너 이름 또는 아이디]
컨테이너의 이름 또는 아이디를 알아낸다.
> docker ps –a
또는
> docker container ls -all
컨테이너의 아이디를 넣어서 이미지로 만든다.
> docker commit container_id image_name:tag
끝!
(참고자료)
도커 교과서, 엘튼 스톤맨, 링크
아주 중요한 정보를 얻었습니다, 감사합니다.