docker로 데스크톱 환경 (GUI) 을 구축해 보십시오.

12155 단어 LinuxDocker

개시하다


Arch Linux를 사용하지만 Ubuntu를 만지고 싶을 때가 거의 없습니다.Virtual Box에서는 운영체제 설치 작업, 부팅 중지 지연, 메모리 압박 등에 신경을 쓴다.그래서 나는 docker로 데스크톱 환경을 구축하는 방법을 모색했다.

문장의 중정에 실려 있다Dockerfile.

Xephyr


docker에서 GUI를 사용하는 방법은 여러 가지가 있는데, 호스트는 리눅스이며, 호스트의 X 서버로 쉽게 그릴 수 있다.Xephyr는 X 응용 프로그램으로 실행되는 중첩된 X 서버입니다.
ubuntuapt install xserver-xephyr라면archlinuxpacman -S xorg-server-xephyr를 설치할 수 있습니다.
가변 창Xephyr -resizeable :1에서 번호 1을 표시하는 X 서버를 시작합니다.
이미지를 만들거나 컨테이너를 시작할 때 환경 변수를 사용하여 표시 번호를 지정합니다.-e DISPLAY=:1 ENV DISPLAY=:1

소리


사운드 출력은 호스트의 pulse audio 서버를 사용합니다.컨테이너를 시작할 때 호스트의 플러그인 파일을 공유합니다.쿠키 기반 인증을 하고 있기 때문에 그것도 미리 공유합니다.-v /run/user/$UID/pulse/native:/tmp/pulse/native -v $HOME/.config/pulse/cookie:/tmp/pulse/cookie환경 변수를 사용하여 path를 지정합니다.
ENV PULSE_SERVER=unix:/tmp/pulse/native \
    PULSE_COOKIE=/tmp/pulse/cookie

시간대


tzdata를 설치할 때 시간대에 물어보면 빌딩이 멈추므로 aptinstall을 설치하기 전에 실행export DEBIAN_FRONTEND=noninteractive합니다.ENV TZ=Asia/Tokyo에 지정됩니다.

일본어 입력

ENV GTK_IM_MODULE=fcitx \
    QT_IM_MODULE=fcitx \
    XMODIFIERS=@im=fcitx \
    DefalutIMModule=fcitx
시작할 때 데스크톱 환경이나 창 관리자 설정 파일에서 실행할 명령을 지정합니다.jwm의 상황은 다음과 같다.
~/.jwmrc
<JWM>
  ...
  <StartupCommand>
    fcitx-autostart
    fcitx-imlist -e fcitx-keyboard-jp
    fcitx-imlist -s fcitx-keyboard-jp,mozc,fcitx-keyboard-us
  </StartupCommand>
  ...
</JWM>

사용자 작성


UID 호스트에 맞는 UID입니다.사운드를 내보낼 때 사용할 쿠키를 참조할 수 있도록 합니다.--build-arg DOCKER_UID=$(id -u)
ARG DOCKER_USER=docker
ARG DOCKER_UID=1000
ARG DOCKER_PASSWORD=docker
RUN useradd -m --uid ${DOCKER_UID} --groups sudo --shell /bin/bash ${DOCKER_USER} \
      && echo ${DOCKER_USER}:${DOCKER_PASSWORD} | chpasswd

