この記事で行うこと
以前書いた記事 Dockerで開発用デスクトップ環境(GUI)を構築する の続きです。Laradockのworkspaceにリモートデスクトップで入ってデスクトップ環境(GUI)を使えるようにします。
※ Laradockとは
DockerでLaravelを動かすためのプロジェクトです。私はまだLaravelを使う予定がないにも関わらず、開発用にLaradockを使わせていただいております。Laravel以外の機能もてんこ盛りで、開発初期に手っ取り早く開発環境を構築するには便利です。
※ Laradock環境構築で参考にしたページ(感謝します)
環境構築
導入
Laradockのダウンロード
cd ~
mkdir work
cd work
git clone https://github.com/laradock/laradock.git
Docker環境の設定
cd laradock
cp env-example .env
workspaceのベースイメージをビルド(ソフトウェアをバージョンアップするため)
ここで、インストールされるソフトウェア(PHP、workspaceのOS)のバージョンを調査する。記事に記載したのは執筆時点のバージョンです。
workspaceのベースイメージのバージョンを調べる:
grep FROM ~/work/laradock/workspace/Dockerfile
FROM letsdockerize/laradock-workspace:2.4-${LARADOCK_PHP_VERSION}
grep LARADOCK_PHP_VERSION ~/work/laradock/docker-compose.yml
- LARADOCK_PHP_VERSION=${PHP_VERSION}
- LARADOCK_PHP_VERSION=${PHP_VERSION}
grep PHP_VERSION ~/work/laradock/.env
PHP_VERSION=7.2
以上の情報から、PHPのバージョンは7.2、workspaceのベースイメージのバージョンは以下の通り。
FROM letsdockerize/laradock-workspace:2.4-7.2
ところが https://hub.docker.com/r/letsdockerize/laradock-workspace/tags を見ると「2.4-7.3」があるので、.envファイルのPHP_VERSIONを7.3に設定する等して、PHPを最新バージョンに上げられると期待できる。workspaceのベースイメージの候補は以下の通り。
FROM letsdockerize/laradock-workspace:2.4-7.3
この候補イメージのOSのバージョンを調べる。
docker run letsdockerize/laradock-workspace:2.4-7.3 cat /etc/issue
Ubuntu 16.04.6 LTS \n \l
バージョン調査の後始末。
docker rmi -f letsdockerize/laradock-workspace:2.4-7.3
LinuxのバージョンはUbuntu 16.04だった。workspaceにリモートデスクトップで入るには、Ubuntu 18.04の方が良いので、この候補をそのまま使わず、Ubuntuのバージョンを上げる。workspaceのベースイメージをgit cloneして、
cd ~/work
git clone https://github.com/LaraDock/workspace
cd workspace
cp Dockerfile-73 Dockerfile
workspaceのベースイメージのベースイメージ(ややこしい)を調査。
grep FROM Dockerfile
FROM phusion/baseimage:latest
workspaceのベースイメージのベースイメージのOSのバージョンを確認する。
docker run phusion/baseimage:latest cat /etc/issue
Ubuntu 16.04.3 LTS \n \l
調査の後始末。
docker rmi -f phusion/baseimage:latest
もし、より新しいphusion/baseimageがあれば、そのOSのバージョンを調べてみる。phusion/baseimageの情報:https://hub.docker.com/r/phusion/baseimage/tags
masterがlatestよりも新しいので、OSのバージョンを確認する。
docker run phusion/baseimage:master cat /etc/issue
Ubuntu 18.04.1 LTS \n \l
Ubuntu 18.04なので、これをworkspaceのベースイメージのベースイメージにする。phusion/baseimage:masterはベータ版っぽい?今回構築するのは開発環境なので、ベータ版でも良しとする。workspaceのベースイメージのDockerファイルを編集:
( ~/work/workspace/Dockerfile )
# workspaceのベースイメージのベースイメージをUbuntu 16.04 → 18.04のものに変更
- FROM phusion/baseimage:latest
+ FROM phusion/baseimage:master
workspaceのベースイメージをビルドする。イメージ名は「local/laradock-workspace:2.4-7.3」にした。
cd ~/work/workspace
docker build -t local/laradock-workspace:2.4-7.3 .
オリジナルworkspace(workspace_org)をビルド
workspaceのベースイメージがビルドできたら、workspaceをビルドする。ただし名前をworkspace_orgに変更した。理由は、workspaceにデスクトップの機能を追加したいので、オリジナルのworkspaceをworkspace_orgに名前変更して、新たなworkspaceのベースイメージにするため。
cd ~/work/laradock
mv workspace workspace_org
mkdir workspace_desktop
.envファイルを以下のように編集する。
( ~/work/laradock/.env )
# コンテナ内に作られるlaradockユーザのuidとgidを、ホスト側のユーザに合わせると良い
- WORKSPACE_PUID=1000
- WORKSPACE_PGID=1000
+ WORKSPACE_PUID=[id -uの値]
+ WORKSPACE_PGID=[id -gの値]
- PHP_WORKER_PUID=1000
- PHP_WORKER_PGID=1000
+ PHP_WORKER_PUID=[id -uの値]
+ PHP_WORKER_PGID=[id -gの値]
# PHPを最新バージョンにする
- PHP_VERSION=7.2
+ PHP_VERSION=7.3
workspace_orgのDockerfileを以下のように編集。
( ~/work/laradock/workspace_org/Dockerfile )
# workspaceのベースイメージをUbuntu 18.04ベースのものに変更
- FROM letsdockerize/laradock-workspace:2.4-${LARADOCK_PHP_VERSION}
+ FROM local/laradock-workspace:2.4-${LARADOCK_PHP_VERSION}
# Set Environment Variables
ENV DEBIAN_FRONTEND noninteractive
+
+ # proxy経由でインターネットに接続している場合、ビルドを通すために環境変数の設定が必要。proxy経由でなければ不要。
+ ENV http_proxy='http://proxy:8080' \
+ https_proxy='http://proxy:8080' \
+ no_proxy='127.0.0.1,localhost'
# pgsql clientの行入れ替え(Ubuntu 18.04では、これをしないとビルドエラーになった)
- && add-apt-repository "deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main" \
- && wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \
+ && wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \
+ && add-apt-repository "deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main" \
docker-compose.ymlを以下のように編集。
( ~/work/laradock/docker-compose.yml )
- ### Workspace Utilities ##################################
- workspace:
- build:
- context: ./workspace
+ ### Workspace Utilities (desktop) ##################################
+ workspace:
+ build:
+ context: ./workspace_desktop
+ volumes:
+ - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}${APP_CODE_CONTAINER_FLAG}
+ #- ${DATA_PATH_HOST}/home:/home
+ extra_hosts:
+ - "dockerhost:${DOCKER_HOST_IP}"
+ ports:
+ - "${WORKSPACE_SSH_PORT}:22"
+ - "3389:3389"
+ # RDPのポートを公開する
+ expose:
+ - "3389"
+ tty: true
+ environment:
+ - PHP_IDE_CONFIG=${PHP_IDE_CONFIG}
+ - DOCKER_HOST=tcp://docker-in-docker:2375
+ networks:
+ - frontend
+ - backend
+ links:
+ - docker-in-docker
+ # XRDPサーバを起動する
+ command: >
+ sudo bash -c "[ -e /var/run/xrdp/xrdp.pid ] && rm /var/run/xrdp/xrdp.pid ;
+ /etc/init.d/xrdp restart && tail -F /var/log/xrdp-sesman.log"
+
+ ### Workspace Utilities (org) ##################################
+ workspace_org:
+ build:
+ context: ./workspace_org
workspace_orgをビルドする。
cd ~/work/laradock
docker-compose build workspace_org
ビルドできたら、試しにworkspace_orgを立ち上げてみる。以下を1行ずつ実行。
docker-compose up -d workspace_org
docker-compose ps
docker-compose exec --user=laradock workspace_org bash
php -v
cat /etc/issue
exit
docker-compose down -v
以下のように表示され、PHPとUbuntuのバージョンが上がっているのが確認できた。
$ docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------------
laradock_docker-in-docker_1 dockerd-entrypoint.sh Up 2375/tcp
laradock_workspace_org_1 /sbin/my_init Up 0.0.0.0:2222->22/tcp
/var/www$ php -v
PHP 7.3.3-1+ubuntu18.04.1+deb.sury.org+1 (cli) (built: Mar 7 2019 20:31:49) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.3, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.3.3-1+ubuntu18.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies
/var/www$ cat /etc/issue
Ubuntu 18.04.2 LTS \n \l
オリジナルworkspceをベースイメージにして、デスクトップworkspace(workspace_desktop)をビルド
次に、workspace_orgをベースイメージにして、デスクトップ機能を追加したworkspaceをビルドする。新規Dockerfileを編集。
( ~/work/laradock/workspace_desktop/Dockerfile )
FROM laradock_workspace_org
ARG PASSWD=laradock
# xrdp、lxde、日本語環境等をインストール
RUN apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y \
sudo \
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/*
RUN echo "startlxde" > /etc/skel/.xsession
# リモートデスクトップのログイン用に、laradockユーザのパスワードを設定する
RUN echo laradock:${PASSWD} | sudo chpasswd
# sudoを使用できるようにする
RUN echo "ALL ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/ALL
# 日本語ロケールを設定する
RUN locale-gen ja_JP.UTF-8
ENV LANGUAGE=ja_JP:ja \
LC_ALL=ja_JP.UTF-8 \
LC_CTYPE=ja_JP.UTF-8 \
LANG=ja_JP.UTF-8
RUN apt-get update \
&& apt-get install -y tzdata
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 'LC_CTYPE=ja_JP.UTF-8' > /etc/default/locale \
&& echo 'LANG=ja_JP.UTF-8' >> /etc/default/locale
workspaceをビルドする。
cd ~/work/laradock
docker-compose build workspace
workspaceを立ち上げる。
docker-compose up -d workspace
docker-compose ps
以下のように表示された。
Name Command State Ports
-------------------------------------------------------------------------------------------------------------------
laradock_docker-in-docker_1 dockerd-entrypoint.sh Up 2375/tcp
laradock_workspace_1 sudo bash -c [ -e /var/run ... Up 0.0.0.0:2222->22/tcp, 0.0.0.0:3389->3389/tcp
workspaceが正常に上がったか確認。
docker-compose logs workspace
以下のように表示された。
Attaching to laradock_workspace_1
workspace_1 | * Restarting Remote Desktop Protocol server xrdp-sesman[29]: (29)(140060462175552)[DEBUG] libscp initialized
workspace_1 |
workspace_1 | xrdp-sesman[29]: (29)(140060462175552)[DEBUG] Testing if xrdp-sesman can listen on 127.0.0.1 port 3350.
workspace_1 |
workspace_1 | xrdp-sesman[30]: (30)(140060462175552)[INFO ] starting xrdp-sesman with pid 30
workspace_1 |
workspace_1 | xrdp-sesman[29]: (29)(140060462175552)[DEBUG] Closed socket 4 (AF_INET6 ::ffff:127.0.0.1 port 3350)
workspace_1 |
workspace_1 | xrdp-sesman[30]: (30)(140060462175552)[INFO ] listening to port 3350 on 127.0.0.1
workspace_1 |
workspace_1 | [20190315-23:28:00] [DEBUG] Testing if xrdp can listen on 0.0.0.0 port 3389.
workspace_1 | [20190315-23:28:00] [DEBUG] Closed socket 6 (AF_INET6 :: port 3389)
workspace_1 | [ OK ]
workspace_1 | [20190315-23:28:00] [DEBUG] libscp initialized
workspace_1 | [20190315-23:28:00] [DEBUG] Testing if xrdp-sesman can listen on 127.0.0.1 port 3350.
workspace_1 | [20190315-23:28:00] [DEBUG] Closed socket 4 (AF_INET6 ::ffff:127.0.0.1 port 3350)
workspace_1 | [20190315-23:28:00] [INFO ] starting xrdp-sesman with pid 30
workspace_1 | [20190315-23:28:00] [INFO ] listening to port 3350 on 127.0.0.1
リモートデスクトップで入れるか、確認する。マイクロソフトリモートデスクトップの設定例:
Connection name container_laradock
PC name localhost
User name laradock
Password laradock
以上で、Laradockのワークスペースでデスクトップ環境(GUI)が使えるようになりました。
(オプション)デスクトップworkspaceをベースイメージにして、更に新たなworkspace(workspace_python)をビルド
このデスクトップworkspaceをベースイメージにして、更に機能を付け加えることも可能です。
例として、Pythonインストールを加えてみます。
新たなworkspaceを作る場合、そのベースイメージのコンテナは不要なので、落として消しておく。
cd ~/work/laradock
docker-compose down -v
workspaceをworkspace_desktopに名前変更。laradock_workspaceのIMAGE IDを調べて、
docker images
以下のように表示された。
REPOSITORY TAG IMAGE ID CREATED SIZE
laradock_workspace latest 9a03ce6de32f 14 minutes ago 2.43GB
laradock_workspace_org latest 97321b240e0b 33 minutes ago 901MB
(後略)
Dockerイメージの名前変更。
docker tag [laradock_workspaceのIMAGE ID] laradock_workspace_desktop
docker rmi laradock_workspace
docker images
以下のように、laradock_workspaceからlaradock_workspace_desktopに名前変更された。
REPOSITORY TAG IMAGE ID CREATED SIZE
laradock_workspace_desktop latest 9a03ce6de32f 18 minutes ago 2.43GB
laradock_workspace_org latest 97321b240e0b 36 minutes ago 901MB
(後略)
新workspace用ディレクトリを作成する。
mkdir workspace_python
docker-compose.ymlを以下のように編集する。
( ~/work/laradock/docker-compose.yml )
- ### Workspace Utilities (desktop) ##################################
- workspace:
+ ### Workspace Utilities (Python) ##################################
+ workspace:
+ build:
+ context: ./workspace_python
+ volumes:
+ - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}${APP_CODE_CONTAINER_FLAG}
+ #- ${DATA_PATH_HOST}/home/laradock:/home/laradock
+ extra_hosts:
+ - "dockerhost:${DOCKER_HOST_IP}"
+ ports:
+ - "${WORKSPACE_SSH_PORT}:22"
+ - "3389:3389"
+ # RDPのポートを公開する
+ expose:
+ - "3389"
+ tty: true
+ environment:
+ - PHP_IDE_CONFIG=${PHP_IDE_CONFIG}
+ - DOCKER_HOST=tcp://docker-in-docker:2375
+ networks:
+ - frontend
+ - backend
+ links:
+ - docker-in-docker
+ # XRDPサーバを起動する
+ command: >
+ sudo bash -c "[ -e /var/run/xrdp/xrdp.pid ] && rm /var/run/xrdp/xrdp.pid ;
+ /etc/init.d/xrdp restart && tail -F /var/log/xrdp-sesman.log"
+
+
+ ### Workspace Utilities (desktop) ##################################
+ workspace_desktop:
workspace_desktopをベースイメージにして、Pythonを追加したworkspaceをビルドする。新規Dockerfileの例は以下の通り。
※ VSCodeをインストールしているので、Laradlckのcodeというエイリアスをwwwに変更しています。
( ~/work/laradock/workspace_python/Dockerfile )
FROM laradock_workspace_desktop
RUN apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y \
curl \
wget \
git \
python3-distutils \
llvm \
sqlite3 \
libssl-dev \
libbz2-dev \
libreadline-dev \
libsqlite3-dev \
libncurses5-dev \
libncursesw5-dev \
python-tk \
python3-tk \
tk-dev \
aria2 \
ccache \
&& apt-get clean \
&& rm -rf /var/cache/apt/archives/* \
&& rm -rf /var/lib/apt/lists/*
USER laradock
ENV HOME="/home/laradock"
ENV PYENV_ROOT="/home/laradock/.anyenv/envs/pyenv" \
PYENV_SHELL="bash" \
PATH="$HOME/.local/bin:$HOME/.anyenv/envs/pyenv/shims:$HOME/.anyenv/envs/pyenv/bin:$HOME/.anyenv/bin:$HOME/.yarn/bin:$HOME/.yarn/bin:$HOME/.config/yarn/global/node_modules/.bin:$HOME/.nvm/versions/node/v11.11.0/bin:/var/www/vendor/bin:$HOME/.composer/vendor/bin:/sbin:/bin:/usr/bin:/usr/local/bin:/snap/bin"
RUN cd $HOME \
&& git clone https://github.com/riywo/anyenv $HOME/.anyenv \
&& echo '' >> $HOME/.bashrc \
&& echo '# anyenv' >> $HOME/.bashrc \
&& echo 'if [ -d $HOME/.anyenv ]' >> $HOME/.bashrc \
&& echo 'then' >> $HOME/.bashrc \
&& echo ' export PATH="$HOME/.anyenv/bin:$PATH"' >> $HOME/.bashrc \
&& echo ' eval "$(anyenv init -)"' >> $HOME/.bashrc \
&& echo 'fi' >> $HOME/.bashrc \
&& anyenv install --force-init \
&& mkdir -p $(anyenv root)/plugins \
&& git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update \
&& anyenv install pyenv \
&& git clone https://github.com/yyuu/pyenv-pip-rehash $(pyenv root)/plugins/pyenv-pip-rehash \
&& git clone https://github.com/yyuu/pyenv-virtualenv $(pyenv root)/plugins/pyenv-virtualenv \
&& git clone https://github.com/yyuu/pyenv-ccache $(pyenv root)/plugins/pyenv-ccache \
&& git clone https://github.com/massongit/pyenv-pip-update $(pyenv root)/plugins/pyenv-pip-update \
&& sudo groupadd developer \
&& sudo gpasswd --add $(whoami) developer
USER root
RUN sudo echo 'Defaults exempt_group="developer"' > /etc/sudoers.d/developer
USER laradock
RUN pyenv install 3.7.2 \
&& pyenv global 3.7.2 \
&& pyenv versions \
&& pip install --upgrade pip \
&& pip install --user pipenv \
&& echo '' >> $HOME/.bashrc \
&& echo '# pipenv' >> $HOME/.bashrc \
&& echo 'export PATH=$HOME/.local/bin:$PATH' >> $HOME/.bashrc
RUN mkdir -p $HOME/Downloads \
&& cd $HOME/Downloads \
&& wget https://download.jetbrains.com/python/pycharm-community-2018.3.3.tar.gz \
&& wget -O code-stable-1546901613.tar.gz https://go.microsoft.com/fwlink/?LinkID=620884 \
&& mkdir -p $HOME/opt \
&& cd $HOME/opt \
&& tar xf $HOME/Downloads/pycharm-community-2018.3.3.tar.gz \
&& tar xf $HOME/Downloads/code-stable-1546901613.tar.gz \
&& sed -i -e 's/ code=/ www=/g' $HOME/aliases.sh \
&& echo '' >> $HOME/.bashrc \
&& echo '# PyCharm' >> $HOME/.bashrc \
&& echo 'export PATH=$HOME/opt/pycharm-community-2018.3.3/bin:$PATH' >> $HOME/.bashrc \
&& echo '' >> $HOME/.bashrc \
&& echo '# VSCode' >> $HOME/.bashrc \
&& echo 'export PATH=$HOME/opt/VSCode-linux-x64/bin:$PATH' >> $HOME/.bashrc
workspaceをビルドする。
docker-compose build workspace
workspaceを立ち上げる。
docker-compose up -d workspace
docker-compose ps
以下のように表示された。
Name Command State Ports
-------------------------------------------------------------------------------------------------------------------
laradock_docker-in-docker_1 dockerd-entrypoint.sh Up 2375/tcp
laradock_workspace_1 sudo bash -c [ -e /var/run ... Up 0.0.0.0:2222->22/tcp, 0.0.0.0:3389->3389/tcp
workspaceが正常に上がったか確認する。
docker-compose logs workspace
以下のように表示された。
Attaching to laradock_workspace_1
workspace_1 | * Restarting Remote Desktop Protocol server xrdp-sesman[29]: (29)(140680654812480)[DEBUG] libscp initialized
workspace_1 |
workspace_1 | xrdp-sesman[29]: (29)(140680654812480)[DEBUG] Testing if xrdp-sesman can listen on 127.0.0.1 port 3350.
workspace_1 |
workspace_1 | xrdp-sesman[30]: (30)(140680654812480)[INFO ] starting xrdp-sesman with pid 30
workspace_1 |
workspace_1 | xrdp-sesman[29]: (29)(140680654812480)[DEBUG] Closed socket 4 (AF_INET6 ::ffff:127.0.0.1 port 3350)
workspace_1 |
workspace_1 | xrdp-sesman[30]: (30)(140680654812480)[INFO ] listening to port 3350 on 127.0.0.1
workspace_1 |
workspace_1 | [20190316-00:12:08] [DEBUG] Testing if xrdp can listen on 0.0.0.0 port 3389.
workspace_1 | [20190316-00:12:08] [DEBUG] Closed socket 6 (AF_INET6 :: port 3389)
workspace_1 | [ OK ]
workspace_1 | [20190316-00:12:08] [DEBUG] libscp initialized
workspace_1 | [20190316-00:12:08] [DEBUG] Testing if xrdp-sesman can listen on 127.0.0.1 port 3350.
workspace_1 | [20190316-00:12:08] [DEBUG] Closed socket 4 (AF_INET6 ::ffff:127.0.0.1 port 3350)
workspace_1 | [20190316-00:12:08] [INFO ] starting xrdp-sesman with pid 30
workspace_1 | [20190316-00:12:08] [INFO ] listening to port 3350 on 127.0.0.1
リモートデスクトップで入って、python3.7.2やpycharm.shやcodeが立ち上がるか確認する。
作業が終わってコンテナを落とす時:
cd ~/work/laradock
docker-compose stop
作業を再開する時:
cd ~/work/laradock
docker-compose up -d workspace
docker-compose ps