2 분 소요

도커에 ROS를 설치해보았다!

도커에 ROS를 설치하게 된 계기

이번에 도커에 ROS를 설치하게 된 계기는 단순히 최선의 방안이라고 생각했기 때문이다. 원래 듀얼부팅 방식으로 리눅스를 설치하고 그거랑 터틀봇이랑 bring패키지로 연동하는게 일반적이라고 하는데, 듀얼부팅 방식을 써본 나의 입장에서는 듀얼부팅방식이 메모리를 정적으로 할당해서 써먹기 때문에 매우 단순하지만 효율적이지 못한? 그런 거라고 생각했다. 그래서 윈도우를 기본적으로 쓰되, 그 위에 가상컨테이너를 심고, 거기다가 리눅스를 돌리는 방식을 하면 기존과 다르지 않은 윈도우 환경에서 편하게 작업을 하는 동시에, 필요할때만 부분으로 컨테이너 실행해서 동적으로 메모리를 할당해주는 방식이 훨씬 합리적이라고 느껴졌다. 물론 trade-off라는 말처럼 이 또한 존재한다. 결국 도커는 운영체제 여러개를 동시에 수행하는 것이기 때문에 그만큼 연산량이 배로 늘어나게 된다. CPU입장에서는 리눅스에서 오는 명령어를 처리하는 동시에 윈도우 명령어로 처리해야 하니까 머리가 터지는 거다ㅋㅋㅋ.

그리고 실제로 도커를 쓰면서 WSL도 쓰기 때문에 커널충돌이 발생하여 “알수없는 오류로, 문제를 해결하고 다시 재부팅합니다.”라는 문구를 심심치 않게 보았다.

반면 듀얼부팅은 리눅스를 킬때 윈도우는 잠들어 있는 구조라서 속도가 더 빠른것도 사실이지만, 그래도! 난 도커를 사랑한다.

설치해보자!

일단 나는 ros를 도커에 설치하기 위해 이 링크를 참고했다.

도커 다운로드

우선 설치한 도커 이미지를 다운로드 해주었다.

링크에 들어가면 다양한 도커 이미지들이 있는데, 이중에서 osrf/ros:melodic-desktop-full라는 이미지를 WLS창을 켜고 아래 명령어를 입력해주어 다운로드 해주었다.

docker pull osrf/ros:melodic-desktop-full

이제 나의 도커이미지들을 확인해보았다.

image-20240426222415868

위와 같이 osrf/ros가 설치된 것을 확인할 수 있다. 일단 한가지 절차를 알아둘 필요가 있다.

image-20240426222655332

위 그림은 Dockerfile을 만들고 이를 빌드해서 이미지 파일을 만들고 이를 실행(docker run)해서 컨테이너, 즉 프로세스를 하나 올리는 과정에 대한 그림이다. 나는 docker pull명령어로 다른 사람에 의해 빌드된 이미지파일을 땡겨왔다. 이제 이거를 실행해주려고 한다.

docker run \
-it \
--name ros1 \
--env="DISPLAY=:0.0" \
-v /tmp/.X11-unix:/tmp/.X11-unix:ro \
-v /dev:/dev \
-v /c/Users/jacksmith/Documents/playground/docker_workspace:/home/turtlebot \
-w=/home/turtlebot \
osrf/ros:melodic-desktop-full

위 명령어를 조금 뜯어보자면 다음과 같다.

  • --name ros1: Container의 이름이다. 만약 컨테이너이름을 TurtleBro라고 하면 도커 컨테이너이름이 그렇게 바뀌겠지?
  • --it: 컨테이너에서 터미널 명령을 사용할 수 있도록 하는 옵션이다.(이건 필수인데, 왜 선택사항처럼 입력하게 두었는지 잘 모르겠다. 마치 프로그램을 설치하고 실행할 때마다 “진짜 이거 실행할거에요?(Y/N)”라고 물어보는 것과 같다고 생각한다)
  • --privileged: Container에서 시스템의 주요 자원에 접근할 수 있도록 하기 위해서다.
  • --env="DISPLAY=:0.0": 컨테이너에 DISPLAY라는 환경변수를 지정해주는 것이다. 이로써 Host에 GUI를 출력하도로 하기 위함이다. (이렇게 하면 우분투 GUI화면 띄울 수 있는 건가?ㄷㄷ?)
  • -v=/dev:/dev: Container의 /dev 폴더가 Host의 /dev 폴더에 연결되도록 하기 위함이다. –privileged 옵션을 주어서 / dev아래에 여러 장치에 접근할 수가 있게 된다고 한다. 추후에 터틀봇의 라즈베리파이랑 연동하기 위해서 이게 필수적일 것 같다.
  • -v /c/Users/jacksmith/Documents/playground/docker_workspace:/home/turtlebot: 컨테이너의 워스페이스와 호스트의 워크스페이스를 연결해준다. 이렇게 하면 컨테이너 워크스페이스에서 작업한 내용들이 호스트의 워크스페이스에 온전히 저장된다고 한다. 즉, 도커를 삭제하더라도 Host work space에 작업한 내용이 남아있게 된다고 한다.
  • -w=/home/turtlebot: 컨테이너에 접속했을 경우 시작 폴더위치다.

위와 같이 명령어를 입력해주면 일단은 컨테이너가 실행이 된다. 이제 wsl창을 하나 더 열어주고 아래 명령을 실행해준다.

xhost +local:docker

(이 명령은 로그인후 매번 실행해야 한다고 하는데, 아직 잘 와닿지는 않는다)그리고 한가지 더 문제가 있는게 실행이 안되더라….

jacksmith@DESKTOP-TF2BVRP:~$ xhost +local:docker
non-network local connections being added to access control list

솔루션을 탐색해보니, Docker데몬이 제대로 실행중인지 확인하라고 하더라, 데몬이 제대로 실행중이지 않다면 sudo systemcl start docker로 시작하라고 하더라,

그 다음에 체크할 요소가 X11서버 실행여부다. X11서버는 일반적인 데스크톱환경에서 실행되는 기본서버라 볼 수 있는데, 터미널에서 원격 서버에 접속하거나 GUI가 없는 시스템에서는 실행되지 않을 수 있다고 하더라,

그 다음에 체크할 요소가 권한이슈였다. 도커를 실행하기 위해서는 적절한 권한이 필요한데 도커를 sudo없이 실행하려면 사용자를 도커에 추가해주어야 한다고 하더라,

sudo usermod -aG docker $USER

그 다음에 체크할 부분이 X11 엑세스 설정이다.

docker run -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix your_docker_image

X11 서버에 원활한 접속을 위해 환경변수를 올바르게 설저하고, 호스트의 시스템의 X11 소켓을 컨테이너에 마운트해야 한다고 하더라.

댓글남기기