데스크톱 환경

  • 데스크톱 환경을 명시하지만 데스크톱 환경을 설치하지 않습니다.jwm라는 겹쳐쓰기 창 관리자를 설치합니다.jwm에는 작업 표시줄이 있어 파일을 쉽게 식별할 수 있고 가볍습니다.화면을 클릭하면menu가 표시됩니다.
  • 주의: 키 바인딩이 중복될 때 호스트가 우선입니다.ctrl과shift를 동시에 누르면 키 연결과 마우스 커서의 역할 범위는 jwm (끼워넣기 X 서버) 에만 한정됩니다.
  • Dockerfile

    FROM ubuntu:latest
    
    # 使っていない値を指定する
    ENV DISPLAY=:1
    
    # ミラーの変更
    RUN sed -i '[email protected]@ftp.jaist.ac.jp/pub/Linux@' \
          /etc/apt/sources.list
    
    RUN export DEBIAN_FRONTEND=noninteractive \
        && apt update \
        && apt install -y x11-xserver-utils \
                          xinit \
                          tzdata \
                          language-pack-ja-base \
                          language-pack-ja \
                          sudo \
                          jwm \
                          lxterminal \
                          alsa-utils \
                          pulseaudio \
                          fonts-ipafont-gothic \
                          dbus-x11 \
                          fcitx-mozc \
                          fcitx-imlist \
                          vim-gtk3 \
                          libcurl4 \
                          epiphany-browser \
                          curl \
                          feh
    
    RUN curl -O https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb \
          && apt install -y ./google-chrome-stable_current_amd64.deb \
          && rm google-chrome-stable_current_amd64.deb
    # 音
    ENV PULSE_SERVER=unix:/tmp/pulse/native \
        PULSE_COOKIE=/tmp/pulse/cookie
    
    # 日本語
    RUN locale-gen ja_JP.UTF-8
    ENV LANG=ja_JP.UTF-8
    
    # タイムゾーン
    ENV TZ=Asia/Tokyo
    
    # 日本語入力
    ENV GTK_IM_MODULE=fcitx \
        QT_IM_MODULE=fcitx \
        XMODIFIERS=@im=fcitx \
        DefalutIMModule=fcitx
    
    # docker内で使うユーザを作成する。
    # ホストと同じUIDにする。
    # ホストのpulseaudioのcookieを触るときに、permision deniedにならない。
    ARG DOCKER_UID=1000
    ARG DOCKER_USER=docker
    ARG DOCKER_PASSWORD=docker
    RUN useradd -m \
      --uid ${DOCKER_UID} --groups sudo --shell /bin/bash ${DOCKER_USER} \
      && echo ${DOCKER_USER}:${DOCKER_PASSWORD} | chpasswd
    
    WORKDIR /home/${DOCKER_USER}
    
    # jwm(window manager), lxterminal(terminal), bashの設定
    RUN curl -L \
      https://raw.githubusercontent.com/atsuya0/dotfiles/master/etc/jwmrc \
      -o ./.jwmrc \
      && mkdir -p ./.config/lxterminal \
      && curl -L \
      https://raw.githubusercontent.com/atsuya0/dotfiles/master/terminal/lxterminal/lxterminal.conf \
      -o ./.config/lxterminal/lxterminal.conf \
      && curl -L \
      https://raw.githubusercontent.com/atsuya0/dotfiles/master/etc/bashrc \
      -o ./.bashrc
    
    RUN chown -R ${DOCKER_USER} ./
    
    USER ${DOCKER_USER}
    
    CMD jwm
    

    설치할 패키지 목록


    패키지 이름
    개요
    x11-xserver-utils
    X window system (GUI)
    xinit
    X window system (GUI)
    tzdata
    TimeZone
    language-pack-ja-base
    일본어
    language-pack-ja
    일본어
    sudo
    jwm
    가벼운 스택형 windowmanger
    lxterminal
    단말기
    alsa-utils
    소리
    pulseaudio
    소리
    fonts-ipafont-gothic
    일본어 글꼴
    dbus-x11
    X 클라이언트 통신.일본어를 입력할 때 필요한 것.
    fcitx-mozc
    일본어 입력
    fcitx-imlist
    명령을 사용하여 fcitx에 필요한
    vim-gtk3
    편집기
    libcurl4
    브라우저 종속성 패키지
    epiphany-browser
    브라우저
    curl
    파일 다운로드
    deb 파일에 구글-chrome가 설치되어 있지만 정상적으로 작동할 수 없습니다.

    생성/시작


    arg를 지정하지 않으면 uid=1000,user=docker,password=docker가 됩니다.
    
    docker build \
        -t ubuntu-jwm \
        --build-arg DOCKER_UID=$(id -u) \
        --build-arg DOCKER_USER='ユーザ名' \
        --build-arg DOCKER_PASSWORD='パスワード' .
    
    환경 변수 DISPLAY를 :1로 설정한 경우 Xephyr -resizeable :1를 실행한 후 docker run을 실행합니다.
    
    docker run \
        -v /tmp/.X11-unix/:/tmp/.X11-unix/ \
        -v /run/user/$UID/pulse/native:/tmp/pulse/native \
        -v $HOME/.config/pulse/cookie:/tmp/pulse/cookie \
        -it --rm ubuntu-jwm
    

    docker의 시작을 가볍게 하다


    docker를 시작하라는 명령을 내릴 때마다 고생이 많아서 함수를 씁니다.
    
    function jwm() {
      docker info &> /dev/null \
        || { echo 'Is the docker daemon running?'; return; }
      local -r display=1
      [[ -e "/tmp/.X11-unix/X${display}" ]] \
        || Xephyr -wr -resizeable ":${display}" &> /dev/null &
      docker run \
        -v /tmp/.X11-unix/:/tmp/.X11-unix/ \
        -v /run/user/$UID/pulse/native:/tmp/pulse/native \
        -v $HOME/.config/pulse/cookie:/tmp/pulse/cookie \
        -it --rm ubuntu-jwm &> /dev/null
      pkill Xephyr
    }
    

    좋은 웹페이지 즐겨찾기