ローカル開発環境（Windows10）にDockerでCentOS7（GNOME）を構築しリモートデスクトップ接続


ローカル開発環境(Windows10)にDockerでCentOS7のGUI(GNOME)環境を構築してWindows10からリモートデスクトップで接続するまでの手順について記載しました。

#開発環境
PC：1台（メモリ16GB）※AWS等のクラウドは使わずローカル完結です。
Windows10 Professional 64bit
Docker Desktop for Windows  ：[インストール方法](https://docs.docker.jp/docker-for-windows/install.html)

__※注意点：インストール方法のシステム要件を参照のこと__
Docker Desktop for Windowsをインストールするには
・Windows 10 Professional　64-bit
・Windows 10 Enterprise 64-bit
・Windows 10 Home 64-bit with WSL 2.
のいずれかの環境であることが必要であると記載されています。
また、
Hyper-V と Windows コンテナ機能の有効化が必要

#DockerでCentOS7（GNOME)の構築
##１.Dockerファイルの作成
下記をDockfileとして作成します。

```
FROM centos:centos7

# CentOS ProjectのGPG公開鍵をインストールする
RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

# インストール済みのパッケージをアップデート＆キャッシュのクリア
RUN yum -y update && yum clean all

# 言語を日本語に設定
RUN localedef -i ja_JP -f UTF-8 ja_JP.UTF-8
RUN echo 'LANG="ja_JP.UTF-8"' >  /etc/locale.conf
ENV LANG ja_JP.UTF-8

# 日付を日本語に設定
RUN echo 'ZONE="Asia/Tokyo"' > /etc/sysconfig/clock
RUN rm -f /etc/localtime
RUN ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# manをインストールする前に、manファイルをインストールするように設定変更
RUN sed -i -e"s/^tsflags=nodocs/\# tsflags=nodocs/" /etc/yum.conf

# manと、man-pagesをインストール
RUN yum -y install man
RUN yum -y install man-pages.noarch
RUN yum -y install man-pages-ja.noarch

# GNOMEをインストール
#RUN yum -y groupinstall "GNOME Desktop"

#ネットワーク関連をインストール
RUN yum -y install NetworkManager
RUN yum -y install net-tools
RUN yum -y install iproute

# XRDPをインストール
RUN curl -OL https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
RUN rpm -Uvh epel-release-latest-7.noarch.rpm
RUN yum -y install xrdp tigervnc-server
```
##２.DockerfileからDockerイメージ構築
ここでは下記のディレクトリにDockerfileを作成したという前提にします

```
 C:\Users\sample\test のディレクトリ

2021/04/23  01:15    <DIR>          .
2021/04/23  01:15    <DIR>          ..
2021/04/23  01:16             1,351 Dockerfile
```
Dockerイメージファイル(centos7_test）を作成します。

```
cd C:\Users\sample\test
docker build -t centos7_test .

[+] Building 61.3s (22/22) FINISHED
 => [internal] load build definition from Dockerfile                                                               0.0s
 => => transferring dockerfile: 1.39kB                                                                             0.0s
 => [internal] load .dockerignore                                                                                  0.0s
 => => transferring context: 2B                                                                                    0.0s
 => [internal] load metadata for docker.io/library/centos:centos7                                                  0.0s
 => [ 1/18] FROM docker.io/library/centos:centos7                                                                  0.0s
 => CACHED [ 2/18] RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7                                          0.0s
 => CACHED [ 3/18] RUN yum -y update && yum clean all                                                              0.0s
 => CACHED [ 4/18] RUN localedef -i ja_JP -f UTF-8 ja_JP.UTF-8                                                     0.0s
 => CACHED [ 5/18] RUN echo 'LANG="ja_JP.UTF-8"' >  /etc/locale.conf                                               0.0s
 => CACHED [ 6/18] RUN echo 'ZONE="Asia/Tokyo"' > /etc/sysconfig/clock                                             0.0s
 => CACHED [ 7/18] RUN rm -f /etc/localtime                                                                        0.0s
 => CACHED [ 8/18] RUN ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime                                        0.0s
 => CACHED [ 9/18] RUN sed -i -e"s/^tsflags=nodocs/\# tsflags=nodocs/" /etc/yum.conf                               0.0s
 => CACHED [10/18] RUN yum -y install man                                                                          0.0s
 => CACHED [11/18] RUN yum -y install man-pages.noarch                                                             0.0s
 => CACHED [12/18] RUN yum -y install man-pages-ja.noarch                                                          0.0s
 => [13/18] RUN yum -y install NetworkManager                                                                     13.0s
 => [14/18] RUN yum -y install net-tools                                                                           3.5s
 => [15/18] RUN yum -y install iproute                                                                             7.0s
 => [16/18] RUN curl -OL https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm                    4.0s
 => [17/18] RUN rpm -Uvh epel-release-latest-7.noarch.rpm                                                          0.5s
 => [18/18] RUN yum -y install xrdp tigervnc-server                                                               30.9s
 => exporting to image                                                                                             2.2s
 => => exporting layers                                                                                            2.2s
 => => writing image sha256:820c775152990a9891cdb02d2b2ce119b469e896eecad22bd8c900f98be0a969                       0.0s
 => => naming to docker.io/library/centos7_test                                                                    0.0s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
```
##３Dockerイメージからコンテナ作成し起動
コンテナ（con01)を作成し起動してアタッチします。

ここでは
3389（XRDP）　⇒　リモートデスクトップ用：30000ポートからアクセス
22（SSH)　　　   ⇒　SSH用 ：30001ポートからアクセス
として起動しています。

