본문 바로가기

개발 이야기/리눅스 개발

도커(Docker)에서 GUI프로그램 사용하기

728x90

도커 설치 후 리눅스배포판을 컨테이너로 올린 후에

여기서 GUI 프로그램을 돌려야 할 때가 있는데

이 경우 아래 링크들에서 자세히 잘 나와 있습니다.

 

:=> https://moordev.tistory.com/173

:=> https://driz2le.tistory.com/257

 

이중 첫번째의

    원문을 복붙하면, 아래와 같습니다.

"""

Docker란 프로그램을 들어보신적이 있으실겁니다. 이놈의 정제가 뭐냐하면 특정 리눅스 컨테이너를 만들고 필요에 따라서 가상화하여 올렸다 내렸다 하는 총체적인 솔루션입니다.

 

기본적으로 lxc를 이용하고 있고 여기에 관리용 hub를 덧붙여서 이용하고 있습니다. VirtualBox나 VMware의 저수준 가상화가 아닌 일종의 Sandbox가상화입니다.

 

한번 컨테이너를 만들어 놓으면 해당 컨테이너를 쓰다가 그냥 컨테이너를 내리는 것으로 초기화를 한번에 할 수 있어서 편합니다. 그리고 Sandbox가상화이기 때문에 성능상 손해가 없다고 봐야 합니다.

 

그런데 이런건 보통 서버에서 필요한 것인데 데스크탑인 우분투에서 대체 어떤 용도로 이 녀석이 필요한 것일까요?

 

여러가지가 있지만 대표적인 몇가지만 알려드리겠습니다.

 

우분투에서 소스 컴파일을 통해 설치를 하려고 하면 이것저것 패키지를 많이 설치해야하고 설치후에도 이것 저것 쓰레기가 많이 남습니다. 그리고 컴파일한 패키지를 배포하려고 해도 우분투의 버전이 좀 많습니까? 각각의 배포판에 맞게 패키징을 해야하는데 그럼 각각의 버전을 또 설치해야합니다. 이걸 하나하나 한다고 생각해보세요. 미쳐 돌아갈 지경입니다.

 

또 다른 것으로는 바이너리 형태로 배포되는 프로그램 중에서 특정 배포판만을 지원하는 경우가 있습니다. 지금은 억지로나마 설치를 하지만 어쨌건 삽질하면서 설치하는 한글2008이나 Redhat 계열만을 지원하는 Abacus, 혹은 우분투와 페도라만을 지원하는 구글 크롬등이 있습니다. 이런 경우에는 해당 배포판을 설치해야하지만 Docker를 이용해서 해당 프로그램을 설치한다면 아무런 문제없이 설치를 할 수 있게 됩니다.

 

하지만 이런 Docker사용시 한가지 문제가 있는데 GUI 프로그램을 쓰려면 Xorg가 호스트에서 실행되고 있어야 한다는 것입니다. 당연하다면 당연한 이야기입니다.

 

하지만 컨테이너에서는 Xorg가 없어도 됩니다. 호스트의 Xorg가 모든 것을 대신해 주거든요. 그 말은 호스트의 자원을 이용할 수 있다는 의미입니다.

 

docker를 설치하고 설정하고 컨테이너를 빌드하는 것은 다른 곳에 더 좋은 내용이 많기 때문에 이 부분은 넘어가고 저는 컨테이너에 설치된 GUI프로그램을 실행하는 방법에 대해 알려드리겠습니다.

 

docker의 컨테이너를 실행할 때 대부분 여러분들은 이 명령으로 시작할 겁니다.

 

sudo docker run ~~ /bin/bash

 

그런데 GUI를 하시려면 여기에 몇가지가 더 들어가야 합니다.

 

sudo docker run --rm -it -v /run/user/1000:/run/user/1000 -v /dev:/dev -v /tmp/.X11-unix:/tmp/.X11-unix:ro --privileged --ipc=host --shm-size=256m --net=host -e DISPLAY=$DISPLAY -e XDG_RUNTIME_DIR=/run/user/1000 /bin/bash

 

이렇게 하시면 pid 1000으로 Docker가 실행되면서 X가 함께 실행이 되고 256m의 공유메모리가 함께 만들어지며 쉘로 bash가 실행되게 됩니다.

 

그럼 바로 GUI 프로그램의 명령을 내려볼까요? firefox같은 것이 좋겠네요.

 

그럼 데스크탑을 못 찾는다면서 에러가 날 겁니다.

 

호스트에서도 한가지 더 설정을 해야 하거든요. 호스트 컴퓨터에서 터미널을 열고 다음 명령을 내리도록 합시다.

 

xhost +local:docker

 

이렇게 하면 docker로 실행되는 프로그램이 호스트의 X를 통해서 실행이 되게 됩니다. 이제 한번 다시 컨테이너에서 명령을 내려보세요. 컨테이너의 설정에 맞춰서 프로그램이 실행될겁니다. 자그마치 호스트 프로그램과 함께 말이지요!

 

복잡하게 움직이기는 했지만 생각보단 쉽지 않나요? 이렇게 사용하시면 Docker의 프로그램에서 어떤짓을 하더라도 깔끔하게 다시 돌아올 수 있답니다. 참 쉽죠?

 

P.S 우분투에서 Docker 설치는 굉장히 쉽습니다.

sudo apt-get update
sudo apt-get install docker.io
sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker 

Windows에서 설치하려들면 미쳐돌아가는 반면 우분투는 리눅스라 Docker가 굉장히 쉽지요. 책에서보면 몇 페이지에 걸쳐서 설명하던데 Docker는 역시 리눅스에서 돌리는 것이 가장 좋습니다.

 

P.S-2 Docker가 굉장히 유용한 배포판으로 Arch와 FreeBSD가 있습니다. Arch는 롤링릴리즈 특성상 구버전 설치가 힘든데 구버전을 길게 지원하는 Debian이나 Ubuntu LTS를 Docker에 올려놓고 해당 배포판용 프로그램을 사용하는 경우가 많다고 합니다. FreeBSD는 Linux가 아닌 BSD이므로 Linux전용 프로그램을 요구할 때 사용한다고 합니다.

 

P.S-3 호스트의 X를 사용하는 것으로 굉장한 강점이 있는데 컨테이너에서 그래픽가속도 됩니다. 보통 가상화는 오버헤드가 많은데 이쪽은 오버헤드 자체가 없습니다.

"""

 

