投げ銭

★当サイトへの投げ銭(PayPal)★

LINK


(無償、寄付歓迎) logo
世界中で使われるISO標準オフィスソフト(MSオフィス互換)

★LibreOfficeの導入事例★
詳細について

人気の投稿(1ヶ月間)

Ad

Ad

投げ銭

★当サイトへの投げ銭(PayPal)★

2018年8月25日土曜日

【Linux CentOS 7】Dockerコンテナ(CentOS7)にデスクトップ環境(MATE)を構築してVNCでリモート接続できるようにした【Docker-ce 18.06.1.ce】

<お知らせ>(2021年3月10日 更新)
新しい方法によるMATEデスクトップコンテナの構築手順を作成しました。
特権動作が不要だとわかりました。また日本語表示も可能になりました。
よろしければご覧ください。
 


<お知らせ>(2021年3月10日 更新)
前回のお知らせでは、VNC Serverが起動できなくなった旨を記載しておりますが、
2021年2月くらいに同じ手順で試した所、問題なく起動できることがわかりました。
VNC SERVERにおいてCentOS7システムとの間で生じていた問題が修正されたのだと思います。vnc起動スクリプトの内容に変更がありました。

ところで、上記お知らせに記載の通り、特権不要でMATEデスクトップの日本語環境の動作を確認できました。よろしければご覧ください。


<お知らせ>(2020年4月26日 更新)
この記事に載っている方法では、2020年4月26日現在で最新のCentOS 7では、正常にVNC Serverを起動できなくなりました。
あるいは以前正常動作していても、システムのアップデートで起動できなくなってしまうようです。

その場合、次のエラーが発生します。
does not belong to service, and PID file is not owned by root. Refusing

下記に、同様の問題についてレポートがされています。

・VNC Server Error: New main PID <PID> does not belong to service , 2019/10/17
< https://superuser.com/questions/1490985/vnc-server-error-new-main-pid-pid-does-not-belong-to-service > 2020年4月26日

・OL 7.7 systemd: New main PID xxxx does not belong to service... , 2019/08/17
< https://community.oracle.com/thread/4286364 > 2020年4月26日

・Bug 1583159 - Sample service file vncserver@.service is out of date with systemd changes , 2018/06/16
< https://bugzilla.redhat.com/show_bug.cgi?id=1583159 > 2020年4月26日



(警告)
ここで作成しているDockerコンテナは、信頼のおけるローカルネットワークのみで動作するホストで運用するものとして構築している。

ホスト上のいずれかのネットワークインターフェイスがインターネットに直接接している場合、このコンテナの運用はセキュリティの観点から非常に危険なので動作させてはいけない。
(インターネットに直に接している場合、Dockerのデフォルトではiptablesを書き換えて外部からのアクセスを許してしまうことになってしまうため厳禁である。)



DockerコンテナとしてCentOS7を走らせて、そこにデスクトップ環境を構築し、
外部マシンからネットワーク経由でリモートアクセスすることができた。

完成状態をイメージとして保管しておけば、いつでも綺麗な状態のデスクトップ環境を維持することができるはずだ。


■centos7イメージからコンテナを起動して、必要なパッケージを入れ込む

○ centos:centos7 イメージからコンテナを起動した。

5992ポートを、コンテナの5902ポートへ転送を行うようにした。
また、権限を与える必要があり、--privileged を設定している。
さらに、バックグラウンドで動作させるために、-d を指定している。

(インターネットに直に接している場合、Dockerのデフォルトではiptablesを書き換えて外部からのアクセスを許してしまうことになってしまうため厳禁である。)
# docker run --privileged -d -p 5992:5902 --name centos-mate centos:centos7 /sbin/init                                                             
Unable to find image 'centos:centos7' locally
centos7: Pulling from library/centos
Digest: sha256:6f6d986d425aeabdc3a02cb61c02abb2e78e57357e92417d6d58332856024faf
Status: Downloaded newer image for centos:centos7
cac12a3edabced1611ce19cecebe605a971c068b1bf9987c30fbf1bab881c176

○ docker ps の確認

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
cac12a3edabc        centos:centos7      "/sbin/init"        45 minutes ago      Up 45 minutes       0.0.0.0:5992->5902/tcp   centos-mate


○ コンテナにログイン

[root@localhost ~]# docker exec -it centos-mate /bin/bash                     
[root@cac12a3edabc /]#

以下では、コンテナ内での作業になっている。

○アップデート

