회사에서는 우분투, 윈도우즈 OS를 가진 두 개의 노트북을 사용하지만, 집에서는 그렇지 못합니다. 윈도우도 개발환경으로 사용하는데 충분하지만, 그래도 우분투 터미널에 익숙해져 있기도 하고, 오픈 소스 중 일부는 우분투 같은 리눅스에서만 실행할 수 있기에, 종종 ubuntu를 개발환경으로 사용 합니다.
최근에 집에서 사용하는 데스크탑 컴퓨터를 업그레이드하면서, OS도 새로 설치하는 바람에 우분투 개발환경도 새로 만들었습니다. 이 전에는 VirtualBox를 사용했었지만, 윈도우10에서 Docker를 이용해서 개발환경을 만들었고 그 과정 중 일부를 정리해봤습니다. 아 개발환경도 어떤 걸 개발하느냐에 따라 많이 다를 수 있겠네요. 저는 주로 백엔드 애플리케이션을 개발하고 간혹 ML을 하기도 합니다. 프로그래밍 언어는 Java, Go, Node, Python을 많이 사용합니다.
Docker를 고려한 이유.
기존에 했던 방식대로 VirtualBox에 우분투를 설치해도 되지만, 새로운 데스크탑에서는 더 깔끔하게 구성해보고 싶었습니다. 그리고 만약 우분투를 메인으로 사용했더라면, GUI는 필수라고 할 수 있지만, 윈도우를 주로 사용하기 때문에 개발환경에서는 그렇지 않아도 된다고 생각한 점도 있습니다. 그리고 지금 제가 사용하는 범위에서 AWS, Azure 같은 클라우드에서는 CLI 환경만 제공하고 그렇게 사용해왔기 때문에 CLI에 이미 익숙해져 있는 점도 docker를 고려한 이유입니다.
wsl을 쓰면 간단하지 않냐라고 하실 수도 있는데, 속도가 느리고 아직은 완벽하게 호환되지 않는 것 같은 느낌입니다. wsl2에서는 개선된다고 하니, 그때가 되면 이런거 다 필요없어 질 수도 있으니 그때 가서 다시 생각해보려고 합니다.
개발환경에서 설치한 것들.
openssh-server : ssh 연결을 위해서
openjdk : java sdk
editor : vim
.. 기타 등등
사실 ssh만 설치되면 다른 것을 추가로 설치하는 것은 그다지 어려운 것은 아니기에 나머지를 설명하지는 않았습니다.
개발환경 만들기
Docker Desktop은 이미 설치되어 사용가능한 상태여야 합니다. ( 홈에디션을 사용하시는 경우는 Docker Toolbox를 이용하시면 됩니다. )
1. 도커 허브에서 우분투 이미지를 다운 받습니다.
# ubuntu image pull.
$ docker pull ubuntu:20.04
2. 이제 우분투 이미지를 실행하고, ssh 접속이 가능하도록 openssh-server를 설치합니다.
# ubuntu 컨테이너 실행.
docker run -it -p22:22 --name my-ubuntu ubuntu:20.04 bash
# 컨테이너 내부
# 외부에서 ssh 접속을 위한 openssh-server 와 편집기 설치
/# apt-get update
/# apt-get install -y openssh-server vim
# root 계정 패스워드 설정
/# passwd
# root 접속 허용 설정.
/# sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
# ssh 시작.
/# service ssh start
3. 이제 컨테이너 외부에서 접속할 수 있고, 평소대로 ubuntu 터미널을 사용하는 것처럼 사용할 수 있습니다. 이제 개발에 필요한 SDK를 설치하면 개발환경은 완성됩니다. 여기서부터는 필요한 것을 설치하면 됩니다. 저는 openJDK를 설치해보겠습니다.
# openjdk 설치
/# apt-get install -y openjdk-14-jdk
# 설치확인.
/# java -version
불편함은 어떻게 해결할 것인가?
개발 환경 구성은 마쳤고, 코드를 작성하고 빌드하고 테스트하고를 반복하며, 개발하면 됩니다. 하지만 아직은 불편함이 남아있습니다. 아까 설치한 vim을 이용해 충분히 코드를 작성할 수는 있지만, GUI환경에서 주어지는 편리함에 비하면 불편한게 사실입니다. 이런 코드 작성의 불편함 원격 접속으로 해소할 수 있습니다. 제가 쓰는 notepad++는 원격 접속을 통해 파일을 편집하는 기능을 제공합니다.
notepad++의 리모트 접속.
플러그인 -> 플러그인 관리를 실행하고 ftp로 검색하여 NppFTP플러그인을 설치합니다.
이제 플러그인-> NppFTP -> Show NppFTP window 를 선택하고, NtpFTP 창에서 설정 버튼을 눌러 profile설정에서 add new 버튼으로 프로필을 추가해 줍니다.
프로필을 만들었으면, NppFTP 창에서 연결 버튼을 눌러 방금 만든 프로필로 접속하면 컨테이너 안의 파일을 볼수 있습니다.
접속이 완료 된 이후에는, 탐색기를 사용하듯 더블클릭으로 파일을 열고, 편집 저장할 수 있습니다.
notepad++를 이용해 코드를 편집하는데 불편함은 일부 해결했습니다. 하지만, intellj 같은 IDE 사용하지 못하는 아쉬움이 있어서 Docker Volume을 이용해서 IDE를 이용할 수 있도록 했습니다. 컨테이너에서 /home 아래 부분을 호스트와 공유하도록 합니다.
# volume 설정을 추가하여 컨테이너 실행.
$ docker run -it -v ./workspace:/home ubuntu:20.04 bash
이제 workspace 는 컨테이너와 공유되기 때문에 동일한 소스코드가 윈도우를 사용하는 호스트와 ubuntu를 사용하는 컨테이너 간에 동기화가 됩니다. 윈도우에서 실행한 IDE의 기능을 활용할 수 있게 되었습니다. 이제 자동완성을 할 수 있고, 코드를 추적해갈 수 있습니다.
그렇지만 여전히 IDE를 이용한 원격 디버깅은 할 수는 없고, 로컬에서 디버깅 하고, 원격에서 테스트 하는 방식으로 불편함을 줄일 수는 있습니다. ( goLand는 일부 IDE는 원격 디버깅이 지원되기도 합니다. )
VirtualBox vs. Docker
잠깐 사용해본 둘의 차이는 이렇습니다.
1. VirtualBox에서는 GUI를 그대로 사용할 수 있지만, Docker는 그렇지 못합니다.
2. 스토리지 사용량은 Docker가 압도적으로 작습니다. ( GUI를 포함한 여러 기능을 사용하지 않으니 당연합니다. )
3. Docker의 실행(부팅) 속도가 압도적으로 빠릅니다.
4. VirtualBox에서는 IDE의 모든 기능을 사용할 수 있습니다. ( 가상환경에 자원을 꽤 할당해 줘야 쾌적합니다. )
윈도우 이외의 배포환경을 가지고 있고, ( 특히 클라우드 ) 개발을 완료하고 배포하기 전에 빠르게 테스트를 한다거나, 급하게 개발환경을 꾸며야 할때, 혹은 윈도우 환경과 개발환경의 분리 할 필요가 있을 때 사용해보면 좋을만 한 환경이 구성된 것 같습니다.
하지만 아직은 사용 시간이 길지 않기에 장단점이 더 나올지 모르지만 현재는 간단히 사용하기에는 나쁘지 않은 구성이라고 생각합니다. 특히 1분여의 시간 안에 환경을 꾸밀 수 있고, 또 삭제할 수 있는 장점이 크게 다가왔습니다. 더 써보다가 다른 의견이 생기면 추가하도록 하겠습니다.
1분안에 이 모든 것을 하려면
그런데, 스크립트 실행하는데만 1분이 넘을거 같은데? 라고 하실 수 있지만, 이미 빌드된 도커 이미지를 내려받아 띄우면 1분안에 가능합니다. 도커 이미지는 도커 허브에 있고, 도커파일과 간편한 실행을 위한 컴포즈 파일은 깃헙에 올려두었습니다. 이미지는 필요에 따라 수정해서 사용하시면 됩니다.
Docker Image : https://hub.docker.com/r/ikaruce/ubuntu
GitHub : https://github.com/ikaruce/dev-ubuntu-docker
끝.