【Docker】Ubuntuコンテナで公式GUIデスクトップ起動する手順

Ubuntuの公式デスクトップ起動とアクセスまでをDockerで実施したのでまとめました。
今回のDockerコンテナは公式イメージから実施していますが、コンテナ起動時に実行する「/sbin/init」を動かないので、「/sbin/init」が使えるように、公式イメージをカスタマイズしたものを使用します。

Ubuntu公式のGUIデスクトップまでは立ち上がり、アクセスまで確認はしていますが、一度ログアウト、コンテナ再起動をしてしまうとうまく動かなくなってしまうので、検証用として使うようにしてください。

問題なく使えるようになれば再度ご報告します。

「Dokcer」Ubuntu公式イメージでGUIデスクトップを起動・接続するまでの手順

Dockerではコンテナに対して色々と制限がかかっています。
今回のUbuntuで言うと「systemctl」がデフォルトでは動きません。

「systemctl」はUbuntuデスクトップを起動する際に、リモート接続として、「xrdp」をインストールします、その際、systemctlコマンドを実行して起動します。
このコマンドが使用できないと、デスクトップを起動してもアクセスができない状態となってしまいます。

そのため、「docker run」コマンド実行時に「privileged」オプションを付与し、「/sbin/init」を実行することで制限が外れ、「systemctl」が使用できるようになります。

「/sbin/init」で起動する手順は以下のページも参考にしてください。

Ubuntu公式イメージでDockerコンテナを起動(/bin/bash)

Ubuntu公式イメージそのままでは「/sbin/bash」は動かないのでまずは通常にコンテナを起動します。

以下では起動時に「privileged」オプションを使用し、ssh(22)、リモートデスクトップ(3389)、VNC(5901)の各ポートでアクセスできるようにし、実行します。

$ docker run -itd --privileged -p 3222:22 -p 13389:3389 -p 5901:5901 --name ubuntu --hostname ubuntu:latest  ubuntu
6a77e56ccb22a872923106af7fe3a4c698cdb857954e79272def334fea1452d1

Ubuntuコンテナ起動後、以下のように正常に起動ができたことを確認します。

$ docker ps
CONTAINER ID   IMAGE                        COMMAND        CREATED          STATUS         PORTS                                                                   NAMES
6a77e56ccb22   ubuntu                       "/bin/bash"    13 seconds ago   Up 8 seconds   0.0.0.0:5901->5901/tcp, 0.0.0.0:3222->22/tcp, 0.0.0.0:13389->3389/tcp   ubuntu

Dockerコンテナ起動後、Ubuntuコンテナにアクセスします。

$ docker exec -it ubuntu /bin/bash
root@ubuntu:latest:/# 

Ubuntuコンテナアクセス後、以下コマンドを実行すると「PID1」が「/bin/bash」で使われていることが確認できます。
これが原因で「/sbin/bash」が使用できず、「suystemctl」が使えない状態となってしまいます。

root@25ea4973ebfb:/# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1   3744  2916 pts/0    Ss+  02:30   0:00 /bin/bash
root         9  0.1  0.1   3744  2964 pts/1    Ss   02:30   0:00 /bin/bash
root        17  0.0  0.1   5472  2232 pts/1    R+   02:30   0:00 ps -aux

「Dockekr」Ubuntuコンテナをカスタマイズする

次にこのUbuntuコンテナがsystemctlを使えるようにコンテナに必要となるパッケージをインストールします。

事前のUbuntuアップデートを実施

root@ubuntu:latest:/# apt -y update
root@ubuntu:latest:/# apt -y upgrade

「/sbin/init」が使えるように「init」をインストールし、「systemctl」もインストールしておきます。

root@ubuntu:latest:/# apt-get install -y init
root@ubuntu:latest:/# apt-get install systemd

ちなみに事前に以下のリモートデスクトップツール「xrdp」と、Ubuntu公式デスクトップをインストールしといたほうが後々楽かもです。
※動作確認はまだしていないです。

root@ubuntu-test:/# apt-get -y install xrdp
root@ubuntu-test:/# apt-get -y install ubuntu-desktop

上記インストール完了をコンテナからログアウトします。

root@ubuntu:latest:/# exit

カスタマイズしたUbuntuコンテナから新規にイメージを作成する

次に上記でカスタマイズしたコンテナイメージから新しいイメージを作成します。
以下、コマンドで対象のコンテナイメージの「CONTAINER ID」を確認します。

