<お知らせ>(2021年3月10日 更新)
新しい方法によるMATEデスクトップコンテナの構築手順を作成しました。
特権動作が不要だとわかりました。また日本語表示も可能になりました。
よろしければご覧ください。
↓
<お知らせ>(2021年3月10日 更新)
前回のお知らせでは、VNC Serverが起動できなくなった旨を記載しておりますが、
2021年2月くらいに同じ手順で試した所、問題なく起動できることがわかりました。
VNC SERVERにおいてCentOS7システムとの間で生じていた問題が修正されたのだと思います。vnc起動スクリプトの内容に変更がありました。
ところで、上記お知らせに記載の通り、特権不要でMATEデスクトップの日本語環境の動作を確認できました。よろしければご覧ください。
この記事に載っている方法では、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
Disabled2、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接続用のパスワードを設定[user1@fb18eead8af0 /]$ exit
Verify:
Would you like to enter a view-only password (y/n)? n
A view-only password is not used
[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]次のようにして、<USER>部分に先程作成したテストユーザー名を入力する。
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
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/shexec /etc/X11/xinit/xinitrc をコメントアウトするのを忘れないこと。
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
#exec /etc/X11/xinit/xinitrc
exec mate-session &
[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日