이번 시간에는 docker를 이용하여 로컬PC에 개발환경을 빠르게 구성하는 방법에 대하여 실습하겠습니다. 일반적인 웹서비스 구축시 DB로는 Mysql, MongoDB를 캐시 서버로는 Redis를 그리고 메시지큐로는 RabbitMQ를 주로 사용하게 됩니다. 로컬 환경에 해당 애플리케이션을 설치하고 사용해도 되지만 PC환경에 따라 여러가지 추가설정이 필요할 수 있고 어플리케이션을 설치하는 시간도 만만찮게 들게됩니다.

그리고 linux환경이 아니면 구축하기 까다로운 애플리케이션들(이를테면 Redis, Nginx, ElasticSearch등등..)도 쉽게 설치가 가능합니다.

Docker를 이용하면 도커 기반위에 컨테이너라는 격리된 공간에 애플리케이션이 설치되어 동작하게 됩니다. 이미 만들어진 이미지를 컨테이너에 올리는것이기 때문에 일반적인 설치보다 속도가 상당히 빠릅니다 . 또한 독립된 컨테이너에 설치되기 때문에 일반적인 방법으로 설치 했을때보다 매우 깔끔하게 삭제가 가능합니다.

이번 실습에서는 빠른 개발환경 구축을 실습하는 것이기 때문에 docker의 사용법에 대해서는 다루지는 않겠습니다.

Docker 회원 가입

Docker를 로컬에서 사용할때 로그인을 해야 Docker hub를 통해 제대로된 기능을 사용할수 있으므로 아래 링크에 접속하여 미리 가입을 해두도록 합니다. 가입을 하면 Private Repository 1개를 무료로 주므로 나쁠것은 없습니다.

https://www.docker.com/

Windows Hyper-V 활성화 확인

Mac과 달리 Windows에 설치할 경우 Hiper-v 가상화가 가능한 PC에서만 사용가능하니 확인이 필요합니다.(구형 PC가 아닌이상 요즘 PC는 대부분 지원합니다.) 윈도우 설정 -> 프로그램 -> Windows 기능 켜기/끄기 -> Hyper-V가 체크되어있지 않다면 체크 후 PC 재부팅이 필요합니다. (경우에 따라서는 BIOS에서 가상화를 활성화 해야할수도 있습니다.)

Docker Desktop Download 및 설치

아래 링크로 이동하여 해당 환경에 맞는 docker를 다운받고 설치합니다.

https://hub.docker.com/?overlay=onboarding

설치 후 실행하면 작업표시줄 하단에 짐을 실은 고래모양의 docker 아이콘을 만나볼 수 있습니다. 클릭하면 로그인을 요구하는데 위에 docker hub에서 가입한 계정으로 로그인을 합니다.

Kitematic 설치

아래 GitHub에서 Kitematic을 받습니다. kitematic은 docker 컨테이너에 애플리케이션을 쉽게 설치할 수 있도록 도와주는 GUI 도구입니다.

https://github.com/docker/kitematic

Releases를 클릭하면 배포버전을 다운로드 받을수 있는 화면으로 이동하는데 환경에 맞는 Zip파일을 다운로드 받습니다.

Kitematic 실행

설치형 프로그램이 아니므로 압축을 풀고 Kitematic.exe를 실행합니다.(윈도우 기준)

다음과 같이 PC보호가 뜨면 추가정보를 클릭하고 아래에 실행 버튼을 클릭하면 됩니다.

그럼 아래와 같이 kitematic이 실행됩니다. 상단에 이미 로그인이 되어있는데 로그인이 되어있지 않다면 위에서 만든 docker 계정으로 로그인 하면 됩니다.

이제 모든 준비가 끝났습니다. 뭔가 많은것을 설치하고 복잡해 보이지만 별거 없습니다. docker + kitematic 두개만 있으면 됩니다.

Mysql 설치

Kitematic 검색창에서 mysql을 검색합니다. 그럼 최상단에 official이라고 하여 공식 이미지가 최상단에 노출됩니다. create를 눌러 설치합니다.