$ docker ps      
CONTAINER ID   IMAGE                        COMMAND        CREATED         STATUS         PORTS                                                                   NAMES
6a77e56ccb22   ubuntu                       "/bin/bash"    6 minutes ago   Up 6 minutes   0.0.0.0:5901->5901/tcp, 0.0.0.0:3222->22/tcp, 0.0.0.0:13389->3389/tcp   ubuntu

「docker commit」コマンドで対象のコンテナから、新規にDockerイメージを作成します。

$ docker commit  6a77e56ccb22 ubuntu-test:test 
sha256:1800d0ff0c096c93149a71538f9a53d44607f1888dafb726c21da5e2df71b3c7

以下コマンドで、新しくDockerイメージが作成されて居ることを確認します。

$ docker images
REPOSITORY            TAG       IMAGE ID       CREATED        SIZE
ubuntu-test           test      4788f4c27c45   7 days ago     194MB
ubuntu                16.04     1f93e87bc68f   3 weeks ago    119MB

作成した、Dockerイメージから新規にUbuntuコンテナを起動します。
ここで、カスタマイズしたイメージには「init」パッケージをインストールしているので「/sbin/init」コマンドで起動することができます。

$ docker run -itd --privileged -p 3222:22 -p 13389:3389 -p 5901:5901 --name ubuntu-test --hostname ubuntu-test  ubuntu-test:test /sbin/init 
7386e5d47ad4247450b95b36ec26db35847b885c551800d62d7186f74756a0df

Ubuntuコンテナ起動後、コンテナにアクセスし、「ps -aux」コマンドでPID1が「/sbin/init」で起動していることが確認できます。

root@ubuntu-test:/# ps -aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.5 167660 10248 ?        Ss   May08   0:12 /sbin/init
root          23  0.0  0.6  45384 12612 ?        S<s  May08   0:00 /lib/systemd/systemd-journald
systemd+      37  0.0  0.4  20968  8468 ?        Ss   May08   0:00 /lib/systemd/systemd-resolved
systemd+      38  0.0  0.3  89944  6192 ?        Ssl  May08   0:03 /lib/systemd/systemd-timesyncd
message+      41  0.0  0.2   8592  4564 ?        Ss   May08   0:09 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --sys
root          43  0.0  0.8  26092 16308 ?        Ss   May08   0:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
root          45  0.0  0.3  16032  6212 ?        Ss   May08   0:04 /lib/systemd/systemd-logind
root          48  0.0  0.0   2348  1412 tty1     Ss+  May08   0:00 /sbin/agetty -o -p -- \u --noclear tty1 linux
root          54  0.0  0.1   3876  3088 pts/1    Ss   May08   0:00 /bin/bash
root       20219  0.0  0.2 232944  6012 ?        Ssl  May08   0:00 /usr/lib/policykit-1/polkitd --no-debug
root       22485  0.0  0.1   6408  2700 pts/1    R+   11:23   0:00 ps -aux

カスタムイメージ作成前に以下パッケージをインストールしていない場合は、起動後インストールしておきましょう。

root@ubuntu-test:/# apt-get -y install xrdp
root@ubuntu-test:/# apt-get -y install ubuntu-desktop

「Docker」公式のUbuntuデスクトップへアクセス

上記起動後、実際にUbuntuコンテナへリモートデスクトップでアクセスします。
リモートデスクトップのアクセスは「localhost:13389」でアクセスします。
※以下はMacOSからのアクセスです。

アクセス後、以下のように「Welcome」画面が表示されるので、手順にしたがって進みます。

公式のUbuntuデスクトップが表示されます。

インターネットの確認も問題なくできました。

DockerでUbuntuの公式デスクトップを起動・アクセスする方法は以上となります。




エンジニアのオンライン学習

ITエンジニアにおすすめの教材、オンラインスクールです。
無料からエンジニアの学習ができる教材などまとめているので参考にしてください。

おすすめオンライン教材
自宅で学習ができるオンラインスクール

ITエンジニアの開発・検証・学習としてインターネット上で専用のサーバ(VPS)を利用しましょう!
実務経験はVPSで学べます。



コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

ABOUT US
げんき☆ひろき
インターネット関連のSEをやっています。 ネットワーク、サーバー、ストレージ、仮想基盤まで幅広く手を出しており、MVNOの構築経験もあります。 現在は、Pythonを使ったプログラミングの開発をしネットワークの自動化ツールを作成しています! Pythonの入門書も作成しているので、ぜひ参考にしてください!