docker 내부에서 GUI, GL 프로그램 실행

docker 내부에서 GUI 프로그램을 실행해야 할 경우, 다음과 같이 설정합니다.

먼저 host 머신에서 docker가 x윈도우에 접근 가능하도록 권한을 설정합니다.

$ xhost +local:docker

다음으로 docker 컨테이너를 실행할 때, 다음과 같이 옵션을 추가합니다.

$ docker run --rm -it --runtime nvidia -e DISPLAY -e NVIDIA_DRIVER_CAPABILITIES=all -e NVIDIA_VISIBLE_DEVICES=all -v /tmp/.X11-unix:/tmp/.X11-unix ubuntu  

옵션을 설명하면

  • -e DISPLAY : GUI가 출력될 DISPLAY 환경변수 전달
  • -e NVIDIA_DRIVER_CAPABILITIES=all : NVIDIA 드라이버 관련 라이브러리, 바이너리를 Docker 내부에 마운트 하기
  • -e NVIDIA_VISIBLE _DEVICES=all : Docker 내부에서 사용할 GPU 설정
  • -v /tmp/.X11-unix:/tmp/.X11-unix : X윈도우를 사용하기 위한 소켓 연결

위와 같이 옵션을 설정하고 실행 후, 내부에서 GUI 프로그램을 설치하고 실행하면 됨.

$ docker run --rm -it -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY --runtime nvidia -e NVIDIA_DRIVER_CAPABILITIES=all -e NVIDIA_VISIBLE_DEVICES=all ubuntu
root@92913cdca2a1:/# glxgears
Running synchronized to the vertical refresh.  The framerate should be
approximately the same as the monitor refresh rate.

그외 gtk 관련 프로그램도 정상적으로 실행되는 것을 확인할 수 있습니다.


삽질 기록

1) 위 -e NVIDIA_DRIVER_CAPABILITIES=all -e NVIDIA_VISIBLE_DEVICES=all 옵션을 사용하지 않는 경우, 다음과 같은 에러가 발생하고 실행이 되지 않음.

X Error of failed request:  BadShmSeg (invalid shared segment parameter)
  Major opcode of failed request:  130 (MIT-SHM)
  Minor opcode of failed request:  3 (X_ShmPutImage)
  Segment id in failed request:  0x2e00005
  Serial number of failed request:  54
  Current serial number in output stream:  55

2) Host 머신에서 권한 설정을 해주지 않으면, 실행 불가

Authorization required, but no authorization protocol specified
cannot open display: :1


참고링크: https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/user-guide.html


Comments

Leave a Reply

Your email address will not be published. Required fields are marked *