여기서 특정 버전의 mysql을 설치하고 싶으면 create 왼쪽에 …을 누르면 SELECTED TAG: latest라고 보이는데 해당 부분을 클릭하면 특정 버전을 선택하고 설치할 수 있습니다.

Create를 누르면 아래와 같이 받아둔 이미지가 없는 경우 다운로드 후 바로 실행이 됩니다.

Mysql의 경우 설치시 MYSQL_ROOT_PASSWORD 설정이 필요한데 Settings 탭을 누르고 Environment Variables에 MYSQL_ROOT_PASSWORD를 추가하고 Save를 누릅니다. Save하면 설정이 적용되고 자동으로 컨테이너도 재시작됩니다. 재시작 되지 않으면 화면 상단의 Restart 버튼을 눌러 컨테이너를 재시작 하면 됩니다.

설정에서 Hostname/Ports 탭을 클릭하면 Configure Ports라는 항목을 볼수 있는데 docker 컨테이너에서 실행되는 mysql을 개발pc의 특정 port와 연결하는 설정입니다. docker 컨테이너는 격리된 환경이기 때문에 외부에서 접근하기 위해서(여기서는 개발PC) port를 열어주는 것이라고 보면 됩니다.

아래는 mysql 컨테이너의 3306포트를 개발pc의 32771 포트로 접속할 수 있도록 세팅되어있는데 3306으로 변경하고 저장합니다.

Mysql 설치가 끝났습니다. 이제 아래 정보로 DB에 접속하여 사용할 수 있습니다.

  • Hostname : localhost
  • port : 3306
  • id : root
  • password : password

여기서 한가지 더 좋은점이 있습니다. docker로 mysql 서버를 올릴경우 터미널로도 접속이 가능합니다. kitematic 상단에 보면 EXEC 버튼이 있는데 누르면 powershell이 뜨며 해당 컨테이너에 접속한 상태가 됩니다. 이 상태에서 다음과 같이 mysql에 접속해서 작업이 가능합니다.

Redis 설치

Mysql과 설치과정은 동일합니다. kitematic에서 +NEW를 누르고 검색창에 redis를 검색한 후 최상단의 official 버전을 설치합니다.

Mysql처럼 환경변수를 설정할 필요도 없이 자동으로 서비스가 올라옵니다. 역시나 포트를 변경하고 싶으면 Hostname/Ports로 들어가 published IP:PORT를 변경하고 저장합니다. 실습에서는 6379로 변경하였습니다.

Redis 역시 순식간에 설치가 되었으며 localhost:6379로 접속하여 사용할 수 있습니다. mysql처럼 EXEC를 눌러 터미널에서 작업 역시 가능합니다.

RabbitMQ 설치

kitematic에서 +NEW를 누르고 검색창에 rabbitmq를 검색한 후 최상단의 official 버전을 설치합니다.

설치가 완료되면 서버 콘솔에 접속하여 web admin을 활성화 하는 plugin을 설치합니다.

$ rabbitmq-plugins enable rabbitmq_management

추가로 계정을 생성하고 administrator권한을 부여합니다.

$ rabbitmqctl add_user happydaddy password
$ rabbitmqctl set_user_tags happydaddy administrator

웹 어드민은 15672 port로 활성화 되므로 Hostname/Ports에 내용을 추가하고 Save 합니다.

작업이 완료되면 localhost:15672로 접속하여 웹 어드민에 접속 가능합니다.

MongoDB 설치

kitematic에서 +NEW를 누르고 검색창에 mongo를 검색한 후 최상단의 official 버전을 설치합니다.

설치 완료후 kitematic 상단의 EXEC 버튼을 눌러 mongo 인스턴스에 접속합니다. shell에서 mongo를 입력하여 db에 접속 후에 계정을 하나 생성합니다.

# mongo
MongoDB shell version v4.2.6
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("6fab41a4-c5f7-4307-93b4-4014b49af56f") }
MongoDB server version: 4.2.6
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
	http://docs.mongodb.org/
Questions? Try the support group
	http://groups.google.com/group/mongodb-user
