Docker 컨테이너에서 VNC를 구현하기위해 아래의 과정을 진행한다.
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
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
#!/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 실행
export PATH=$PATH:/opt/TurboVNC/bin/
vncserver -list
지금부터는 다른 DOCKER 컨테이너에서 출력한 GUI를 VNC서버를 올려놓은 DOCKER 컨테이너의 DISPALY에 출력시킬 수 있는 과정을 진행한다.
# 아래의 명령어를 사용하면 편집기가 열린다.
sudo visudo
#아래의 코드를 적절한 위치에 추가하여준다.
rdv ALL=(ALL:ALL) NOPASSWD:ALL
# log가 저장될 docker_vnc 디렉토리 만들기
mkdir /home/rdv/docker_vnc
cd /home/rdv/docker_vnc
#!/bin/bash
# 파일의 이름은 docker_start.sh로 한다.
docker start web_vnc
#!/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 +
$ 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에서 출력 가능하다!
자주 설치하는 환경들 (0) | 2023.09.20 |
---|---|
bash shell 기본 (0) | 2023.02.15 |
linux 기본 명령어 (0) | 2023.02.15 |