[root@cac12a3edabc /]# yum update -y
Updated:
  audit-libs.x86_64 0:2.8.1-3.el7_5.1     centos-release.x86_64 0:7-5.1804.4.el7.centos    dracut.x86_64 0:033-535.el7_5.1       kpartx.x86_64 0:0.4.9-119.el7_5.1 
  libblkid.x86_64 0:2.23.2-52.el7_5.1     libmount.x86_64 0:2.23.2-52.el7_5.1              libuuid.x86_64 0:2.23.2-52.el7_5.1    systemd.x86_64 0:219-57.el7_5.1   
  systemd-libs.x86_64 0:219-57.el7_5.1    util-linux.x86_64 0:2.23.2-52.el7_5.1         

Complete!


○ X Window system 、デスクトップ環境 MATE、tigervnc-serverのインストール

回線やマシンの速度によっては非常に時間を要する。

[root@cac12a3edabc /]# yum groupinstall "X Window system"
Complete!
[root@cac12a3edabc /]# yum install epel-release
Complete!
[root@cac12a3edabc /]# yum groupinstall "MATE Desktop"
Complete!
[root@cac12a3edabc /]# yum install tigervnc-server
Complete!

○ コンテナのステータス(インストール前)
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
cac12a3edabc        centos-mate         0.00%               3.105MiB / 1.953GiB   0.16%               21.2MB / 353kB      14.4MB / 28.4MB     7

overlay           16G  2.3G   14G   15% /var/lib/docker/overlay2/6d8375eaf83cbba0c89279e2327fc1818ff5fcd2e56d64559dd91fd1b9b71877/merged
○ コンテナのステータス(インストール後)
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT    MEM %               NET I/O             BLOCK I/O           PIDS
cac12a3edabc        centos-mate         0.00%               4.43MiB / 1.953GiB   0.22%               826MB / 9.48MB      131MB / 461MB       8

overlay           16G  3.9G   12G   25% /var/lib/docker/overlay2/6d8375eaf83cbba0c89279e2327fc1818ff5fcd2e56d64559dd91fd1b9b71877/merged
インストールに伴って、データ量が増えていることが確認できた。



■(Dockerホスト上での作業)
ここで一旦、コンテナをイメージ化した。

○ 一旦このコンテナ内部からpoweroffコマンドでシャットダウンする。

[root@cac12a3edabc /]# poweroff


○ このコンテナが終了状態になったことを確認

docker ps -a


○ イメージ化を行う。

# docker commit cac12a3edabc centos-mate-installed
sha256:cf002071d9ac55431719165bdbd4a8426ae4a3c56cd67c28cc843da9c290a675
少々時間を要した。


■(Dockerホスト上での作業)
上記で作成したイメージからコンテナを実行し、設定作業継続

○ 作成したイメージからコンテナの起動

さきほど作成したイメージから、新しいコンテナを生成している。
(さきほどのコンテナは終了状態になっているままなので、不要であれば消しておく。)

(インターネットに直に接している場合、Dockerのデフォルトではiptablesを書き換えて外部からのアクセスを許してしまうことになってしまうため厳禁である。)
# docker run -m 3g --privileged -d -p 5992:5902 --name centos-mate-ready-to-run centos-mate-installed /sbin/init

(注意)-m 3g を指定して、メモリの最大サイズを3Gバイトにまで拡張しておくこと。
さもなければ、後に下記のようなエラーが発生して、vncserverを起動できなかった。
もちろん、ホスト上で空メモリが必要である。
# systemctl start vncserver@:2.service
Job for vncserver@:2.service failed because a configured resource limit was exceeded. See "systemctl status vncserver@:2.service" and "journalctl -xe" for details.

○ コンテナに接続

# docker exec -it centos-mate-ready-to-run /bin/bash
[root@fb18eead8af0 /]#

○ 実験のために、ファイアヲールを解除

(注意)
下記(1〜4)では、selinuxが無効になっていること、そして、実験のためにファイアーヲールを無効化している。
(安全な環境でなければ以下の設定はしてはいけない!)

1、selinuxがDisabledになっていることを確認

[root@fb18eead8af0 /]# getenforce
Disabled
2、firewalldをストップ

[root@fb18eead8af0 /]# systemctl stop firewalld

コンテナ起動の際に、firewalldが起動しないようにする。

[root@fb18eead8af0 /]# systemctl disable firewalld

3、iptablesをクリア

[root@fb18eead8af0 /]# iptables -F

4、パケットフィルタの状態の確認

INPUTやFORWAEDが、全てパスするようになった。

[root@fb18eead8af0 /]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination       
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination       
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

○テストユーザーの作成

ユーザ追加
[root@fb18eead8af0 /]# useradd user1

Linuxパスワードの設定
(なくてもリモートアクセスは可能だが、デスクトップ画面がロックすると解除できなくなる。)
[root@fb18eead8af0 /]# passwd user1

user1に切り替え
[root@fb18eead8af0 /]# su user1