Server has startup warnings:
2020-04-24T05:44:29.621+0000 I  STORAGE  [initandlisten]
2020-04-24T05:44:29.621+0000 I  STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2020-04-24T05:44:29.621+0000 I  STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2020-04-24T05:44:30.099+0000 I  CONTROL  [initandlisten]
2020-04-24T05:44:30.099+0000 I  CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2020-04-24T05:44:30.099+0000 I  CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2020-04-24T05:44:30.099+0000 I  CONTROL  [initandlisten]
---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).

The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.

To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---

> use admin
switched to db admin

> db.createUser({
... user: "admin",
... pwd: "pass",
... roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
... })
Successfully added user: {
	"user" : "admin",
	"roles" : [
		{
			"role" : "userAdminAnyDatabase",
			"db" : "admin"
		}
	]
}

bye로 shell에서 빠져나와 생성한 id로 로그인합니다. 몇가지 명령을 입력하여 mongoDB가 제대로 동작하는지 확인합니다.

> exit
bye
# mongo -u admin
MongoDB shell version v4.2.6
Enter password:
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("3e944815-1a98-4b82-82fe-b011ce9b951a") }
MongoDB server version: 4.2.6
Server has startup warnings:
2020-04-24T05:44:29.621+0000 I  STORAGE  [initandlisten]
2020-04-24T05:44:29.621+0000 I  STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2020-04-24T05:44:29.621+0000 I  STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2020-04-24T05:44:30.099+0000 I  CONTROL  [initandlisten]
2020-04-24T05:44:30.099+0000 I  CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2020-04-24T05:44:30.099+0000 I  CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2020-04-24T05:44:30.099+0000 I  CONTROL  [initandlisten]
---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).

The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.

To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---
> use admin
switched to db admin
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
> db.stats()
{
	"db" : "admin",
	"collections" : 2,
	"views" : 0,
	"objects" : 3,
	"avgObjSize" : 214.66666666666666,
	"dataSize" : 644,
	"storageSize" : 57344,
	"numExtents" : 0,
	"indexes" : 3,
	"indexSize" : 77824,
	"scaleFactor" : 1,
	"fsUsedSize" : 10915753984,
	"fsTotalSize" : 62725623808,
	"ok" : 1
}
> show collections
system.users
system.version

추가 : replica set으로 구성된 mongodb 설치

위의 방식으로 mongo를 설치하면 단일 인스턴스로 설치됩니다. 만약 복제 구성된 mongo가 필요할경우(ex. HA 기능 테스트나 트랜잭션 기능이 필요할때)
mongo-replica-set을 검색하여 설치하면 됩니다.

컨테이너 구동후 Port 정보를 보면 3개의 replica로 구성된 것을 확인할 수 있습니다.

실습을 통하여 mysql, redis, rabbitmq, mongoDB를 설치해 보았습니다. 숙련되면 4개의 애플리케이션을 설치하는데 5분 정도면 가능할 것입니다. 이처럼 Docker를 이용하면 빠른 개발 환경 구성이 가능합니다.

docker의 좋은 점 중 또 하나는 사용하지 않으면 컨테이너를 STOP 시켜둘 수 있다는 것입니다. 사용할 때만 켜 두면 되므로 윈도우에 설치했을 때처럼 서비스에 등록되어 상시로 메모리 리소스를 점유하는 것을 방지할 수 있습니다.

여기까지 Docker를 이용하여 로컬 개발환경을 쉽게 구축하는 방법을 실습해 보았습니다. 실습 내용을 보면 아시겠지만 kitematic에서 검색 시 제공되는 애플리케이션 이미지들은 docker hub를 통해 제공됩니다.

Docker Hub는 다음과 같이 생각하면 쉽습니다.

GitHub = 소스코드 저장소
DockerHub = 애플리케이션 컨테이너 저장소

우리가 개발시 사용하던 서버 애플리케이션들은 거의 모두 Docker hub에 컨테이너 이미지가 존재한다고 보면 됩니다. 이처럼 Docker를 이용하면 필요한 이미지를 받아 빠르게 설치해 사용하고 사용후에는 중지하거나 빠르게 삭제할 수 있습니다.