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
Leave a Reply