vncリモート接続用のパスワードの設定
[user1@fb18eead8af0 /]$ vncpasswd 
Password: ←VNC接続用のパスワードを設定
Verify:
Would you like to enter a view-only password (y/n)? n
A view-only password is not used
[user1@fb18eead8af0 /]$ exit
[root@fb18eead8af0 /]#

○ Tiger-vnc-serverの設定

設定ファイルのコピーを行った。
vncserver@:2.service の「2」という数は、TCPポート5902に対応している。

[root@fb18eead8af0 /]# cp /lib/systemd/system/vncserver@.service /lib/systemd/system/vncserver@:2.service


設定ファイルの編集を行った。
[root@fb18eead8af0 /]# vi /lib/systemd/system/vncserver@:2.service
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target
[Service]
Type=forking
# Clean any existing files in /tmp/.X11-unix environment
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/sbin/runuser -l <USER> -c "/usr/bin/vncserver %i"
PIDFile=/home/<USER>/.vnc/%H%i.pid
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
[Install]
WantedBy=multi-user.target
次のようにして、<USER>部分に先程作成したテストユーザー名を入力する。
ExecStart=/usr/sbin/runuser -l user1 -c "/usr/bin/vncserver %i"
PIDFile=/home/user1/.vnc/%H%i.pid

リロード

[root@fb18eead8af0 /]# systemctl daemon-reload


必要があれば、enableにしておく。(vncが自動起動するようになる)

[root@fb18eead8af0 /]# systemctl enable vncserver@:2.service
Created symlink from /etc/systemd/system/multi-user.target.wants/vncserver@:2.service to /usr/lib/systemd/system/vncserver@:2.service.

一度だけ、vncserverを起動してから終了する。
これによって、ユーザー(user1)ディレクトリにファイルが生成される。

[root@fb18eead8af0 /]# systemctl start vncserver@:2.service
[root@fb18eead8af0 /]# systemctl stop vncserver@:2.service


ユーザー(user1)に関して設定を行う。

[root@fb18eead8af0 /]# su user1
[user1@fb18eead8af0 /]$ vi /home/user1/.vnc/xstartup
#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
#exec /etc/X11/xinit/xinitrc
exec mate-session &
exec /etc/X11/xinit/xinitrc をコメントアウトするのを忘れないこと。

[user1@fb18eead8af0 /]$ exit
[root@fb18eead8af0 /]#


■VNCSERVERを起動してリモートから開く

いよいよ起動して、リモートアクセスを試す。

○ Tiger-vnc-serverを起動

[root@fb18eead8af0 /]# systemctl start vncserver@:2.service

ここで、メモリ使用量が120MB程度上昇した。182.1MiB / 3GiB


○ 別マシンのVNCSERVERクライアント(Tiger vnc viewer)からアクセス

上記で設定してきた通り、次のTCPポートへ接続する。
DockerホストマシンのIPアドレス:5992
これによって、コンテナ起動オプションの通り、コンテナの5902ポートへ転送される。


下記のように、MATEデスクトップ環境をリモートマシンのVNC Viewerから利用できた。



○ホスト上のプロセス

ところで、firefoxを起動した後、ホストでtopを起動すると、次のようになった。

top - 14:34:06 up  1:27,  1 user,  load average: 1.25, 0.59, 0.30
Tasks: 159 total,   3 running, 156 sleeping,   0 stopped,   0 zombie
%Cpu(s): 38.6 us,  8.5 sy,  0.0 ni, 52.0 id,  0.0 wa,  0.0 hi,  0.5 si,  0.4 st
KiB Mem :  4142136 total,  1406240 free,   571912 used,  2163984 buff/cache
KiB Swap:  1952764 total,  1952764 free,        0 used.  3245720 avail Mem
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND   
 4613 user1     20   0 2099552 199736  63204 S  56.8  4.8   0:04.00 firefox   
 4681 user1     20   0 1612412  72452  38288 R  16.6  1.7   0:00.74 Web Content
 4091 user1     20   0  226176  46912  13104 S  16.3  1.1   0:33.31 Xvnc       
 4735 user1     20   0 1562372  44384  22976 S   7.3  1.1   0:00.22 Web Content
 4162 user1     20   0  452484  16800  10524 S   1.0  0.4   0:01.69 marco     
  944 root      20   0  515892  65240  24288 S   0.3  1.6   0:41.23 dockerd   
 4103 user1     20   0   58332   1852    996 S   0.3  0.0   0:00.14 dbus-daemon
 4245 user1     20   0  290768  16644   6868 S   0.3  0.4   0:00.16 applet.py 
 4693 root      20   0  161984   2256   1528 R   0.3  0.1   0:00.01 top
省略


■ このコンテナの終了、イメージ化、再び起動する方法について

