Docker에 VNC 설치


Ubuntu Image 다운로드 및 실행

  • --net=host 를 옵션에 꼭 넣어줘야 외부포트 접속이 가능하다.
docker run -it --net=host --name ubuntu-desktop ubuntu:22.04 /bin/bash

컨테이너 접속 명령어

  • 만약 컨테이너에서 나왔다면 아래 명령어로 다시 들어갈 수 있다.
docker exec -it ubuntu-desktop bash

Install Dependencies

  • 컨테이너 안으로 들어왔다면 아래 명령어들을 터미널에 실행 및 설치해준다
export DEBIAN_FRONTEND=noninteractive

apt-get update
apt-get install -y sudo vim wget curl dbus-x11 \
    openssh-server tightvncserver \
    xfce4 xfce4-goodies xtermr

사용자 계정만들기

  • Root계정으로 GUI를 사용하면 문제가 발생할 수 있으니 사용자를 만든다.
# 사용자 생성 (비밀번호: YOUR_PASSWORD_HERE 를 원하는 걸로 수정 - 아래 명령어는 1)
useradd -m -s /bin/bash dockeruser
echo 'dockeruser:1' | chpasswd
echo 'dockeruser ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/dockeruser
chmod 0440 /etc/sudoers.d/dockeruser

# root 상태에서 실행
chown -R dockeruser:dockeruser /home/dockeruser

SSH 서버 설정(Optional)

mkdir /var/run/sshd

# SSH 포트를 2022로 변경
sed -i 's/#Port 22/Port 2022/' /etc/ssh/sshd_config
sed -i 's/Port 22/Port 2022/' /etc/ssh/sshd_config

# 비밀번호 인증 허용 및 루트 로그인 제한
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config
echo "PermitRootLogin no" >> /etc/ssh/sshd_config

# SSH 서비스 시작
service ssh start
  • 접속방법
ssh dockeruser@localhost -p 2022

VNC Server 환경설정

# 사용자로 전환
su - dockeruser

# VNC 비밀번호 설정 (명령어 입력 후 8자 이내 비밀번호 설정하세요)
vncserver
# 설정을 위해 서버 잠시 종료
vncserver -kill :1

# 설정 파일 수정 (기존 내용 삭제 후 GUI 로드 스크립트 삽입)
cat <<EOT > ~/.vnc/xstartup
#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r \$HOME/.Xresources ] && xrdb \$HOME/.Xresources

# XFCE4 실행
startxfce4 &
EOT

# 실행 권한 부여
chmod +x ~/.vnc/xstartup

VNC 서버 실행


su - dockeruser
vncserver :2 -geometry 1280x800 -depth 24

VNC Viewer(Client) 접속

  • Remmina를 사용하여 VNC로 바꾸고 아래 주소를 입력한다.
  • 또는 VNC Viewer를 키고 아래 명령어를 입력하여 접속한다.
localhost:5902

VNC에 브라우저 설치

  • docker에서 켜진 GUI는 브라우저 실행이 불가하다.
sudo apt-get update
sudo apt-get install -y software-properties-common

# 2. Chromium 전용 PPA 추가 (애플리케이션 저장소)
sudo add-apt-repository -y ppa:xtradeb/apps
sudo apt-get update

# 3. Chromium 설치
sudo apt-get install -y chromium

# 실행
sudo chromium --no-sandbox

# Chromium 설정 수정
sudo sed -i 's|CHROME_EXE_PATH "$@"|CHROME_EXE_PATH "--no-sandbox" "$@"|g' /usr/bin/X11/chromium
  • root 계정으로 아래 명령어 실행
exit
service dbus start
  • dockeruser로 아래 명령어 실행
su - dockeruser

# 1. 화면 변수 강제 지정 (VNC가 :1번이면 :1, :2번이면 :2)
export DISPLAY=:2

# 2. 브라우저 실행 (sudo 사용X)
chromium --no-sandbox

Direct 접속: PC1 → Server PC + Docker

  • MAC + AnyDesk → Server + Docker의 상황이라면 애니데스크로 또 서버의 화면을 보기 불편하다.
  • 같은 망에 있다면 맥에서 다이렉트로 서버의 도커 화면을 볼 수 있다.
  • 아래처럼 설정해준다.

SSH 터널링으로 맥과 서버와 포트연결(5902번 포트사용)

  • 만약 VNC가 3번이면 5903번 사용해야함
ssh -L 5902:localhost:5902 -p 22 jj@192.168.0.210
  • 서버 PC에서 아래명령어로 테이블확인
# 5902 포트로 들어오는 패킷이 DROP 되고 있는지 확인
sudo iptables -L INPUT -n | grep 5902

만약 아무것도 안 나오거나 DROP이라고 되어 있다면, 아래 명령어로 강제로 길을 여세요:
sudo iptables -I INPUT -p tcp --dport 5902 -j ACCEPT
  • 맥에서 VNC Viewer로 바로 접속
localhost:5902

오류 해결

한글깨짐이 있다면

apt-get install -y fonts-nanum fonts-nanum-coding fonts-nanum-extra