docker

Docker로 화면 띄우기 (Mac/Win)

J-Mook 2021. 8. 27. 15:27
반응형

도커는 기본적으로 터미상에서 작동하기 때문에 기본상태에서는 시각화 요소들을 띄울 수가없다. 그래서 Xserver의 도움을 받아 Xscreen에 시각화요소들을 띄우게 되는데, 여타 다른 정보에서는 불필요한 정보가 너무 많아 이곳에 필요한 정보만을 최대한 간단하게 설명할것이다.

For Mac

(모든 명령어는 맥 터미널에서 실행 되었습니다.)

1. 프로그램 설치

설치하는데 시간이 걸릴 수 있느니 설치를 시작해 놓고 설명을 읽어보자.

brew install xquartz
brew install socat

도커를 시각화 하기위해 위 두가지가 필요한데 각각의 역할은 다음과 같다.

  • xquartz (Xserver) - xquartz는 맥에서 작동하는 X Window System의 일종으로, X Window System란 Unix 계열의 os에서 비트맵 화면을 띄워는 시스템을 말한다. 쉽게말해 일종의 가상 모니터라고 생각할 수 있다.
     
  • socat - socat은 두개의 데이터 채널을 연결해주는 중계기 역할로, UNIX, IP4, UDP, TCP 등 다양한 통신규격을 지원하는데, 여기에서는 도커에서 출력하는 TCP통신을 받아 xquartz가 받고있는 unix client로 전달해 주는 역할을 수행하게된다.

 

xquartz security 설정 - xquartz의 설치가 끝나면 환경설정(⌘ + ,)에 들어가 다음과 같이 '네트워크 클라이언트에서의 연결을 허용' 항목을 체크한다.

 

2. socat & xquartz 세팅

새로 터미널창을 열어 아래의 코드로 socat을 실행시켜주고, xquartz는 설치된 아이콘을 눌러 실행 시킨다. (띄어쓰기 주의)
(xquartz 먼저 실행하면 socat[3563] E bind(5, {LEN=0 AF=2 0.0.0.0:6000}, 16): Address already in use 에러가 나타난다.)

socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"

3. 실행 테스트 & docker container 생성

위의 환경이 세팅되었으면, 재대로 화면이 띄워지는지 테스트가 필요하다.
아래의 코드로 확인 해 볼수있는데, DISPLAY=X.X.X.X:0 해당 아이피주소는 ifconfig를 입력해 직접 이더넷 아이피를 확인 한 후 해당아이피를 입력해 주면된다.

docker run --rm -e DISPLAY=X.X.X.X:0 -p 6006:6006 gns3/xeyes

위의 코드를 실행하여 정상적으로 작동한다면, 아래의 눈이 나타나 마우스 포인터를 따라다닌다.

정상적으로 작동하는 것을 확인했으면, 실제 사용할 컨테이너를 만들어준다.

docker run -it --privileged --net=host --name={컨테이너 이름} -e DISPLAY=X.X.X.X:0 -p 8888:8888 -p 6006:6006 {docker image} /bin/bash

우분투 18.04 환경의 컨테이너를 만들어 주었다. (기타 다양한 옵션들은 https://docs.docker.com/engine/reference/commandline/run/ 페이지를 참고할 수 있다.)

 

ROS 설치 후 정상적으로 rqt가 띄워지는 모습

필자는 macbook air m1 환경에서 작업 하였는데, 이 경우 그래픽 드라이버를 사용하는 rviz나 gazebo의 사용이 제한되었다.

IP 변경

혹여나 컨테이너의 ip를 바꿔야하는 경우가 발생 할 수도있다. 필자는 랜선과 테더링을 번갈아 가면서 사용하는데, 두 방식이 서로 다른 ip를 할당받기 때문에 변경해야하는 상황이 발생하였다. 이 경우, 환경변수에 다음과 같은 구문을 추가한 후 적용하면 정상적으로 화면을 출력 시킬 수 있다.

export DISPLAY=X.X.X.X

For Windows

(모든 명령어는 Winodws Power Shell에서 실행 되었습니다.)

1. 프로그램 설치

mobaXterm을 실행하면 나오는 DISPLAY 아이피로 아래 코드의 'DISPLAY=X.X.X.X:0'를 설정하면 된다.

image

docker run --rm -e DISPLAY=X.X.X.X:0 -p 6006:6006 gns3/xeyes

위의 코드를 실행하여 정상적으로 작동한다면, 아래의 눈이 나타나 마우스 포인터를 따라다닌다.

2. docker 컨테이너

위의 테스트를 통해 잘작동하는 ip를 똑같이 적용하여 컨테이너를 만든다.

docker run -it --name={컨테이너 이름} -e DISPLAY=X.X.X.X:0 -p 6006:6006 {docker image}

마치며

위의 방법으로 만들어진 컨테이너에 재 접속하는 방법은 다른 컨테이너들과 같이,

docker exec -it {컨테이너 이름} bash

를 사용하면된다.

반응형

'docker' 카테고리의 다른 글

docker에서 ubuntu + ros 이미지 세팅하기  (0) 2021.08.31