티스토리 뷰
목차
글 목록
- [Docker] 도커 설치와 web GUI 툴 Portainer로 Docker 연동하기 (1/3)
- [Docker] 도커에 MongoDB 설치 및 MongoDB GUI 툴 Mongo Compass로 접속하기 (2/3)
- [Docker] Spring Boot 프로젝트에 도커 컨테이너 연동과 Docker-compose 세팅 (3/3)
배경
사이드 프로젝트를 진행하던 중에 서버와 DB 환경을 구축할때 Docker를 활용해서 개발환경을 구축하였다. 도커를 비롯한 쿠버네티스와 같은 컨테이너 오케스트레이션 플랫폼 사용 경험을 쌓아두면 좋을 것 같기도 했고, 사이드 프로젝트를 진행하면서 최대한 실무에서 활용할 경험을 쌓아두기 위해 개발 & 운영 서버를 분리해서 구축하였고 이에 따른 개발환경 세팅에 많은 스트레스를 받지않고 싶었기 때문이다. 또한 AWS EC2 인스턴스로 배포할 계획인데, 도커를 활용하면 다양한 기술환경을 간편하게 배포할 수도 있고 과금도 방지할 수 있을 것 같았다.(Mongo, Redis, Kafka 등 다양한 툴을 사용)
이러한 배경으로 Docker를 설치해서 실행하고, Web 기반의 Docker GUI 툴인 Portainer까지 활용해서 이에 접속해보았다.
도커를 활용하는 표준화된 GUI 툴이 따로 존재하지는 않은 것 같았고, Web기반의 GUI를 제공하는 Portainer 혹은 Shell 명령어를 많이 사용하는 것 같다. 나 같은 경우는 GUI 툴을 사용하면 더 쉽게 Docker라는 기술에 대한 이해를 할 수 있을 것 같아 Portinaer를 활용해보기로 했고, 다양한 툴에 금방 적응하는 능력을 기르고 싶기도 했다. (개발 생산성을 향상하기 위해 다양한 툴에 금방 적응하며 십분 활용하는 능력 또한 실무에서 중요하다고 스스로 여기고 있고, 이러한 능력을 기르기 위해서는 계속해서 부딪혀보는 방법밖에 없다고 생각했다.)
(모든 설치 과정은 Mac os 기반으로 진행했다)
내용
환경 세팅에 들어가기에 앞서, 간단한게 도커와 관련한 기술들을 살펴보았다.
(구체적으로 살펴보면 글이 너무 길어질 것 같아 따로 작성하려고 한다.)
도커(Docker)
컨테이너 기반의 오픈소스 가상화 플랫폼이다. 리눅스의 애플리케이션을 컨테이너(Container)라는 프로세스 격리 기술을 통해서 실행하고 관리하는 프로젝트이다. 위키 백과를 인용하면 그 내용은 다음과 같다.
도커 컨테이너는
일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싼다. 여기에는 코드, 런타임, 시스템 도구, 시스템 라이브러리 등 서버에 설치되는 무엇이든 아우른다. 이는 실행 중인 환경에 관계 없이 언제나 동일하게 실행될 것을 보증한다.
도커를 활용하면 컨테이너라는 기술을 통해 하나의 리눅스 인스턴스 안에서 애플리케이션을 실행할 수 있다. 윈도우, Mac, Linux 등 운영 체제 별로 애플리케이션을 실행하기 위한 요구사항이 달라질 수 있는데, 도커를 통해 개발 환경별로 다르게 요구되는 사항들을 하나로 관리할 수 있다. 또한, 컨테이너 스케일링(더 나아가 쿠버네티스를 활용한 오토 스케일링까지)을 통해 프로그램 운영과 유지보수에 대한 부담을 덜어줄 수 있다.
도커 이미지(Docker Image)
도커 이미지는 컨테이너를 만드는 데 사용되는 읽기 전용(Read-only) 템플릿이고, 이러한 특성으로 인해 스냅샷 이라고도 부른다.
컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있으며, 이미지를 빌드하여 하나의 애플리케이션이 동작하는 컨테이너 환경을 실행한다.
도커 컨테이너(Docker Container)
하나의 리눅스 애플리 케이션이 동작하고 있는 단위이다.
컨테이너 기술의 중요하면서 가장 장점이 되는 기능은 컨테이너 내부에서 실행되는 컴퓨팅 환경의 표준화다. 응용 프로그램이 동일한 환경에서 작동하도록 할 뿐 아니라 다른 사람과의 공유도 단순화한다.
구체적인 컨테이너의 기술의 내용은 다음 글을 참고해서 이해하였다.
컨테이너는
자율적(autonomous)이기 때문에 strong isolation을 제공하며 서로 방해하지 않는다. (서로 격리된 환경을 제공한다)
하드웨어 수준에서 가상화가 이루어지는 VM과 달리 컨테이너는 애플리케이션 계층에서 가상화된다. 하나의 머신을 활용하고 커널을 공유하며 분리된 프로세스를 실행하기 위한 운영 체제를 가상화할 수 있다. 따라서 컨테이너가 매우 가벼워져 리소스를 많이 사용하지 않을 수 있다.
도커 볼륨(Docker Volume)
도커 컨테이너에 사용된 파일들은 컨테이너가 삭제될 때 함께 삭제된다. 도커에서 많은 애플리케이션이 데이터를 영속화하여 저장해서 계속적으로 사용할 수 있도록 해주는 옵션이 바로 볼륨(Volumes)과 바인드 마운트(bind mount)이다.
볼륨과 바인드 마운트에 대한 차이와 구체적인 개념은 다음 글을 참고해서 이해했다.
바인드 마운트(Bind Mounts)
바인드 마운트는 호스트(local PC)의 특정 디렉토리를 컨테이너의 디렉토리에 마운트한다. 이때, 호스트 시스템의 어떤 위치든지 마운트할 수 있으며 컨테이너와 호스트에서 동일한 파일 시스템 경로를 보게 된다.
도커에서 관리하는 디렉토리가 아닌 호스트의 특정 디렉토리에 마운트 하기때문에 도커에서 제공하는 기능들을 제대로 활용할 수 없다.
도커 공식 문서에서는 다음과 같은 이유로 볼륨이 바인트 마운트보다 좋은 장점을 기재했다.
- 백업하거나 이동(migration)시키기 쉽다.
- docker CLI 명령어나 docker API로 볼륨을 관리할 수 있다.
- 볼륨은 리눅스, 윈도우 컨테이너에서 모두 작동한다.
- 컨테이너 간 볼륨을 안전하게 공유할 수 있다.
- 볼륨 드라이버를 사용하면 볼륨의 내용을 암호화하거나 다른 기능을 추가할 수 있다.
- 새로운 볼륨은 컨테이너로 내용을 미리 채울 수 있다.
- Docker Desktop의 볼륨은 Mac, Windows 호스트의 바인드 마운트보다 성능이 훨씬 높다.
볼륨(Volumes)
볼륨은 Docker가 관리하는 디렉토리 내부에 저장된다. (대부분의 경우 /var/lib/docker/volumes/ 안에 위치함)
볼륨은 컨테이너 사이에서 재사용될 수 있으며, 컨테이너가 삭제되더라도 볼륨의 데이터는 유지된다.(데이터 영속성) 또한, Docker CLI나 Docker API를 사용하여 관리 및 백업할 수 있습니다.
요약하자면, "바인드 마운트"는 호스트의 특정 디렉토리를 직접 마운트하는 반면, "볼륨"은 Docker가 관리하는 저장 영역에 데이터를 저장하는 방식이다.
쿠버네티스(K8s, Kubernetes)
도커 컨테이너를 오토 스케일링해주는 오케스트레이션 플랫폼이다. 가령 도커 컨테이너를 활용하여 하나의 api server를 배포했을때 처음에는 사용자가 많지 않아 하나의 컨테이너(쿠버네티스에서는 1개 이상의 도커 컨테이너를 모아서 하나의 pod를 구성한다.)로도 버틸 수 있었지만, 사용자가 늘어나서 api 요청 횟수가 늘어다면 하나의 서버 컨테이너로는 버틸 수 없게 될 것이다.
이때 쿠버네티스를 활용하면 자동으로 api 요청 횟수가 늘어남에따라 pod를 늘려 서버가 수많은 요청을 버틸 수 있게 해준다.
도커 컴포즈(Docker Compose)
도커 컴포즈는 단일 서버에서 여러개의 커네이너를 하나의 서비스로 정의하여, 컨테이너의 묶음을 간편하게 다룰 수 있는 작업 환경을 제공하는 관리 도구이다. 만일 하나의 애플리케이션이 Kafka, Redis, Mongo 등 여러개의 컨테이너에 의존되어 있는 경우, 이 애플리케이션을 테스트 혹은 실행하려면 서버 컨테이너를 포함하여 각 컨테이너를 각자 실행하고 관리해주어야 한다.
도커 컴포즈를 사용하면 이러한 컨테이너들을 하나의 묶음 서비스로 정의하여 서버 애플리케이션이 실행되면서 모든 컨테이너를관리할 수 있다. 또한 각 컨테이너의 의존성, 네트워크, 볼륨등을 함께 정의할 수 있으며 컨테이너 수를 유동적으로 조절할 수 있다. 자세한 내용은 다음 글을 참고했고, 먼저 도커 설치 후 도커 컴포즈를 통해 직접 개발 환경을 세팅해 볼 것이다.
Docker 설치
먼저 로컬 PC에 도커를 설치했다. 도커 설치 방법은 커맨드 명령어를 활용할 수도 있지만 나는 웹을 통해서 설치했다.
설치는 공식 홈페이지 Docker Desktop 에서 설치하였다.
접속 후 PC OS 환경에 맞춰서 설치 후 실행하면 된다. 나는 M1 mac을 사용하기 때문에 Download for Mac - Apple Chip을 선택했다.
Portainer 설치
다음으로 Docker Gui 툴인 Portainer를 설치했다. 아직 GUI 툴을 사용할 수 없으므로 Shell 명령어로 설치하였다.
Portainer 설치와 이를 통한 구체적인 Docker Container 세팅 과정은 다음 글을 참고했다.
Portainer를 설치하기 전에 도커 컨테이너의 데이터를 저장할 portainer_data 라는 이름의 볼륨(Volumes)을 생성했다.
앞서 설명했듯이, 도커 컨테이너에 사용된 파일과 데이터들은 컨테이너가 삭제될 때 함께 삭제되는데, 많은 애플리케이션이 데이터를 지속적으로 사용할 수 있도록 볼륨을 생성했다.
docker volume create portainer_data
그 후, 도커 Portainer가 실행될 컨테이너를 실행했다(Portainer 또한 컨테이너 기반 환경에서 동작한다)
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data --restart=always portainer/portainer
컨테이너 실행 옵션은 다음과 같이 주었다.
--restart=always : 도커를 재시작 했을 때 Portainer 컨테이너가 자동으로 구동
-p 9000:9000 옵션 : 9000번 포트로 Portainer 관리페이지 접근
-v portainer_data:/data : portainer_data라는 Docker 볼륨을 컨테이너의 /data 디렉토리에 마운트
portainer/portainer : portainer 라는 이름의 이미지를 빌드하여 portainer 컨테이너를 실행(도커 환경은 컨테이너 생성시 필요한 이미지가 없을 때 자동으로 다운로드 한다)
Portainer 컨테이너를 실행한 뒤 docker ps 명령어를 통해 현재 실행중인 컨테이너 목록을 확인하였다.
컨테이너가 제대로 동작하고 있다면 9000포트로 Portainer에 접속할 수 있다.
브라우저에 서버ip주소:9000 (로컬이라면 localhost:9000)를 입력해서 접속하였다.
접속하면 아래와 같은 로그인 화면이 나올 것이다. 회원가입 후 진행해주면 된다.
나는 이미 회원가입을 한 상태라서 아래와 같이 바로 로그인 화면이 나온 것으로 이거하는데, 회원가입 관련 내용은 다음 글을 참고하면 될 것 같다.
로그인 후 진입하면 다음과 같은 대시보드 를 볼 수 있다. 현재 로컬에서 실행중인 local이라는 도커 환경을 선택해주면 된다.
아래와 같이 local 이라는 이름의 도커 환경에서 실행중인 container, image, volume 등 전체적인 대시보드를 확인할 수 있다.
이중 컨테이너를 선택하면 다음과 같이 현재 실행중인 컨테이너를 GUI로 볼 수 있다.(docker ps 명령어와 동일)
앞서 설명했듯이 Portainer또한 컨테이너 기반의 툴이기 때문에 amazing_mendeleev라는 이름으로 portainer 컨테이너가 돌고 있고, 나는 mongo db 컨테이너 또한 띄운 상황이기 때문에 함께 확인할 수 있다.
다음 글은 이렇게 설치하고 접속한 Portainer를 활용해서 Mongo DB 이미지를 받고, 컨테이너로 실행하여 MongoDB GUI 툴인 Mongo Compass로 접속해보겠다.