* 개요
이번 글의 내용 및 사진은 따라하며 배우는 도커와 CI환경 , 생활코딩 Docker 입구 수업 기반으로 작성하였습니다.
도커를 쓰는 이유
- 가상화 기술 등장 이전
가상화 기술 등장 이전에 하나 서버에 하나의 응용 프로그램만을 설치해야만 했습니다. 웹서버, Database를 구성하기 위해 '모든 서버마다 OS를 설치'하는 것은 메모리가 매우 비효율적인 일이었습니다.
- 하이퍼 바이저 기반 VM 등장
하이퍼 바이저의 등장으로 '논리적으로 공간을 분할'하여 VM(Virtual Machine)이라는 '독립적 가상 환경의 서버'를 사용할 수 있게 되었습니다. 하이퍼 바이저는 다수의 게스트 OS를 구동할 수 있도록 소프트웨어, 하드웨어 자원을 가상화하면서 하드웨어와 VM을 모니터링하는 중간 관리자역할입니다.(호스트형 하이퍼 바이저) VM마다 독립된 하드웨어 자원을 할당받으므로 장애가 나도 다른 VM에 전파되지 않습니다.
- 도커 컨테이너 등장
'1개의 OS'에 각 응용 프로그램의 실행에 필요한 라이브러리와 필수 파일들만으로 구성 및 격리된 도커 컨테이너 기술이 등장했습니다. 컨테이너 방식은 호스트 OS에 어플리케이션 실행 패키지만 배포하면 끝나지만, VM은 VM을 생성하고 게스트 OS를 부팅하고 어플리케이션을 실행해야 합니다. 따라서 도커 컨테이너는 하이퍼 바이저 기반 VM보다 훨씬 경량화된 구성으로 편리하게 응용 프로그램을 관리할 수 있도록 개선되었습니다.
도커를 사용하는 이유는 프로그램 다운 및 배포, 실행 과정을 간단하게 만들기 위함입니다.
도커는 리눅스 환경에서 컨테이너 생성 및 실행을 위한 컨테이너 기술입니다. 따라서, Linux 운영체제에서 사용하는 것이 가장 성능이 좋으며, 일반적으로 많이 사용하는 Windows, Mac 운영체제에서는 별도의 Linux 운영체제를 사용해야 합니다. 당연히 Windows, Mac 운영체제에서는 별도의 Linux 운영체제가 필요하므로 성능 저하가 발생합니다.
도커 컨테이너 생명주기
도커 컨테이너는 순서대로 생성, 시작, 실행, 중지, 삭제생명주기를 따르며 특히 자주 사용하는 docker run은 docker create와 docker start를 합친 명령어로 도커 컨테이너를 실행합니다.
도커 이미지 내부 파일 구조
도커 이미지는 응용 프로그램을 실행하기 위해 필요한 모든 것을 가지고 있습니다. 대표적으로 시작 명령어, 스냅샷 파일을 가지고 있습니다. 스냅샷 파일는 각종 bin, lib, env 등이 있습니다. 이미지는 컨테이너를 생성, 실행하기 위한 필수 재료이며 1개의 도커 이미지로 여러 개의 컨테이너를 만들 수 있습니다.
스냅샷 파일 구성에 따라 컨테이너가 실행 가능한 명령어가 제각가 다릅니다. 만약 hello-world가 echo로 'hello world'를 출력하는 간단한 이미지라고 했을 때, 어떤 경우는 ls 명령어를 사용할 수 있는데 왜 어떠한 경우는 안될까요?
- $ docker run alpine ls (사용 가능)
- $ docker run hello-world ls (사용 불가능)
정답은 alpine의 스냅샷 파일에는 ls 명령어가 있어 컨테이너에서 인식하지만, hello-world의 스냅샷에는 ls 명령어가 없어 컨테이너에 존재하지 않기 때문입니다. 따라서 컨테이너는 어떤 이미지를 활용해 생성하느냐에 따라서 사용할 수 있는 명령어가 달라질 수 있습니다.
도커 이미지 생성 과정(docker build)
도커 이미지 생성 과정에서 중요한 점은 base 이미지를 기반으로 임시 컨테이너를 생성하고 최종적으로 새로운 이미지를 만드는 것입니다. 이 과정에서 id는 계속 변경됩니다. 임시 컨테이너에서 먼저 하드디스크에 스냅샷 파일을 추가하고 이후 시작시 실행 할 명령어가 추가됩니다.
도커 컨테이너 실행 과정(docker run)
docker create: 도커 컨테이너를 생성합니다. 커널, 하드웨어 및 필수 자원들을 포함하여 스냅샷 파일(카카오톡 파일)을 하드 디스크에 저장합니다.
docker start: 시작 명령어 npm run kakaotalk을 입력하면 커널은 하드웨어 자원을 확인해 프로세스를 실행합니다. 커널은 프로세스와 하드웨어를 중간에서 관리합니다.
위 과정을 한번에 실행시키는 명령어는 docker run입니다.
container, image, Dockerfile 관계
일반적으로 Dockerfile을 작성하고 build를 통해 image 생성, run을 통해 container를 실행합니다. 반대로 container에서 commit을 하면 image를 생성할 수 있습니다.
각종 명령어
docker start -a <이미지> vs docker start <이미지>
-a: 도커 컨테이너 시작 시 나오는 output을 출력한다.
docker stop vs docker kill
stop: gracefully하게 명령어 실행이 끝나면 종료한다.
kill: 입력어 실행 시 컨테이너를 바로 종료한다.
docker rm vs docker rmi
rm: 도커 컨테이너를 삭제합니다.
rmi: 도커 이미지를 삭제합니다.
docker run vs docker exec
run: 새로운 도커 컨테이너를 생성합니다.
exec: 실행중인 도커 컨테이너에 명령어를 전달합니다.
docker exec -it <컨테이너> redis-cli vs docker run redis
-it: 실행중인 도커 컨테이너 내부에 접근 할 수 있습니다.
docker exec -it <컨테이너> sh
sh: 컨테이너의 쉘로 접근이 가능합니다. 내부에 접속할 수 있습니다.
docker system prune
사용하지 않는 도커 오브젝트를 정리하여 메모리를 확보할 수 있습니다.
docker rm `docker ps -a -q`
모든 컨테이너를 삭제합니다.
docker build -t smile/hello:latest ./
-t <도커 아이디/프로젝트 이름>:<버전>: 도커파일을 빌드할 때 원하는 이름과 버전을 정할 수 있습니다.
docker run -p 8080:80 httpd
-p 8080:80: 8080은 접속하는 Host의 포트이며, 80은 Container의 포트이고 이 방법은 port forwarding입니다.
docker build -f Dockerfile.dev
-f <도커파일 이름>: 기본은 Dockerfile이며 그 이외 다른 도커파일을 빌드할 때 사용합니다.
docker-compose up -d vs docker-compose up
-d: 도커 컴포즈를 백그라운드로 실행합니다.
docker-compose up --build
--build: 도커 컴포즈를 실행할 때 이미지가 존재해도 무조건 build를 합니다.
'학습 > Docker' 카테고리의 다른 글
Windows 도커 설치하기 (0) | 2024.09.10 |
---|