Full Remote Mode Of CLion With Docker
게으름이 이렇게 무섭다. 이걸 포스팅하겠다고 메모해 놓은 지 반년이 지났다. (이렇게 밀린 메모가 더 있다는 건 비밀이다.)
서버 개발자로 일을 하다 보면 Linux 환경만 지원하는 서버를 유지보수 해야 할 수도 있다. 아마 epoll을 사용한 서버일 것이다. 어떤 개발 환경으로 세팅이 되어 있을지는 모르겠지만, 해당 서버에 직접 들어가서 vi로 작업을 하고 make로 빌드하고 gdb로 디버깅을 해도 된다.
또는, Docker로 같은 Linux로 개발 환경을 만들고 visual studio code를 리모트로 연동해도 된다. 방법은 다양하다. 하지만, 나는 에디터나 터미널에서 vi로 작업하고 make를 실행하고 git 커맨드를 직접 사용하는 진성 개발자가 아니다. 편리한 IDE를 선호한다. vi의 손맛을 좋아하며 코딩하던 나의 멋진 취향은 Sun의 Enterprises 3500에서 개발할 때까지였다.
여기서 소개하는 방법은 CLion과 Docker를 연동하는 방법이다. 공식 문서에도 소개가 잘 되어 있지만, 보고 바로 따라하기에는 좀 어렵다. 그리고, CLion은 유료 개발 툴이다.
CLion과 Docker 모두 설치되어 있고, Docker와 C++을 사용할 수 있다고 가정한다. CLion Plugins 설정에 ‘Docker integration’이 설치되어 있는지 확인하고 없다면 설치한다. 예제가 하나 있어야 설명하기 좋으니 단순한 예제로 환경을 구성하겠다. MacOS에서 CentOS 7에서 돌아가는 서버를 개발한다는 구성이다. 빌드해볼 코드로는 MacOS에서 빌드되지 않는 epoll에 대한 간단한 예제를 사용하겠다.
전체 프로젝트는 여기에서 받을 수 있다. C++ 프로젝트를 하나 만드는 것으로 시작하겠다.
CLion에서 기본 C++ 프로젝트를 만들면 다음과 같이 전통적인 ‘Hello, World!’ 예제가 CMake 프로젝트로 만들어진다.
1 2 3 4 5 6
#include <iostream> int main() { std::cout << "Hello, World!" << std::endl; return 0; }
Run을 해보면 ‘Hello, World!’가 잘 출력될 것이다. 그러면, epoll을 사용하기 위해서 epoll_create1()을 호출해보자. epoll_create1() 함수를 사용하기 위해서 ‘epoll.h’를 inlcude해야 한다. 다음과 같이 코드를 수정한다.
1 2 3 4 5 6 7 8 9 10 11 12 13
#include <sys/epoll.h> #include <unistd.h> #include <iostream> int main() { int epollFd = epoll_create1(0); if (epollFd == -1) { std::cout << "Error: failed to open an epoll file descriptor" << std::endl; return EXIT_FAILURE; } return close(epollFd); }
#include <sys/epoll.h>을 편집창에 넣는 순간 빨간 밑줄이 생기면서 해당 파일을 찾을 수 없다고 알려줄 것이다. 일단, 무시하고 Run을 해보자. 예상한 것처럼 컴파일 에러가 발생한다.
이제, 이 코드를 Docker에 설치한 CentOS에서 빌드하고 실행할 수 있도록 구성할 것이다. CLion은 Docker에 설치된 CentOS와 연동하기 위해서 ssh와 rsync 사용하므로 ssh server와 rsync를 설치해야 한다. C++ 빌드도 해야 하니 gcc 등도 설치할 것이다.
현재 프로젝트에 ‘New File’을 ‘Dockerfile’이라는 파일명으로 추가하고 아래의 내용을 추가하고 저장한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
FROM centos:7 RUN useradd dev RUN echo 'dev:mypass' | chpasswd RUN yum install -y openssh-server rsync RUN ssh-keygen -N '' -t rsa -f /etc/ssh/ssh_host_rsa_key && \ ssh-keygen -N '' -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key && \ ssh-keygen -N '' -t ed25519 -f /etc/ssh/ssh_host_ed25519_key RUN echo /usr/sbin/sshd >> /root/.bashrc && source /root/.bashrc RUN sed -i 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/' /etc/ssh/sshd_config RUN yum install -y gcc gcc-c++ make RUN yum install -y epel-release RUN yum install -y cmake3 EXPOSE 22 CMD ["/bin/bash"]
ssh 접속은 설정을 단순하게 하기 위해서 password 방식을 사용하였다. 필요에 따라서 key-pair 방식을 사용해도 된다. 위 Dockerfile에서 특이한 설정이 두 가지 있는데 ‘GSSAPIAuthentication’의 설정을 ‘no’로 설정하여 사용하지 않도록 한 부분과 ‘epel-release’를 설치한 부분이다.
‘GSSAPIAuthentication’ 설정을 그냥 두면 password 인증까지 가기 전에 CLion에서 Timeout이 발생하여 리모트 프로젝트 로딩에 실패한다. ‘epel-release’를 설치하지 않으면 yum으로 ‘cmake3’를 설치할 수 없다.
파일이 준비되었으면, 아래와 같이 ‘Run/Debug Configurations’에 Dockerfile을 추가한다.
그리고, 아래와 같이 설정한다.
설정을 다 하고 ‘OK’를 클릭하면 지금 설정한 ‘CentOS_7’로 ‘Run/Debug Configurations’이 자동으로 선택되어 있을 것이다. Run을 눌러서 실행하면 Docker image를 빌드하고 container 실행까지 시켜준다. 시간이 제법 걸릴 것이다. 에러가 발생하면 자동으로 중단되니 느긋하게 기다리기 바란다. 성공적으로 배포되면 Docker Deploy Log에 CentOS_7 Dockerfile: Dockerfile' has been deployed successfully. 라고 나올 것이다.
다음과 같이 CLion의 Toolchains에 Remote Host를 새로 추가할 것이다. 먼저, Credentials를 다음과 같이 설정한다. Port, User name, Password는 Dockerfile에서 설정한 ‘22222’, ‘dev’, ‘mypass’이다.
CMake를 못찾는다고 나올 텐데, 에디터창을 더블 클릭해서 편집상태로 들어가서 ‘/usb/bin/cmake3’로 수정하면, 현재 도커에 설치된 cmake3의 버전이 출력될 것이다. 아래의 Make, C Compiler, C++ Compiler는 조금 기다리면 자동으로 Detected가 된다.
Debugger는 이번 포스팅에서 설정하지 않을 것이다. Remote Deubgging은 다음에 추가로 다루겠다.
마지막으로 다음과 같이 CMake 설정을 한다. Toolchain의 기본값인 Default를 위에서 설정한 ‘Remote Host’로 선택하면, 다음과 같이 Profile이 ‘Debug-Remote Host’로 변경될 것이다. 이대로 ‘OK’를 클릭해서 저장한다.
창이 닫히면 백그라운드로 CLion과 Docker가 연동되고 ‘CMake’탭을 열어보면 아래와 같이 출력될 것이다.
main.cpp 파일을 다시 열어보자.
에러를 표시하던 부분이 모두 사라졌을 것이다. ‘Run/Debug Configurations’설정을 ‘example’로 선택하고 Build를 해보자.
문제없이 빌드될 것이다. Run하면 문제없이 실행하고 에러 메시지 출력 없이 정상 종료될 것이다.
여기서 끝이 아니다. epoll_create1 함수 호출 부분에 커서를 가져가서 F1을 누르면 도움말이 나오고, ’command+B’를 누르면 epoll.h 파일로 점프한다. CLion의 Full Remote Mode를 사용하면 Linux에서만 빌드되는 프로젝트를 MacOS or Windows 환경의 IDE에서 개발할 수 있다.
다음에는 이 예제에 Remote Debugging을 설정하면서 Docker Compose로 변경할 것이다.
(원글: https://prostars.net/312)