이중 두번째 링크의

    원문을 복붙하면, 아래와 같습니다.

"""

docker container에서 GUI 애플리케이션을 수행할 필요가 있는 경우가 많다.

이를테면 vscode를 실행시킨다던지, 심심하니까 xeyes를 실행시켜 놓는다던지..

아래 설명한 방법을 사용하면 docker container가 무엇이든 X windows와 연동하여 GUI 애플리케이션 수행이 가능하다.

참고로 여기서는 테스트를 위해서 ubuntu를 container로 설치하여 설명한다.

( 참고로 저의 경우 tensorflow와 pytorch docker container에서 vscode를 주로 호출해서 사용합니다.

  OS로 사용하는 ubuntu에 기본 외에 다른 것을 설치하기를 싫어하기 때문이며

  개발환경은 가급적 docker 내에 구성하려고 애쓰는 편입니다. )

 

□ docker container에서 GUI 환경 사용

docker 환경에서 GUI application을 사용하는 것을 테스트 하기 위해 ubuntu 환경을 설치한다.

$ docker pull ubuntu


docker container를 X windows와 연동할 수 있도록 옵션을 붙여서 수행한다.

$ docker run -it -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY --name ubuntu1 ubuntu

 

위에서 -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY 옵션은 핵심이다.

또한 --name ubuntu1에서 ubuntu1은 작성 예일 뿐이며 당연히 사용자가 원하는 이름으로 정하면 된다.

 

참고로 exit로 빠져나왔을 경우

$ docker start utuntu1

$ docker attach ubuntu1

 

□ 연동 확인 테스트

docker의 ubuntu1 컨테이너를 실행시킨 후 

X windows 연동 테스트를 위해서 xeyes를 사용하고 xeyes 설치를 위해 x11-apps를 설치한다.

$ apt-get update

$ apt-get install x11-apps

 

xeyes를 실행하면 보통은 아래처럼 오류가 나온다.

$ xeyes

No protocol specified
Error: Can't open display: :1

docker container가 아닌 외부에서 다른 터미널을 하나 띄우고 아래와 같이 수행한다.

docker user가 실행하는 모든 프로그램을 X windows와 통신하게 해준다.

$ xhost +local:docker

 

해제하려면 다음과 같이 수행한다.

$ xhost -local:docker

 

docker user 외에도 아래처럼 X windows를 로그인한 user로 설정해도 된다.
xhost +local:$USER
xhost -local:$USER

"""

 

 

(사족1)

더 좋은 정보를 공유하도록 저에게 힘을 실어 보내주세요.

그런 의미에서 커피 한잔 사주실래요 ^^

=> https://www.buymeacoffee.com/openbini

 

 

 

그럼,

    공유합니다.  https://freenanum.github.io/Market/