次の方法でうまくできた。

○ このコンテナをシャットダウン

[root@fb18eead8af0 /]# poweroff
PolicyKit daemon disconnected from the bus.
We are no longer a registered authentication agent.

○ コンテナが終了状態になっていることを確認

# docker ps -a
CONTAINER ID        IMAGE                   COMMAND             CREATED             STATUS                       PORTS               NAMES
fb18eead8af0        centos-mate-installed   "/sbin/init"        24 hours ago        Exited (130) 6 seconds ago                       centos-mate-ready-to-run

○ イメージ化

既に述べた方法で再びイメージ化した。

docker commit fb18eead8af0 centos-mate-user1

ところで、ここで生成したイメージから、あたらしいコンテナを起動するには、下記のようにする。
複数のコンテナを運用する場合、外部ポートが重ならないようにすること。
下記の例では、5992でなく、5982を外部ポートとして設定している。
二つのコンテナを動作させて、それぞれVNCでリモート接続し、異なるデスクトップを利用できた。
(ただし、今は行わない。)
(例)
(インターネットに直に接している場合、Dockerのデフォルトではiptablesを書き換えて外部からのアクセスを許してしまうことになってしまうため厳禁である。)# docker run -m 3g --privileged -d -p 5982:5902 --name centos-mate-user1-c01 centos-mate-user1 /sbin/init


○ 終了したコンテナを再び起動

# docker start fb18eead8af0
fb18eead8af0

# docker ps
CONTAINER ID        IMAGE                   COMMAND             CREATED             STATUS              PORTS                              NAMESfb18eead8af0        centos-mate-installed   "/sbin/init"        24 hours ago        Up 10 minutes       5901/tcp, 0.0.0.0:5992->5902/tcp   centos-mate-ready-to-run


○ コンテナに接続

[root@localhost ~]# docker exec -it fb18eead8af0 /bin/bash
[root@fb18eead8af0 /]#

○ コンテナ内でVNCSERVERサービスを始動

ファイアーヲールがオフになっていることを確認すること!
(前述の方法で、オフにしておく。ただし、安全な環境でのみそうすること。)

[root@fb18eead8af0 /]# systemctl start vncserver@:2.service

これで、再びリモートアクセスが可能になった。


○後々にVNCSERVERが正常に起動できなくなった場合

VNCSERVERを正常に終了せずにコンテナを再起動させた場合、
systemctl start vncserver@:2.service でエラーが出てサービスの始動に失敗した。

その場合、tmpフォルダ内に作成されているファイルを削除することで、
再び正常にVNCSERVERサービスを始動させ、リモートアクセスできるようになった。

[root@fb18eead8af0 /]# ls /tmp/.X11-unix/X2
/tmp/.X11-unix/X2
[root@fb18eead8af0 /]# rm /tmp/.X11-unix/X2
rm: remove socket ‘/tmp/.X11-unix/X2’? y
[root@fb18eead8af0 /]# systemctl start vncserver@:2.service
[root@fb18eead8af0 /]#


以上


新品価格
¥3,240から
(2018/8/25 03:57時点)

<参考>

・超簡単! CentOS 7上のDockerでCentOS 7を立ち上げる
< https://mseeeen.msen.jp/activate-docker-and-start-centos7/ > 2018年8月25日

・Dockerの基本操作メモ
< https://qiita.com/zaburo/items/97819a1910859a6f2ef9 > 2018年8月25日

・Docker privileged オプションについて
< https://qiita.com/muddydixon/items/d2982ab0846002bf3ea8 > 2018年8月25日

・docker run で/sbin/init を起動時に与えるコマンドとする設定の意味
< https://teratail.com/questions/83479 > 2018年8月25日

・Install CentOS 7 Desktop in Windows using Docker
< https://stackoverflow.com/questions/46997398/install-centos-7-desktop-in-windows-using-docker > 2018年8月25日

・DockerでLinuxデスクトップを使ってみる
< https://int128.hatenablog.com/entry/2014/11/27/233933 > 2018年8月25日

・CentOS 7のDockerコンテナ内でsystemdを使ってサービスを起動する
< https://qiita.com/yunano/items/9637ee21a71eba197345 > 2018年8月25日

・privileged container which is running init process inside a container kills all TTY sessions on host #106
< https://github.com/docker/for-linux/issues/106 > 2018年8月25日

・[docker] コンテナを一括削除
< https://qiita.com/ozhaan/items/9e2090da22ffd6c7ad2a > 2018年8月25日

・Dockerコマンドメモ
< https://qiita.com/curseoff/items/a9e64ad01d673abb6866 > 2018年8月25日


投げ銭

★当サイトへの投げ銭(PayPal)★

Ad

Ad