macOS에서 Docker로 ROS 개발 환경 구축하기
Docker로 ROS를 구축하면 macOS에서 깔끔하고 효율적인 개발 환경을 마련할 수 있다. 이 글은 Docker 설치, ROS 이미지 받기 및 실행, GUI 지원을 위한 XQuartz 설정, X11 포워딩으로 컨테이너 실행 방법을 설명한다. 다음 단계들을 따르면 macOS 터미널에서 rviz, rqt 같은 ROS 도구들을 매끄럽게 실행할 수 있다.
macOS의 Docker
Docker는 Linux 애플리케이션을 실행하기 위한 격리된 환경을 제공하므로, macOS에서 ROS를 개발하기에 이상적인 선택이다. macOS는 Linux 컨테이너를 기본으로 지원하지 않으므로, Docker는 백그라운드에서 경량 Linux 가상 머신을 실행한다.
Docker 설치
- Docker Desktop for Mac을 다운로드하여 설치한다.
- 또는
brew로 Docker를 설치할 수 있다.brew install --cask docker - Docker를 열고 실행 중인지 확인한다.

ROS Docker 이미지 받기
Docker를 설치한 후, 다음 단계는 ROS 이미지를 받아 컨테이너를 실행하는 것이다. 공식 Docker 이미지는 Docker Hub나,

Docker Desktop에서 찾을 수 있다.

나는 ROS noetic 이미지(Ubuntu 20.04용)를 선택하여 실행했다.
docker pull ros:noetic-ros-core
사전 설치된 도구가 더 많은 ROS 이미지를 받고 싶다면, 이미지 크기를 확인하여 ros:noetic-robot이나 ros:noetic-perception 같은 더 큰 것을 선택하면 된다.
ROS 컨테이너 실행
ROS Docker 컨테이너를 생성하고 접속하려면 다음을 실행한다되.
docker run -it ros:noetic /bin/bash
또한 컨테이너의 새 터미널을 열고 싶다면 다음을 사용한다.
docker exec -it [container name] /bin/bash
기타 기본적인 Docker 명령은 다음과 같다.
# Show the available images
docker images
# Show the history of an image
docker history [image name]
# Show the running containers
docker ps
# Show all containers
docker ps -a
# Execute a command in a running container
docker exec [container name] [command]
# Create a new image from the changed container
docker commit -m [description] [container name] [image repository]:[tag]
ROS 설치를 따라 ROS 패키지를 설치한 후, rqt_graph를 실행하면, 아래 스크린샷과 같은 오류가 발생할 수 있다.

컨테이너는 격리된 환경이므로 호스트 시스템의 디스플레이 서버에 직접 접근할 수 없다. 따라서 GUI 애플리케이션(rviz나 rqt 등)은 호스트와 클라이언트 기기 사이의 다리 역할을 하는 X server 없이는 동작하지 않는다. GUI를 지원하려면 X server, 구체적으로 macOS에서는 XQuartz를 설정해야 한다.
X server (XQuartz) 설치
ROS 도구는 그래픽 애플리케이션을 위해 X11에 의존하므로, macOS용 X server 실행 프로그램인 XQuartz를 설치하고 설정해야 한다.
- XQuartz를 다운로드하여 설치하거나,
brew를 사용한다.brew install --cask xquartz - 설치 후 컴퓨터를 재시작한다.
- XQuartz를 열고 Preferences → Security 로 이동한다.
- Allow connections from network clients 를 체크한다.

X server 설정으로 Docker 실행
Docker 컨테이너가 X server를 사용할 수 있게 하려면 다음이 필요하다.
xhost를 이용해 연결을 허용한다.- 컨테이너를 시작할 때 환경 변수를 전달한다.
다음은 GUI를 지원하는 ROS 컨테이너를 실행하는 스크립트다.
# run_docker.sh
#!/bin/bash
PS_NAME=sangillee
xhost + # allow any host to connect to the X server
xhost + $(hostname) # specifically allow the local machine to connect
export HOSTNAME=$(hostname)
docker stop $PS_NAME 2>/dev/null # stop container with the same name to prevent conflict
docker rm $PS_NAME 2>/dev/null # remove the container with the same name
docker run \
--name $PS_NAME \
-e QT_X11_NO_MITSHM=1 \
-e DISPLAY=host.docker.internal:0 \
--hostname $(hostname) \
--network host \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-it $1 /bin/bash
주요 옵션 설명
-e QT_X11_NO_MITSHM=1: 컨테이너에 공유 메모리를 사용하지 않는다.-e DISPLAY=host.docker.internal:0: 디스플레이 환경 변수를 컨테이너에 전달한다.-v /tmp/.X11-unix:/tmp/.X11-unix: 통신을 위해 X11 소켓을 마운트한다.--network host: 더 나은 성능과 연결성을 위해 호스트 네트워크를 사용한다.
이제 컨테이너 안에서 ROS GUI 애플리케이션 rqt_graph를 실행할 수 있다.

결론
Docker와 XQuartz를 사용하면 macOS에서 완전한 GUI 지원과 함께 ROS를 실행할 수 있다. 이 접근법은 시스템을 수정하지 않고도 깔끔한 개발 환경을 마련할 수 있게 한다.