```
docker run -d --privileged -p 30000:3389 -p 30001:22 --name con01 centos7_test /sbin/init
docker exec -it con01 /bin/bash
```
CentOS7のコンテナ（con01）にアタッチできました。

```
[root@70880df10a53 /]# ll
total 80
-rw-r--r--   1 root root 12114 11月 13 10:55 anaconda-post.log
lrwxrwxrwx   1 root root     7 11月 13 10:53 bin -> usr/bin
drwxr-xr-x  15 root root  3640  4月 23 02:03 dev
-rw-r--r--   1 root root 15448  4月 23 01:23 epel-release-latest-7.noarch.rpm
drwxr-xr-x   1 root root  4096  4月 23 02:03 etc
drwxr-xr-x   2 root root  4096  4月 11  2018 home
lrwxrwxrwx   1 root root     7 11月 13 10:53 lib -> usr/lib
lrwxrwxrwx   1 root root     9 11月 13 10:53 lib64 -> usr/lib64
drwxr-xr-x   2 root root  4096  4月 11  2018 media
drwxr-xr-x   2 root root  4096  4月 11  2018 mnt
drwxr-xr-x   2 root root  4096  4月 11  2018 opt
dr-xr-xr-x 291 root root     0  4月 23 02:03 proc
dr-xr-x---   1 root root  4096  4月 23 01:23 root
drwxr-xr-x  16 root root   340  4月 23 02:03 run
lrwxrwxrwx   1 root root     8 11月 13 10:53 sbin -> usr/sbin
drwxr-xr-x   2 root root  4096  4月 11  2018 srv
dr-xr-xr-x  13 root root     0  4月 23 02:03 sys
drwxrwxrwt   1 root root  4096  4月 23 02:03 tmp
drwxr-xr-x   1 root root  4096 11月 13 10:53 usr
drwxr-xr-x   1 root root  4096  4月 23 02:03 var
```

##４.Gnome Desktop（GUI）のインストール
Dockerイメージ内ではCentOS7のminimalインストールなので手動でGUIをインストールします。

```
[root@70880df10a53 /]# yum -y groupinstall "GNOME Desktop"
Loaded plugins: fastestmirror, ovl
There is no installed groups file.
Maybe run: yum groups mark convert (see man yum)
Loading mirror speeds from cached hostfile
 * base: ftp-srv2.kddilabs.jp
 * epel: ftp.riken.jp
 * extras: ftp-srv2.kddilabs.jp
 * updates: packet01.centos.org
Resolving Dependencies
--> Running transaction check
---> Package ModemManager.x86_64 0:1.6.10-4.el7 will be installed
--> Processing Dependency: ModemManager-glib(x86-64) = 1.6.10-4.el7 for package: ModemManager-1.6.10-4.el7.x86_64
--> Processing Dependency: libqmi-utils for package: ModemManager-1.6.10-4.el7.x86_64
--> Processing Dependency: libmbim-utils for package: ModemManager-1.6.10-4.el7.x86_64
--> Processing Dependency: libqmi-glib.so.5()(64bit) for package: ModemManager-1.6.10-4.el7.x86_64
--> Processing Dependency: libmm-glib.so.0()(64bit) for package: ModemManager-1.6.10-4.el7.x86_64
--> Processing Dependency: libmbim-glib.so.4()(64bit) for package: ModemManager-1.6.10-4.el7.x86_64
--> Processing Dependency: libgudev-1.0.so.0()(64bit) for package: ModemManager-1.6.10-4.el7.x86_64
---> Package NetworkManager-adsl.x86_64 1:1.18.8-2.el7_9 will be installed
---> Package NetworkManager-bluetooth.x86_64 1:1.18.8-2.el7_9 will be installed
～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～
～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～
xorg-x11-drv-intel.x86_64 0:2.99.917-28.20180530.el7                                         xorg-x11-drv-nouveau.x86_64 1:1.0.15-1.el7
xorg-x11-drv-qxl.x86_64 0:0.1.5-5.el7                                                        xorg-x11-drv-synaptics.x86_64 0:1.9.0-2.el7
xorg-x11-drv-v4l.x86_64 0:0.2.0-49.el7                                                       xorg-x11-drv-vesa.x86_64 0:2.4.0-3.el7
xorg-x11-drv-vmmouse.x86_64 0:13.1.0-1.el7.1                                                 xorg-x11-drv-vmware.x86_64 0:13.2.1-1.el7.1
xorg-x11-drv-void.x86_64 0:1.4.1-2.el7.1                                                     xorg-x11-drv-wacom.x86_64 0:0.36.1-3.el7
xorg-x11-font-utils.x86_64 1:7.5-21.el7                                                      xorg-x11-fonts-Type1.noarch 0:7.5-9.el7
xorg-x11-proto-devel.noarch 0:2018.4-1.el7                                                   xorg-x11-server-common.x86_64 0:1.20.4-15.el7_9
yajl.x86_64 0:2.0.4-4.el7                                                                    yelp-libs.x86_64 2:3.28.1-1.el7
yelp-xsl.noarch 0:3.28.0-1.el7                                                               zenity.x86_64 0:3.28.1-1.el7

Complete!
[root@70880df10a53 /]#

```
##４.ファイアウォールの起動
```
[root@70880df10a53 /]# systemctl start firewalld
```
##５.XRDPとSSHのポート許可
```
[root@70880df10a53 /]# firewall-cmd --permanent --zone=public --add-port=3389/tcp --add-port=22/tcp
success

```
##６.XRDPの起動と起動設定
```
[root@70880df10a53 /]# systemctl start xrdp
[root@70880df10a53 /]# systemctl enable xrdp
Created symlink from /etc/systemd/system/multi-user.target.wants/xrdp.service to /usr/lib/systemd/system/xrdp.service.
```

