상세 컨텐츠

본문 제목

Docker에서 vnc구현하기

환경/linux

by nosungmin 2023. 10. 28. 16:56

본문

Docker 컨테이너에서 VNC를 구현하기위해 아래의 과정을 진행한다.

  • docker container
docker run -it \
    --privileged \
    --gpus all \
    --net=host \
    -e NVIDIA_DRIVER_CAPABILITIES=all \
    -e __GLX_VENDOR_LIBRARY_NAME=nvidia \
    -e DISPLAY=:9 \
    -e QT_X11_NO_MITSHM=1 \
    -v /tmp/.X11-unix:/tmp/.X11-unix:rw \
    -v /etc/localtime:/etc/localtime:ro \
    -e TZ=Asia/Seoul \
    --name web_vnc \
    osrf/ros:melodic-desktop-full
  • vnc install(컨테이너에서 실행)
cd /root
git clone https://github.com/sdk17586/web_vnc_view.git
cd web_vnc_view
git submodule init && git submodule update


sudo apt-get update
udo apt install lsof
sudo apt-get install xauth
apt install -y xfce4 xfce4-goodies
./install_script.sh
  • /root/web_vnc_view/run_nopasswd.sh파일을 아래와 같이 수정하여준다.
#!/bin/bash

CURPATH=/root/web_vnc_view
PATH_NOVNC=$CURPATH/noVNC
NOVNC=$PATH_NOVNC/utils/novnc_proxy

if [ "$(lsof -ti:6080)" ]; then
    lsof -ti:6080 | xargs kill -9
fi

/opt/TurboVNC/bin/vncserver -kill :9
#/opt/TurboVNC/bin/vncserver :9 -wm /usr/bin/xfce4-session
/opt/TurboVNC/bin/vncserver :9 -wm /usr/bin/xfce4-session -SecurityTypes None -geometry 1280x720


if [ -f "$NOVNC" ]; then
    $NOVNC --vnc localhost:5909
else
    echo "Error: $NOVNC does not exist!"
fi
  • 실행
./run_nopasswd.sh #이 명령어로 vnc 실행
  • turbovnc가 살아있는지 확인
export PATH=$PATH:/opt/TurboVNC/bin/
vncserver -list

지금부터는 다른 DOCKER 컨테이너에서 출력한 GUI를 VNC서버를 올려놓은 DOCKER 컨테이너의 DISPALY에 출력시킬 수 있는 과정을 진행한다.

 

  • 아래의 명령어들을 사용하여 usr가 sudo 비밀번호 없이 sh를 실행할수있는 설정을 해준다.
# 아래의 명령어를 사용하면 편집기가 열린다.
sudo visudo

#아래의 코드를 적절한 위치에 추가하여준다.
rdv ALL=(ALL:ALL) NOPASSWD:ALL
  • rdv(usr)계정에 아래와 같은 디렉토리를 만들어준다.
# log가 저장될 docker_vnc 디렉토리 만들기
mkdir /home/rdv/docker_vnc
cd /home/rdv/docker_vnc
  • docker_vnc디렉토리에 docker_start.sh라는 파일을 만들어준다. 파일의 내용은 아래와 같다.
#!/bin/bash
# 파일의 이름은 docker_start.sh로 한다.
docker start web_vnc
  • docker_vnc디렉토리에 docker_vnc.sh 라는 파일을 만들어준다. 파일의 내용은 아래와 같다.
#!/bin/bash

# 컨테이너에서 xauth 리스트 가져오기
DOCKER_EXEC_RESULT=$(docker exec web_vnc xauth list 2>&1)

# :9로 끝나는 항목만 필터링
XAUTH_ENTRIES=$(echo "$DOCKER_EXEC_RESULT" | grep :9)

XAUTH_PATH=$(which xauth)

# rdv 사용자의 홈 디렉터리에서 .Xauthority 파일 경로
RDV_XAUTHORITY_PATH="/home/rdv/.Xauthority"

# XAUTH_ENTRIES의 각 줄을 처리
IFS=$'\n'
for line in $XAUTH_ENTRIES; do
    # 항목을 분해하여 변수에 저장
    DISPLAYNAME=$(echo $line | awk '{print $1}')
    PROTOCOLNAME=$(echo $line | awk '{print $2}')
    HEXKEY=$(echo $line | awk '{print $3}')

    # rdv 사용자에게 xauth 항목 추가
    ADD_RESULT=$(sudo -u rdv XAUTHORITY=$RDV_XAUTHORITY_PATH $XAUTH_PATH add $DISPLAYNAME $PROTOCOLNAME $HEXKEY 2>&1)
    if [ $? -eq 0 ]; then
        echo "Successfully added xauth entry for rdv user: $line"
    else
        echo "Failed to add xauth entry for rdv user: $line. Error: $ADD_RESULT"
    fi

    # root 사용자에게 xauth 항목 추가
    ADD_RESULT_ROOT=$(sudo XAUTHORITY=/root/.Xauthority $XAUTH_PATH add $DISPLAYNAME $PROTOCOLNAME $HEXKEY 2>&1)
    if [ $? -eq 0 ]; then
        echo "Successfully added xauth entry for root user: $line"
    else
        echo "Failed to add xauth entry for root user: $line. Error: $ADD_RESULT_ROOT"
    fi
done

export DISPLAY=:9

xhost +
  • host의 root계정에서 pc의 부팅시 자동 실행되게 하기 위하여 crontab을 사용하여준다.
$ crontab -e


#아래의 코드를 추가하여준다.
@reboot /bin/bash /home/rdv/docker_vnc/docker_start.sh
@reboot /usr/bin/docker exec web_vnc /root/web_vnc_view/run_nopasswd.sh
@reboot /bin/sleep 20; /bin/bash /home/rdv/docker_vnc/docker_vnc.sh

 

 

이제 pc가 부팅되면 web_vnc 컨테이너에서 vnc서버가 자동으로 실행되고 다른 컨테이너에서 출력한 gui를 vnc의 display에서 출력 가능하다!

'환경 > linux' 카테고리의 다른 글

자주 설치하는 환경들  (0) 2023.09.20
bash shell 기본  (0) 2023.02.15
linux 기본 명령어  (0) 2023.02.15

관련글 더보기