Docker에서 sudo와 함께 사용할 데스크톱 환경 만들기(XRDP 편)

2019/9/23 추기
이 보도의 내용을 바탕으로 한 그림이 docker hub에 로그인되었습니다.
아래 표시가 있습니다.pull을 사용하십시오.
  • ubuntu16.04_ja : Ubuntu16.04 베이스(xrdp/Dockerfile.ubuntu16.04)
  • ubuntu18.04_ja : Ubuntu18.04 베이스(xrdp/Dockerfile.ubuntu18.04)
  • ubuntu18.04-pulseaudio_ja: 사운드 전송이 가능한 Ubuntu18.04 베이스(xrdp/Dockerfile.ubuntu18.04_pulseaudio)
  • Doke rfile 등은 GiitHub을 참조하십시오.
    https://github.com/yama07/docker-ubuntu-lxde/tree/master/xrdp
    또 이 기사 자체의 내용은 다소 낡았지만 그대로 남아 있다.
    다음 기사의 속편.
    Docker에서 컨테이너를 지정하고 실행 가능한 사용자로 시작

    개시하다


    이전 기사 Docker 컨테이너에 있는 CUI의 쾌적한 환경을 구축했다.
    이번에는 GUI의 편안한 환경을 구축하겠습니다.
    여기서 말하는 편안함은 다음과 같은 조건을 만족시키는 환경을 가리킨다.(언제나 내겐 편해.)
  • uid/gid를 지정하여 시작할 수 있습니다.(컨테이너 <-> 호스트 간 파일 공유가 용이함)
  • sudo를 사용할 수 있습니다.(포장 추가 가능)
  • 한 마디로 하면 포장에 살짝 넣고 데이터를 가공해 보세요. 필요하지 않으면 환경을 버려서 데스크톱 환경에서도 쉽게 할 수 있어요.

    데스크톱 환경은 Docker+XRDP+XLDE로 구성됩니다.
    원격 데스크탑으로 XRDP를 선택한 이유는 다음과 같습니다.
  • 클라이언트 소프트웨어를 추가로 설치할 필요가 없음(Windows 주로 사용)
  • VNC 동작보다 더 바삭바삭
  • 또 기분이 좋으면'VNC 편'도 쓸 생각이다.

    배경.


    최근 안드로이드 앱을 개발하면서 회사에서 제공하는 노트북으로 안드로이드 스튜디오를 시작하기가 힘들어졌다
    각양각색의 부하 감소 설정을 시도했지만 모바일 메일 애플리케이션과 안드로이드스튜디오를 동시에 이용하는 상태에서 메모리 사용률이 90%를 넘어 전체적인 움직임이 흐릿했다.
    그리고 최근에는 부화면에 안드로이드 스튜디오를 띄우면 화면이 보이지 않는 현상이 나타나기 시작했다.
    다행히도 개인 노트북 외에도 해당 설정 공유 서버를 제공해 포장을 마음대로 추가할 수는 없지만 docker를 사용할 수 있다.
    이런 이유로 컨테이너 안에 데스크톱 환경을 만들고 손 옆에 있는 노트북으로 접근하는 곳으로 왔다.
    또 이 글은 일반적인 데스크톱 환경 구축을 썼기 때문에 안드로이드 스튜디오 설치를 쓰지 않았다.
    (마음에 걸리거나 필요하면 기사를 쓸 수도 있다.)

    Docker 호스트 환경

    $ cat /etc/lsb-release 
    DISTRIB_ID=Ubuntu
    DISTRIB_RELEASE=16.04
    DISTRIB_CODENAME=xenial
    DISTRIB_DESCRIPTION="Ubuntu 16.04.2 LTS"
    
    $ docker --version
    Docker version 1.13.1, build 092cba3
    

    Docker 이미지 만드는 법


    Docker file 같은 거.


    Doke rfile과 endpoint 두 개의 조개 스크립트로 구성되어 있습니다.
    Dockerfile
    FROM ubuntu:16.10
    
    RUN apt-get update \
        && DEBIAN_FRONTEND=noninteractive apt-get install -y \
          lxde \
          xrdp \
          ibus \
          ibus-mozc \
          language-pack-ja-base \
          language-pack-ja \
          fonts-ipafont-gothic \
          fonts-ipafont-mincho \
        && apt-get clean \
        && rm -rf /var/cache/apt/archives/* \
        && rm -rf /var/lib/apt/lists/*
    
    # RDPのポートを公開する
    EXPOSE 3389
    
    RUN echo "startlxde" > /etc/skel/.xsession
    
    # 日本語ロケールを設定する
    RUN cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \
        && echo 'Asia/Tokyo' > /etc/timezone
    RUN locale-gen ja_JP.UTF-8 \
        && echo 'LC_ALL=ja_JP.UTF-8' > /etc/default/locale \
        && echo 'LANG=ja_JP.UTF-8' >> /etc/default/locale
    ENV LANG=ja_JP.UTF-8 \
        LANGUAGE=ja_JP:ja \
        LC_ALL=ja_JP.UTF-8
    
    # デフォルトのユーザ名とパスワード
    ENV DEFAULT_USER=developer \
        DEFAULT_PASSWD=xrdppasswd
    
    # sudoを使用できるようにする
    RUN echo "ALL ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/ALL
    
    # 一般ユーザがユーザ/グループを追加できるようにする
    RUN chmod u+s /usr/sbin/useradd \
        && chmod u+s /usr/sbin/groupadd
    
    # XRDPのendpointスクリプトを配置する
    COPY endpoint.sh /opt/
    RUN chmod +x /opt/endpoint.sh
    CMD ["/opt/endpoint.sh"]
    
    endpoint.sh
    #!/bin/bash -e
    
    USER_ID=$(id -u)
    GROUP_ID=$(id -g)
    PASSWD=${PASSWD:-${DEFAULT_PASSWD}}
    USER=${USER:-${DEFAULT_USER}}
    
    # グループを作成する
    echo "GROUP_ID: $GROUP_ID"
    if [ x"$GROUP_ID" != x"0" ]; then
        groupadd -g $GROUP_ID $USER
    fi
    
    # ユーザを作成する
    echo "USER_ID: $USER_ID"
    if [ x"$USER_ID" != x"0" ]; then
        export HOME=/home/$USER
        useradd -d ${HOME} -m -s /bin/bash -u $USER_ID -g $GROUP_ID $USER
    fi
    
    # パーミッションを元に戻す
    sudo chmod u-s /usr/sbin/useradd
    sudo chmod u-s /usr/sbin/groupadd
    
    # ログインユーザ名を設定する
    USER=$(whoami)
    echo "USER: $USER"
    
    # ログインパスワードを設定する
    echo "PASSWD: $PASSWD"
    echo ${USER}:${PASSWD} | sudo chpasswd
    
    [ ! -e ${HOME}/.xsession ] && cp /etc/skel/.xsession ${HOME}/.xsession
    
    echo "#############################"
    
    # XRDPサーバを起動する
    sudo bash -c "/etc/init.d/xrdp start && tail -F /var/log/xrdp-sesman.log"
    
    하는 일은 이전 기사 쓴 것과 기본적으로 같다.
    xrdp와 lxde의 설치와 일본어 환경 설정이 추가되었습니다.
    16.10 기반 이미지로 우분투:14.04, 16.04도 사용 가능.그러나 Ubuntu:16.04 이전에 xrdp는 v0이었다.6이므로 일본어 키보드 레이아웃이 지원되지 않습니다. 키보드 변경여기.을 참조하십시오.또한 Ubuntu:16.10의 xrdp는 v0입니다.9인 만큼 추가 절차 없이 일본어 키보드를 사용할 수 있다.
    xrdp의 설정은 보시다시피 기본 상태입니다.
    취향에 따라 xrdp 서버의 설정을 하십시오. (xrdp.ini와sesman.ini에 기술되어 있습니다.)

    docker build


    일반 진행docker build.
    ## Dockerfileを作成
    $ vi Dockerfile
    
    ## endpointスクリプトを作成
    $ vi endpoint.sh
    
    
    $ docker build -t lxde_xrdp:ubuntu16.10_ja .
    

    Docker 컨테이너 사용 방법


    docker run


    XRDP 서버를 시작하는 컨테이너입니다.
    $ docker run --rm -it \
        --privileged \
        -p 3389:3389 \
        -u $(id -u):$(id -g) \
        -e USER=yama \
        -e PASSWD=yamapasswd \
        lxde_xrdp:ubuntu16.10_ja
    
    옵션은 다음과 같습니다.
  • -p port:3389고객이 접속한 포트를 port로 설정하십시오.
  • -u user:group부트 컨테이너의 UIDuser를 GIDgroup로 설정하십시오.
    지정하지 않으면 루트 사용자(UID=0, GID=0)로 시작합니다.
    또한 루트 사용자로서 시작할 때 일본어 입력(mozc)을 사용할 수 없습니다.
  • -e USER=loginUserRDP 기반 로그인 사용자를 loginUser로 설정하십시오.
    지정하지 않으면 '개발자' 가 됩니다.단, 루트 사용자로서 컨테이너를 시작할 때 '루트' 입니다.
  • -e PASSWD=loginPasswdRDP의 로그인 암호를 loginPasswd로 설정하십시오.
    지정하지 않으면 "xrdppasswd"입니다.
  • --privileged 동작 환경에 따라 옵션이 필요하지 않습니다.
    mozc에서 "엔진 프로그램 변환에 실패했습니다."오류가 발생했을 때 이 옵션을 선택하십시오.

    클라이언트에서 연결


    Windows를 사용할 때 제공된 원격 데스크탑이 있으면 클라이언트 소프트웨어를 설치할 필요가 없습니다.
    Mac의 경우'Microsoft Remote Desktop', Linux의 경우'FreerDP','rdesktop','Remmina'등의 연결을 사용하십시오.
    연결 방법은 원격 데스크톱 클라이언트를 시작하여 Docker 호스트의 IP와 docker run에 설정된 연결 포트, 로그인 사용자/비밀번호를 사용하여 로그인하는 것이다.
    용기를 시작할 때 사용자/비밀번호의 정보는 다음과 같이 출력되며 거기에서도 확인할 수 있습니다.-d 옵션 실행 배경은 docker logs에서 확인할 수 있습니다.
    $ docker run ...オプション省略...
    
    GROUP_ID: 1000
    USER_ID: 1000
    USER: yama
    PASSWD: yamapasswd
    #############################
     * Starting Remote Desktop Protocol server 
    ...
    
    로그인에 성공하면 "Nosession for pid(프로세스 ID)"및 오류 대화 상자가 나타날 수 있지만 아무 문제가 없을 것 같으니 "OK"를 클릭하십시오.(현재 동작에 문제가 없기 때문에 원인을 깊이 조사하지 않았습니다.

    또한 클립보드 관리 소프트웨어 "Clippit"에 히스토리 스토리지가 활성화되어 있는지 묻습니다.
    "히스토리 데이터는 암호처럼 민감한 데이터라도 명문으로 저장할 수 있을까요?"이렇게 말해.괜찮으시다면 "Yes"를 클릭하세요.

    용도


    배경에서도 서술한 바와 같이 개인 개발 환경으로 사용할 수 있다.
    또 갑자기 개발자를 늘릴 때도 Docker 이미지를 사용해 바로 개발 환경을 제공할 수 있다.
    이번 Docker의 이미지는 통용되기 때문에 그렇게 하면 할 수 있는 일은 한계가 있다.따라서 별도의 포장이 설치된 이미지를 제작할 필요가 있다고 본다.저는 이번 이미지를 기본 이미지(Docker fileFROM로 JDK와 안드로이드 스튜디오 등 개발에 필요한 소프트웨어를 설치한 이미지를 제작해 사용하고 있습니다.

    기타


    Docker 호스트 버전 정보

    Docker version 17.06.0-ce와 Ubuntu:16.10(호스트 OS가 아닌 기본 이미지)의 조합은 내가 준비한 검증 환경에서 실행되지 않습니다.XRDP 서버를 시작하는 동안 오류가 발생했습니다.
    IPv6 주변의 설정이 맞지 않는 것 같습니다. Docker 호스트의 설정에 따라 순조롭게 작동할 수 있습니다.
    제가 평소에 사용하는 서버가 Docker version 1.13.1라서 너무 번거로워서 깊이 조사하지 못했습니다.
    또한 xrdp의 버전은 v0입니다.6의 ubuntu:14.04 또는 ubuntu:16.04라면 Docker version 17.06.0-ce라도 일할 수 있습니다.

    제가 평소에 쓰는 방법.


    아래와 같이 용기를 시작할 때-v에 옵션을 부여하고 메인 디렉터리를 마운트해서 사용합니다.
    $ docker run --rm -it \
        --privileged \
        -p 3389:3389 \
        -u $(id -u):$(id -g) \
        -e USER=yama \
        -e PASSWD=yamapasswd \
        -v ${HOME}/container_home:/home/yama \
        lxde_xrdp:ubuntu16.10
    
    컨테이너 내의 데스크톱 환경에서는 대부분의 개인 설정이 홈 디렉토리에 저장되므로 홈 디렉토리를 마운트하면 컨테이너를 닫거나 시작해도 개인 설정이 그대로 유지됩니다.
    또한 용기 안에서 오래 지속되는 데이터도 메인 디렉터리 아래에 놓으려면 용기를 멈추는 것도 문제없고 호스트와의 데이터 교환도 편리하다.
    물론 호스트의 uid/gid를 계승했기 때문에 파일 권한 때문에 파일/디렉터리를 삭제할 수 없는 문제도 없습니다.

    좋은 웹페이지 즐겨찾기