##７.SSHの起動と起動設定
```
[root@70880df10a53 /]# systemctl start sshd
[root@70880df10a53 /]# systemctl enable sshd
```
##８.ファイアウォールの更新
```
[root@70880df10a53 /]# firewall-cmd --reload
success
```
##９.ネットワークの確認
SSH(22）とXRDP(3389)が開いていることを確認

```
[root@70880df10a53 /]# netstat -ant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:3350          0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:3389            0.0.0.0:*               LISTEN
tcp6       0      0 :::22                   :::*                    LISTEN
```

##１０.rootのパスワードを付与
```
[root@70880df10a53 /]# passwd
Changing password for user root.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
```

##１１.SSHでログイン

Windows10からSSHでDockerのCentOS7にログインできた！！

```
C:\Users\sample>ssh root@localhost -p 30001
root@localhost's password:

[root@70880df10a53 ~]# cd /
[root@70880df10a53 /]# ll
total 84
-rw-r--r--   1 root root 12114 11月 13 10:55 anaconda-post.log
lrwxrwxrwx   1 root root     7 11月 13 10:53 bin -> usr/bin
drwxr-xr-x   4 root root  4096  4月 23 02:24 boot
drwxr-xr-x  15 root root  3640  4月 23 02:03 dev
-rw-r--r--   1 root root 15448  4月 23 01:23 epel-release-latest-7.noarch.rpm
drwxr-xr-x   1 root root  4096  4月 23 02:44 etc
drwxr-xr-x   2 root root  4096  4月 11  2018 home
lrwxrwxrwx   1 root root     7 11月 13 10:53 lib -> usr/lib
lrwxrwxrwx   1 root root     9 11月 13 10:53 lib64 -> usr/lib64
drwxr-xr-x   2 root root  4096  4月 11  2018 media
drwxr-xr-x   2 root root  4096  4月 11  2018 mnt
drwxr-xr-x   1 root root  4096  4月 23 02:20 opt
dr-xr-xr-x 207 root root     0  4月 23 02:03 proc
dr-xr-x---   1 root root  4096  4月 23 02:49 root
drwxr-xr-x  37 root root   900  4月 23 02:36 run
lrwxrwxrwx   1 root root     8 11月 13 10:53 sbin -> usr/sbin
drwxr-xr-x   2 root root  4096  4月 11  2018 srv
dr-xr-xr-x  13 root root     0  4月 23 02:03 sys
drwxrwxrwt   1 root root  4096  4月 23 02:24 tmp
drwxr-xr-x   1 root root  4096 11月 13 10:53 usr
drwxr-xr-x   1 root root  4096  4月 23 02:20 var
[root@70880df10a53 /]#
```

##１２.Windows10のリモートデスクトップでログイン

localhost:30000でアクセス
<img width="400" alt="image.png" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373278/aeb4e66b-f5c9-a004-f500-749d3829d6b3.png>
rootでログイン
<img width="800" alt="image.png" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373278/04745984-7a53-8cf7-0a59-31b8f6c2ddc6.png>

Windows10からリモートデスクトップでDockerのCentOS7にログインできた！！
<img width="800" alt="image.png" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373278/5cff3f04-e942-9587-b159-bd26c622129e.png>

あとはGNOMEに日本語環境をセットアップして終了