投げ銭

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

LINK


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

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

人気の投稿(1ヶ月間)

Ad

Ad

投げ銭

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

2018年11月23日金曜日

【Linux CentOS 7】Dockerイメージを圧縮ファイルに保存して別のホストにコピーし復元した【Docker-ce 18.06.1.ce】

下記では、Dockerイメージ移動元、移動先の両ホストは、CentOS7を利用している。

また、Dockerのインストールは、「【Linux CentOS 7】Dockerをyumでインストールする手順と簡単な動作テスト【Docker-ce 18.06.1.ce】」の手順で行った。



■Dockerイメージを圧縮してファイルに保存

○イメージ一覧

次のDockerイメージが存在している。これを圧縮してファイルに保存する。
# docker image list
REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
image-centos7-popfile-20181122     latest              341bbc5d6f87        30 hours ago        1.09GB
1GB程度ある。


○圧縮してファイルに保存

# docker save image-centos7-popfile-20181122 | gzip > image-centos7-popfile-20181122.tgz
(c.f.)圧縮しない場合は、-oオプションで直接出力ファイル名を指定する。
# docker save -o image-name.tar image-name

# ls -l
-rw-r--r--   1 root root  370858897 11月 22 17:34 image-centos7-popfile-20181122.tgz

約1GBが、370MB程度に圧縮された。



■ファイルに保存済みのイメージを別のDockerホストに復元

○生成した圧縮ファイルを別のDockerホストにコピーした。

# scp -P 22 image-centos7-popfile-20181122.tgz root@192.168.20.3:/root/

<意味>
-P 22 SSHポート番号を明示的に指定する。
image-centos7-popfile-20181122.tgz 送信するファイル
root@192.168.20.3:/root/ 送信先ホスト(rootはログインユーザー)とそこのディレクトリ

ちなみに、フォルダごとコピーしたい場合は、scp -r とすればよい。
例えば、カレントディレクトリ内にあるimage-folderを、リモートの/rootディレクトリ内にコピーする。
# scp -r -P 22 image-folder root@192.168.20.3:/root/

-p というオプション(小文字)を指定すれば、ファイル属性をオリジナルのままにすることができる。



○コピー先の別のDockerホスト側で、イメージを圧縮ファイルからロードした。

コピー先とした別のDockerホストのコンソールを表示した。

ファイルの確認
[root@another ~]# ls image*
image-centos7-popfile-20181122.tgz

イメージを圧縮ファイルからロード
[root@another ~]# gunzip -c image-centos7-popfile-20181122.tgz | docker load
1d31b5806ba4: Loading layer [==================================================>]  208.3MB/208.3MB
3c544c486d65: Loading layer [==================================================>]  150.5MB/150.5MB
ad7894c4b1ef: Loading layer [==================================================>]  115.6MB/115.6MB
2331b5983314: Loading layer [==================================================>]  106.2MB/106.2MB
9ae5363d1828: Loading layer [==================================================>]  530.4MB/530.4MB
Loaded image: image-centos7-popfile-20181122:latest

(c.f)圧縮ファイルでなく普通のtarファイルの場合、-i オプションでファイルを指定する。
# docker load -i image-name.tar


イメージの一覧表示
# docker image list
REPOSITORY                       TAG                 IMAGE ID            CREATED             SIZE
image-centos7-popfile-20181122   latest              341bbc5d6f87        31 hours ago        1.09GB
hello-world                      latest              4ab4c602aa5e        2 months ago        1.84kB
確かにロードされた。
また、無事にこのイメージからコンテナをrunさせることができた。

このようにDockerは、動作環境を「ファイル」として丸ごと出力し別のホストへ移動できるのでとても便利だ。



<参考>
・Docker: save/load container using tgz file (tar.gz)
< https://codepad.co/snippet/hh8FztUc > 2018年11月23日

・docker save
< https://docs.docker.com/engine/reference/commandline/save/ > 2018年11月23日

・docker load
< https://docs.docker.com/engine/reference/commandline/load/ > 2018年11月23日

・Docker Tutorial 4: Exporting Container and Saving Image
< https://medium.com/@sh.tsang/docker-tutorial-4-exporting-container-and-saving-image-c3a7d792cfb6 > 2018年11月23日

・How to copy a folder from remote to local using scp? [closed]
< https://stackoverflow.com/questions/11304895/how-to-copy-a-folder-from-remote-to-local-using-scp > 2019年7月1日

・How to preserve files original creation date?
< https://stackoverflow.com/questions/20255368/how-to-preserve-files-original-creation-date > 2020年8月8日

2018年11月22日木曜日

【Linux CentOS 7】Dockerコンテナにメール分類ソフトPOPFile(日本語分かち書きでmecabを利用)を導入した【Docker-ce 18.06.1.ce】

以下では、特権Dockerコンテナを用いてインストール作業を行っている。

しかし、通常のCentOS 7でも同じ手順でインストールの作業はできると思う。
一部、Dockerコンテナにまつわる作業が混ざっています。

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



■必要なファイルのダウンロード

http://taku910.github.io/mecab/#download から次の3つのファイルを、Dockerホストにダウンロードしておいた。

1、MeCab 本体(mecab-0.996.tar.gz)
2、MeCab 用の辞書IPA 辞書(mecab-ipadic-2.7.0-20070801.tar.gz)
3、perl バインディング(mecab-perl-0.996.tar.gz)



■設定するコンテナの起動

以下で使用するDockerコンテナは、
【Linux CentOS 7】(ベースコンテナの作成)SSH接続可能なDockerコンテナでの日本用ロケールの有効化と検証(man,dateの日本語表示)」で作成したイメージから生成したものである。

これは日本のロケールを利用できるようにしたものである。
またSSH接続も利用できるように構成している。

このイメージからコンテナを起動した。
(SSH接続のためホスト側222番ポートをコンテナの22番へ通している。)
(インターネットに直に接している場合、Dockerのデフォルトではiptablesを書き換えて外部からのアクセスを許してしまうことになってしまうため厳禁である。)
# docker run --privileged -d -p 222:22 --name centos7-popfile image-centos7-ja /sbin/init



■perlとperlモジュールのインストール

次のページを参考に行った。
ただし、perlモジュールのインストール手順が少し異なった。
【Linux CentOS 6.5 64bit minimal】 POPFileインストール手順 (依存PerlモジュールをYUMで導入し、POPFileの起動と初期設定を完了させる)


○perlのインストール

[root@2d82556b4724 ~]# yum install perl
Total download size: 11 M
Installed size: 36 M
Installed:
  perl.x86_64 4:5.16.3-292.el7
Dependency Installed:
  perl-Carp.noarch 0:1.26-244.el7
  perl-Encode.x86_64 0:2.51-7.el7
  perl-Exporter.noarch 0:5.68-3.el7
  perl-File-Path.noarch 0:2.09-2.el7
  perl-File-Temp.noarch 0:0.23.01-3.el7
  perl-Filter.x86_64 0:1.49-3.el7
  perl-Getopt-Long.noarch 0:2.40-3.el7
  perl-HTTP-Tiny.noarch 0:0.033-3.el7
  perl-PathTools.x86_64 0:3.40-5.el7
  perl-Pod-Escapes.noarch 1:1.04-292.el7
  perl-Pod-Perldoc.noarch 0:3.20-4.el7
  perl-Pod-Simple.noarch 1:3.28-4.el7
  perl-Pod-Usage.noarch 0:1.63-3.el7
  perl-Scalar-List-Utils.x86_64 0:1.27-248.el7
  perl-Socket.x86_64 0:2.010-4.el7
  perl-Storable.x86_64 0:2.45-3.el7
  perl-Text-ParseWords.noarch 0:3.29-4.el7
  perl-Time-HiRes.x86_64 4:1.9725-3.el7
  perl-Time-Local.noarch 0:1.2300-2.el7
  perl-constant.noarch 0:1.27-2.el7
  perl-libs.x86_64 4:5.16.3-292.el7
  perl-macros.x86_64 4:5.16.3-292.el7
  perl-parent.noarch 1:0.225-244.el7                 
  perl-podlators.noarch 0:2.5.1-3.el7
  perl-threads.x86_64 0:1.87-4.el7
  perl-threads-shared.x86_64 0:1.43-6.el7
Complete!

○popfileが必要とするperlモジュールのインストール

次の三つについては、既にインストールされていたことがわかった。

[root@2d82556b4724 ~]# perl -M-MIME::Base64 -e 'print $MIME::Base64::VERSION'
3.13
[root@2d82556b4724 ~]# perl -M-MIME::QuotedPrint -e 'print $MIME::QuotedPrinERSION'
3.13
[root@2d82556b4724 ~]# perl -M-Encode -e 'print $Encode::VERSION'
2.51

したがって、popfileを利用するためにインストールすべきモジュールは次の通りである。

(1) DBI
(2) DBD::SQLite
(3) HTML::Tagset
(4) Date::Parse (all platforms except Windows)
(5) HTML::Template
(6) IO::Socket::Socks (if you want to use a SOCKS proxy)
(7) Net::SSLeay (if you want to use SSL)
(8) IO::Socket::SSL (if you want to use SSL)
(9) SOAP::Lite (if you want to use XMLRPC)
(10)  Digest::base
(11)  Digest::MD5

○一つ一つyumを使ってインストールを行った。

(1) DBI
[root@2d82556b4724 ~]# yum install perl-DBI
Total download size: 1.3 M
Installed size: 3.2 M
Installed:
  perl-DBI.x86_64 0:1.627-4.el7
Dependency Installed:
  perl-Compress-Raw-Bzip2.x86_64 0:2.061-3.el7
  perl-Compress-Raw-Zlib.x86_64 1:2.061-4.el7
  perl-Data-Dumper.x86_64 0:2.145-3.el7
  perl-IO-Compress.noarch 0:2.061-2.el7
  perl-Net-Daemon.noarch 0:0.48-5.el7
  perl-PlRPC.noarch 0:0.2020-14.el7                                         
Complete!

(2) DBD::SQLite
[root@2d82556b4724 ~]# yum install perl-DBD-SQLite
Total download size: 1.3 M
Installed size: 5.4 M
Installed:
  perl-DBD-SQLite.x86_64 0:1.39-3.el7                                       
Complete!

(3) HTML::Tagset

[root@2d82556b4724 ~]# yum install perl-HTML-Tagset
Total download size: 18 k
Installed size: 19 k
Installed:
  perl-HTML-Tagset.noarch 0:3.20-15.el7

Complete!

(4) Date::Parse (all platforms except Windows)

[root@2d82556b4724 ~]# yum install perl-DateTime-Format-DateParse
Total download size: 2.5 M
Installed size: 14 M
Installed:
  perl-DateTime-Format-DateParse.noarch 0:0.05-5.el7                         
Dependency Installed:
  perl-Class-Load.noarch 0:0.20-3.el7
  perl-Class-Singleton.noarch 0:1.4-14.el7
  perl-Data-OptList.noarch 0:0.107-9.el7
  perl-DateTime.x86_64 2:1.04-6.el7
  perl-DateTime-Locale.noarch 0:0.45-6.el7
  perl-DateTime-TimeZone.noarch 0:1.70-1.el7
  perl-List-MoreUtils.x86_64 0:0.33-9.el7
  perl-Module-Implementation.noarch 0:0.06-6.el7
  perl-Module-Runtime.noarch 0:0.013-4.el7
  perl-Package-DeprecationManager.noarch 0:0.13-7.el7
  perl-Package-Stash.noarch 0:0.34-2.el7
  perl-Package-Stash-XS.x86_64 0:0.26-3.el7
  perl-Params-Util.x86_64 0:1.07-6.el7
  perl-Params-Validate.x86_64 0:1.08-4.el7
  perl-Sub-Install.noarch 0:0.926-6.el7
  perl-TimeDate.noarch 1:2.30-2.el7
  perl-Try-Tiny.noarch 0:0.12-2.el7

Complete!

(5) HTML::Template

epelリポジトリが必要なので導入しておく。

[root@2d82556b4724 ~]# yum install epel-release
Installed:
  epel-release.noarch 0:7-11                                                 
Complete!
[root@2d82556b4724 ~]# yum install perl-HTML-Template
================================================================================
 Package                   Arch          Version              Repository   Size
================================================================================
Installing:
 perl-HTML-Template        noarch        2.95-1.el7           epel         76 k
Installing for dependencies:
 perl-Digest               noarch        1.17-245.el7         base         23 k
 perl-Digest-MD5           x86_64        2.52-3.el7           base         30 k
Transaction Summary
================================================================================
Install  1 Package (+2 Dependent packages)
Total download size: 129 k
Installed size: 274 k
Complete!

(6) IO::Socket::Socks (if you want to use a SOCKS proxy)
Socksを用いない場合は不要なのでパスした。

(7) Net::SSLeay (if you want to use SSL)

[root@2d82556b4724 ~]# yum install perl-Net-SSLeay
Total download size: 285 k
Installed size: 991 k
Installed:
  perl-Net-SSLeay.x86_64 0:1.55-6.el7

Complete!

(8) IO::Socket::SSL (if you want to use SSL)

[root@2d82556b4724 ~]# yum install perl-IO-Socket-SSL
Total download size: 1.1 M
Installed size: 2.3 M
Installed:
  perl-IO-Socket-SSL.noarch 0:1.94-7.el7                                     
Dependency Installed:
  make.x86_64 1:3.82-23.el7             openssl.x86_64 1:1.0.2k-12.el7     
  perl-IO-Socket-IP.noarch 0:0.21-5.el7 perl-Mozilla-CA.noarch 0:20130114-5.el7
  perl-Net-LibIDN.x86_64 0:0.12-15.el7
Complete!

(9) SOAP::Lite (if you want to use XMLRPC)

これもepelリポジトリが必要である。

[root@2d82556b4724 ~]# yum install perl-SOAP-Lite
================================================================================
 Package                     Arch       Version                  Repository
                                                                           Size
================================================================================
Installing:
 perl-SOAP-Lite              noarch     1.10-1.el7               epel     293 k
Installing for dependencies:
 mailcap                     noarch     2.1.41-2.el7             base      31 k
 perl-Business-ISBN          noarch     2.06-2.el7               base      25 k
 perl-Business-ISBN-Data     noarch     20120719.001-2.el7       base      24 k
 perl-Class-Inspector        noarch     1.28-2.el7               base      31 k
 perl-Convert-BinHex         noarch     1.119-20.el7             epel      44 k
 perl-Email-Date-Format      noarch     1.002-15.el7             epel      17 k
 perl-Encode-Locale          noarch     1.03-5.el7               base      16 k
 perl-File-Listing           noarch     6.04-7.el7               base      13 k
 perl-HTML-Parser            x86_64     3.71-4.el7               base     115 k
 perl-HTTP-Cookies           noarch     6.01-5.el7               base      26 k
 perl-HTTP-Daemon            noarch     6.01-7.el7               base      21 k
 perl-HTTP-Date              noarch     6.02-8.el7               base      14 k
 perl-HTTP-Message           noarch     6.06-6.el7               base      82 k
 perl-HTTP-Negotiate         noarch     6.01-5.el7               base      17 k
 perl-IO-HTML                noarch     1.00-2.el7               base      23 k
 perl-IO-SessionData         noarch     1.03-1.el7               epel     8.5 k
 perl-LWP-MediaTypes         noarch     6.02-2.el7               base      24 k
 perl-MIME-Lite              noarch     3.030-1.el7              epel      96 k
 perl-MIME-Types             noarch     1.38-2.el7               epel      38 k
 perl-MIME-tools             noarch     5.505-1.el7              epel     256 k
 perl-MailTools              noarch     2.12-2.el7               base     108 k
 perl-Net-HTTP               noarch     6.06-2.el7               base      29 k
 perl-Net-SMTP-SSL           noarch     1.01-13.el7              base     9.1 k
 perl-URI                    noarch     1.60-9.el7               base     106 k
 perl-WWW-RobotRules         noarch     6.02-5.el7               base      18 k
 perl-XML-Parser             x86_64     2.41-10.el7              base     223 k
 perl-libwww-perl            noarch     6.05-2.el7               base     205 k
Transaction Summary
================================================================================
Install  1 Package (+27 Dependent packages)
Total download size: 1.9 M
Installed size: 4.2 M
Is this ok [y/d/N]:y
Complete!

(10)  Digest::base
[root@2d82556b4724 ~]# yum install perl-Digest
インストール済みとなった。
Package perl-Digest-1.17-245.el7.noarch already installed and latest version
Nothing to do

(11)  Digest::MD5
[root@2d82556b4724 ~]# yum install perl-Digest-MD5
Package perl-Digest-MD5-2.52-3.el7.x86_64 already installed and latest version
Nothing to do


■その他必要なツールをインストールした

[root@2d82556b4724 ~]# yum install gcc gcc-c++
Total download size: 40 M
Installed size: 84 M
Dependency Installed:
  cpp.x86_64 0:4.8.5-28.el7_5.1
  glibc-devel.x86_64 0:2.17-222.el7
  glibc-headers.x86_64 0:2.17-222.el7
  kernel-headers.x86_64 0:3.10.0-862.14.4.el7
  libgomp.x86_64 0:4.8.5-28.el7_5.1
  libmpc.x86_64 0:1.0.1-3.el7
  libstdc++-devel.x86_64 0:4.8.5-28.el7_5.1
  mpfr.x86_64 0:3.1.1-4.el7

Complete!

[root@2d82556b4724 ~]# yum install wget
Installed:
  wget.x86_64 0:1.14-15.el7_4.1
Complete!


■mecabのインストール

○mecabに関する3つのファイルのコピー

冒頭に挙げたページからmecabに関する3つのファイルをダウンロードしDockerホスト側に、保存しておいた。
それをコンテナにコピーした。

docker cp ではワイルドカードは使えなかった。
2d82556b4724は、コンテナIDである。
/root/software/popfile/mecab/ は予めコンテナに作成した。

ホストからコンテナへのコピー作業
# docker cp /mecab-0.996.tar.gz 2d82556b4724:/root/software/popfile/mecab/
# docker cp /mecab-ipadic-2.7.0-20070801.tar.gz 2d82556b4724:/root/software/popfile/mecab/
# docker cp /mecab-perl-0.996.tar.gz 2d82556b4724:/root/software/popfile/mecab/

コピーされたファイルの確認
[root@2d82556b4724 mecab]# ls
mecab-0.996.tar.gz  mecab-ipadic-2.7.0-20070801.tar.gz


○mecab本体のインストール

[root@2d82556b4724 mecab-0.996]# tar -zxvf mecab-0.996.tar.gz
[root@2d82556b4724 mecab-0.996]# cd mecab-0.996
[root@2d82556b4724 mecab-0.996]# ./configure
[root@2d82556b4724 mecab-0.996]# make
[root@2d82556b4724 mecab-0.996]# make install


○mecab辞書のインストール

[root@2d82556b4724 mecab-0.996]# cd ..
[root@2d82556b4724 mecab]# tar -zxvf mecab-ipadic-2.7.0-20070801.tar.gz
[root@2d82556b4724 mecab]# cd mecab-ipadic-2.7.0-20070801
[root@2d82556b4724 mecab-ipadic-2.7.0-20070801]#  ./configure --with-charset=utf8
[root@2d82556b4724 mecab-ipadic-2.7.0-20070801]# make
done!
echo To enable dictionary, rewrite /usr/local/etc/mecabrc as \"dicrc = /usr/local/lib/mecab/dic/ipadic\"
To enable dictionary, rewrite /usr/local/etc/mecabrc as "dicrc = /usr/local/lib/mecab/dic/ipadic"
[root@2d82556b4724 mecab-ipadic-2.7.0-20070801]# make install


○mecabの動作テスト

[root@2d82556b4724 mecab-ipadic-2.7.0-20070801]# mecab

日本語の文を適当に入力してエンターを押すと自動的に次のように解析された。
テスト中です
テスト  名詞,サ変接続,*,*,*,*,テスト,テスト,テスト
中      名詞,接尾,副詞可能,*,*,*,中,チュウ,チュー
です    助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
EOS
^C
CTRL+cで抜ける。


○mecab-perl-bindのインストール

[root@2d82556b4724 mecab-ipadic-2.7.0-20070801]# cd ..
[root@2d82556b4724 mecab]# tar -zxvf mecab-perl-0.996.tar.gz
[root@2d82556b4724 mecab]# cd mecab-perl-0.996
[root@2d82556b4724 mecab-perl-0.996]# yum install perl-ExtUtils-MakeMaker
[root@2d82556b4724 mecab-perl-0.996]# perl Makefile.PL
Checking if your kit is complete...
Looks good
Writing Makefile for MeCab
[root@2d82556b4724 mecab-perl-0.996]# make
[root@2d82556b4724 mecab-perl-0.996]# make install
Files found in blib/arch: installing files in blib/lib into architecture dependent library tree
Installing /usr/local/lib64/perl5/auto/MeCab/MeCab.so
Installing /usr/local/lib64/perl5/auto/MeCab/MeCab.bs
Installing /usr/local/lib64/perl5/MeCab.pm
Appending installation info to /usr/lib64/perl5/perllocal.pod


■popfile本体の導入

○準備

[root@2d82556b4724 mecab-perl-0.996]# cd ..
[root@2d82556b4724 mecab]# cd ..
[root@2d82556b4724 popfile]# mkdir popfile-1.1.3
[root@2d82556b4724 popfile]# cd popfile-1.1.3

[root@2d82556b4724 popfile-1.1.3]# yum install unzip
Total download size: 170 k
Installed size: 365 k
Installed:
  unzip.x86_64 0:6.0-19.el7                                                   
Complete!

○popfileをダウンロードし展開した。

[root@2d82556b4724 popfile-1.1.3]# wget http://getpopfile.org/downloads/popfile-1.1.3.zip
popfile-1.1.3.zip’ saved [523431/523431]
[root@2d82556b4724 popfile-1.1.3]# unzip popfile-1.1.3.zip
[root@2d82556b4724 popfile-1.1.3]# ls
Classifier  bayes.pl     license   popfile-1.1.3.zip  v1.1.3.change
POPFile     black.gif    otto.gif  popfile.pck        v1.1.3.change.nihongo
Proxy       favicon.ico  otto.png  popfile.pl
Services    insert.pl    pipe.pl   skins
UI          languages    pix.gif   stopwords


○popfileの設定

popfileを一度起動して設定ファイルを生成させた。

[root@2d82556b4724 popfile-1.1.3]# perl ./popfile.pl
POPFile Engine loading
    Loading...
         {core: config history logger mq}
         {classifier: bayes wordmangle}
         {interface: html xmlrpc}
         {proxy: nntp pop3 smtp}
         {services: imap}
POPFile Engine v1.1.3 starting
    Initializing...
         {core: config history logger mq}
         {classifier: bayes wordmangle}
         {interface: html xmlrpc}
         {proxy: nntp pop3 smtp}
         {services: imap}
    Starting...   
         {core: config history logger mq}
         {classifier: bayes wordmangle}
         {interface: html}
         {proxy: pop3}
         {services:}
POPFile Engine v1.1.3 running

^C ←ctrl+cを入力して一旦終了させた。


POPFile Engine v1.1.3 stopping
    Stopping...
         {classifier: bayes wordmangle}
         {core: config history logger mq}
         {interface: html}
         {proxy: pop3}
         {services:}
POPFile Engine v1.1.3 terminated

設定ファイルの確認
[root@2d82556b4724 popfile-1.1.3]# ls
Classifier  favicon.ico  pipe.pl            popfile1542758400.log
POPFile     insert.pl    pix.gif            skins
Proxy       languages    popfile-1.1.3.zip  stopwords
Services    license      popfile.cfg        v1.1.3.change
UI          messages     popfile.db         v1.1.3.change.nihongo
bayes.pl    otto.gif     popfile.pck
black.gif   otto.png     popfile.pl


必要最低限の設定を行った。
[root@2d82556b4724 popfile-1.1.3]# vi popfile.cfg
bayes_nihongo_parser MeCab ←大文字小文字に注意。さもなければ動作せず文字化けする。
html_language Nihongo ←日本語メールの処理、GUIの日本語化
html_local 0 ←127.0.0.1以外のインターフェイスへのアクセスでもGUIにアクセス許可(ただし、予めIPフィルタの設定を必ず適切に行っておくこと)
html_port 8081 ←GUIアクセスのためのTCPポートの設定

以上で、popfileの設定は完了した。



■popfileの起動(コンテナのイメージ化を伴う)

popfileを起動してhttp接続するためには、コンテナに8081ポートを通す必要がある。
そのため、一旦コンテナを終了し、ポートの設定を加えて起動する。

○コンテナの終了
[root@2d82556b4724 popfile-1.1.3]# poweroff


以下は、Dockerホストでの作業である。


○コンテナをコミットして、イメージ化を行った。

2d82556b4724はコンテナIDである。
[root@localhost ~]# docker commit 2d82556b4724 image-centos7-popfile-20181122


○イメージを使用して、コンテナを生成し動作させた。
8081ポートを開いた。
(インターネットに直に接している場合、Dockerのデフォルトではiptablesを書き換えて外部からのアクセスを許してしまうことになってしまうため厳禁である。)
[root@localhost ~]# docker run --privileged -d -p 222:22 -p 8081:8081 --name centos7-popfile-test image-centos7-popfile-20181122  /sbin/init
991e42c74bc86b9244ffda479c5e2786808525408bcb5cb0fad8c6d63c606a3a

○コンテナにSSH接続を行った。

$ ssh -p 222 root@192.168.10.3
root@192.168.10.3's password: 

以下はコンテナでの作業である。


○popfileの起動

ディレクトリへ移動した。
[root@991e42c74bc8 ~]# cd software/popfile/popfile-1.1.3/
[root@991e42c74bc8 popfile-1.1.3]# ls
Classifier  Services  black.gif    languages  otto.gif  pix.gif            popfile.db   popfile1542758400.log  v1.1.3.change
POPFile     UI        favicon.ico  license    otto.png  popfile-1.1.3.zip  popfile.pck  skins                  v1.1.3.change.nihongo
Proxy       bayes.pl  insert.pl    messages   pipe.pl   popfile.cfg        popfile.pl   stopwords

バックグラウンドで動作させた。
[root@991e42c74bc8 popfile-1.1.3]# perl ./popfile.pl &
[1] 161
[root@991e42c74bc8 popfile-1.1.3]#
POPFile Engine loading
    Loading...
         {core: config history logger mq}
         {classifier: bayes wordmangle}
         {interface: html xmlrpc}
         {proxy: nntp pop3 smtp}
         {services: imap}
POPFile Engine v1.1.3 starting
    Initializing...
         {core: config history logger mq}
         {classifier: bayes wordmangle}
         {interface: html xmlrpc}
         {proxy: nntp pop3 smtp}
         {services: imap}
    Starting...   
         {core: config history logger mq}
         {classifier: bayes wordmangle}
         {interface: html}
         {proxy: pop3}
         {services:}
POPFile Engine v1.1.3 running

[root@991e42c74bc8 popfile-1.1.3]#


ブラウザから、http://192.168.10.3:8081 に接続すると、popfileのコントロール画面が開いた。


以上



<参考>
・【Linux CentOS 6.5 64bit minimal】 POPFileインストール手順 (依存PerlモジュールをYUMで導入し、POPFileの起動と初期設定を完了させる)
< http://akira-arets.blogspot.com/2014/04/centos65minimal-popfile-mecab-installing.html > 2018年11月22日

・オフライン環境でCentOS7のパッケージをインストールする
< https://qiita.com/goforbroke/items/aafb1cb0549ee90c2d70 > 2018年11月22日

・Dockerでホストとコンテナ間でのファイルコピー
< https://qiita.com/gologo13/items/7e4e404af80377b48fd5 > 2018年11月22日

2018年11月21日水曜日

【Linux CentOS 7】(ベースコンテナの作成)SSH接続可能なDockerコンテナでの日本用ロケールの有効化と検証(man,dateの日本語表示)【Docker-ce 18.06.1.ce】

(警告)
ここで作成しているDockerコンテナは、信頼のおけるローカルネットワークのみで動作するホストで運用するものとして構築している。
ホスト上のいずれかのネットワークインターフェイスがインターネットに直接接している場合、このコンテナの運用はセキュリティの観点から非常に危険なので動作させてはいけない。
(Dockerのデフォルトでは外部からのアクセスを許してしまうことになってしまうため。)


以下で用いているコンテナは、
【Linux CentOS 7】Dockerコンテナへssh接続する方法や、コンテナのイメージ化、削除、起動方法などについて【Docker-ce 18.06.1.ce】」で作成したイメージから生成している。
その大本は、CentOS7の公式イメージである。


次のコマンドでイメージからコンテナを生成し動作させた。

# docker run --privileged -d -p 222:22 --name centos7-ja image-centos7-ssh /sbin/init
2d82556b4724a2b3a8e86eb41c19e5e626e37199cbb66aff8d76f7c10a289ac9
そして、このコンテナにSSH接続を行った。

$ ssh -p 222 root@192.168.10.3
[root@2d82556b4724 ~]#

以下は、コンテナでの作業である。



■manと、man-pages-ja のインストール


Dockerコンテナ(公式CentOS7)でマニュアルデータを同時にダウンロードさせるためには、
yum.confの次の行をコメントアウトするか、
#tsflags=nodocs
あるいは、yumコマンドで下記の通りにオプションを指定する必要がある。


○manのインストールを行った。

[root@2d82556b4724 ~]# yum --setopt=tsflags='' install man
Installed:
  man-db.x86_64 0:2.6.3-9.el7                                                                                                                                         
Dependency Installed:
  groff-base.x86_64 0:1.22.2-8.el7                          less.x86_64 0:458-9.el7                          libpipeline.x86_64 0:1.2.3-3.el7                       
Complete!

manのマニュアルは表示できたものの、qコマンドで終了後、エラーが表示されていた。
[root@2d82556b4724 ~]# man man
man: can't set the locale; make sure $LC_* and $LANG are correct
lsマニュアルは表示されなかった。また、同じエラーが表示されていることがわかった。
[root@2d82556b4724 ~]# man ls
man: can't set the locale; make sure $LC_* and $LANG are correctNo manual entry for ls


○ 続いて、man-pages-ja のインストールを行った。

[root@2d82556b4724 ~]# yum --setopt=tsflags='' install man-pages-ja
Installed:
  man-pages-ja.noarch 0:20130615-2.el7                                                                                                                               
Complete!

manのマニュアルは表示できたものの、qコマンドで終了後、エラーが表示されていた。
[root@2d82556b4724 ~]# man man
man: can't set the locale; make sure $LC_* and $LANG are correct
lsマニュアルは表示されなかった。また、同じエラーが表示されていることがわかった。
[root@2d82556b4724 ~]# man ls
man: can't set the locale; make sure $LC_* and $LANG are correctNo manual entry for ls


■ロケールに関する動作検証


○LANG環境変数に値を設定して動作確認を行った。

しかし、LANG環境変数にen_US.UTF-8を入れてやると、エラーは表示されなかった。
[root@841b2757b89c ~]# LANG=en_US.UTF-8 man man

あるいは、LANG環境変数にCを入れても、エラーは表示されなかった。
[root@bb8b0b0cf804 ~]# LANG=C man man


○現在のデフォルトのLANG環境変数の値の確認した。

この値(ja_JP.utf8)ではエラーが発生するわけだ。
[root@2d82556b4724 ~]# echo $LANG
ja_JP.utf8
念の為に試してみた。(エントリは指定していない。)
[root@2d82556b4724 ~]# LANG=ja_JP.utf8 man 
man: can't set the locale; make sure $LC_* and $LANG are correct
What manual page do you want?

○localeコマンドでも現在の値を確認した。

ファイルやディレクトリが見つからないというエラーが発生していた。

[root@2d82556b4724 ~]# locale
locale: Cannot set LC_CTYPE to default locale: No such file or directorylocale: Cannot set LC_MESSAGES to default locale: No such file or directorylocale: Cannot set LC_ALL to default locale: No such file or directoryLANG=ja_JP.utf8
LC_CTYPE="ja_JP.utf8"
LC_NUMERIC="ja_JP.utf8"
LC_TIME="ja_JP.utf8"
LC_COLLATE="ja_JP.utf8"
LC_MONETARY="ja_JP.utf8"
LC_MESSAGES="ja_JP.utf8"
LC_PAPER="ja_JP.utf8"
LC_NAME="ja_JP.utf8"
LC_ADDRESS="ja_JP.utf8"
LC_TELEPHONE="ja_JP.utf8"
LC_MEASUREMENT="ja_JP.utf8"
LC_IDENTIFICATION="ja_JP.utf8"
LC_ALL=

○このlocaleコマンドでも、LANGに en_US.UTF-8 をセットして呼び出した。

エラーは出なくなった。

[root@2d82556b4724 ~]# LANG=en_US.UTF-8 locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=


○システムのデフォルト値と、LANG変数の継承

システムロケールは、en_US.UTF-8 になっていた。

[root@bb8b0b0cf804 ~]# localectl status
   System Locale: LANG=en_US.UTF-8
       VC Keymap: us
      X11 Layout: us

しかし、実際のLANG変数は、上記の明らかになったように、ja_JP.utf8になっていた。
これはSSH接続の際に、接続元のLANGを引き継いだからだと考えられる。
そのため、LANG変数が、ja_JP.utf8 にセットしなおされたのだろう。


○このことを確かめるため、接続元において、LANG=C を指定しSSH接続を行った。

LANG=Cを明示しsshコマンドでコンテナに再接続した。
今度は、LANG=C が継承されるはずである。

$ LANG=C ssh -p 222 root@192.168.10.3
root@192.168.10.3's password:
Last login:
manコマンドを実行してもエラーは発生しなかった。
[root@841b2757b89c ~]# man man

lsのマニュアルは、エラーは発生しないものの、表示されないままだった。
[root@2d82556b4724 ~]# man ls
No manual entry for ls
LANG変数は、C となっていた。
[root@2d82556b4724 ~]# echo $LANG
C
localeコマンドもエラーは発生しなかった。
[root@2d82556b4724 ~]# locale
LANG=C
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=
LANG変数が適切であれば、ロケールに関するエラーは発生しない。



■LANG=ja_JP.utf8 でもエラーが発生しないようにする。


○次のコマンドでシステムにおいて利用可能なロケールが一覧できる。

しかしこの中には、ja_JP.utf8 は存在していなかった。

[root@2d82556b4724 ~]# locale -a
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_COLLATE to default locale: No such file or directory

C
POSIX
en_AG
en_AG.utf8
en_AU
en_AU.iso88591
en_AU.utf8
en_BW
en_BW.iso88591
en_BW.utf8
en_CA
en_CA.iso88591
en_CA.utf8
en_DK
en_DK.iso88591
en_DK.utf8
en_GB
en_GB.iso88591
en_GB.iso885915
en_GB.utf8
en_HK
en_HK.iso88591
en_HK.utf8
en_IE
en_IE.iso88591
en_IE.iso885915@euro
en_IE.utf8
en_IE@euro
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ
en_NZ.iso88591
en_NZ.utf8
en_PH
en_PH.iso88591
en_PH.utf8
en_SG
en_SG.iso88591
en_SG.utf8
en_US
en_US.iso88591
en_US.iso885915
en_US.utf8
en_ZA
en_ZA.iso88591
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW
en_ZW.iso88591
en_ZW.utf8

○ja_JPロケールファイルは存在していた。

[root@2d82556b4724 ~]# ls /usr/share/i18n/locales/ | grep ja
ja_JP
しかし、UTF-8エンコーディングのja_JPロケールファイルは存在していない。
この場合、自分で作成する必要がある。(†1)


○ja_JP.UTF-8ロケールファイルを生成した。

[root@2d82556b4724 ~]# localedef -v -c -i ja_JP -f UTF-8 ja_JP.UTF-8 
/usr/share/i18n/locales/ja_JP:11: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:12: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:15: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:18: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:19: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:20: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:21: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:23: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:24: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:25: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:26: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:27: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:28: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:29: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:30: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:31: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:32: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:33: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:42: non-symbolic character value should not be used
/usr/share/i18n/locales/i18n:1425: non-symbolic character value should not be used
/usr/share/i18n/locales/i18n:1674: non-symbolic character value should not be used
/usr/share/i18n/locales/i18n:1719: non-symbolic character value should not be used
/usr/share/i18n/locales/i18n:1756: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:1675: non-symbolic character value should not be used
/usr/share/i18n/locales/ja_JP:1676: non-symbolic character value should not be used
/usr/share/i18n/locales/translit_neutral:10: non-symbolic character value should not be used
/usr/share/i18n/locales/translit_neutral:11: non-symbolic character value should not be used
/usr/share/i18n/locales/translit_neutral:12: non-symbolic character value should not be used
/usr/share/i18n/locales/translit_neutral:13: non-symbolic character value should not be used
/usr/share/i18n/locales/translit_neutral:14: non-symbolic character value should not be used
/usr/share/i18n/locales/translit_neutral:15: non-symbolic character value should not be used
/usr/share/i18n/locales/translit_neutral:16: non-symbolic character value should not be used
/usr/share/i18n/locales/translit_neutral:17: non-symbolic character value should not be used
LC_ADDRESS: field `country_name' not defined
LC_ADDRESS: field `country_post' not defined
LC_ADDRESS: field `country_car' not defined
LC_ADDRESS: field `country_isbn' not defined
LC_ADDRESS: field `lang_name' not defined
LC_ADDRESS: field `lang_term' not defined
LC_ADDRESS: field `lang_ab' not defined
LC_TELEPHONE: field `int_select' not defined
LC_IDENTIFICATION: field `audience' not defined
LC_IDENTIFICATION: field `application' not defined
LC_IDENTIFICATION: field `abbreviation' not defined
LC_IDENTIFICATION: no identification for category `LC_MEASUREMENT'
LC_CTYPE: table for class "upper": 1756 bytes
LC_CTYPE: table for class "lower": 1756 bytes
LC_CTYPE: table for class "alpha": 4320 bytes
LC_CTYPE: table for class "digit": 600 bytes
LC_CTYPE: table for class "xdigit": 600 bytes
LC_CTYPE: table for class "space": 856 bytes
LC_CTYPE: table for class "print": 5976 bytes
LC_CTYPE: table for class "graph": 5976 bytes
LC_CTYPE: table for class "blank": 856 bytes
LC_CTYPE: table for class "cntrl": 664 bytes
LC_CTYPE: table for class "punct": 4824 bytes
LC_CTYPE: table for class "alnum": 4320 bytes
LC_CTYPE: table for class "combining": 3152 bytes
LC_CTYPE: table for class "combining_level3": 2832 bytes
LC_CTYPE: table for class "jspace": 600 bytes
LC_CTYPE: table for class "jhira": 600 bytes
LC_CTYPE: table for class "jkata": 664 bytes
LC_CTYPE: table for class "jkanji": 3224 bytes
LC_CTYPE: table for class "jdigit": 600 bytes
LC_CTYPE: table for map "toupper": 16924 bytes
LC_CTYPE: table for map "tolower": 15388 bytes
LC_CTYPE: table for map "totitle": 16924 bytes
LC_CTYPE: table for map "tojhira": 2584 bytes
LC_CTYPE: table for map "tojkata": 3096 bytes
LC_CTYPE: table for width: 26712 bytes
(あるいは、localedef -f UTF-8 -i ja_JP ja_JP.utf8 でも可能だった。)


○再度、利用可能なロケール一覧を表示させた。

一番下に、ja_JP.utf8 ロケールが現れ、エラーが解消された。

[root@2d82556b4724 ~]# locale -a
C
POSIX
en_AG
en_AG.utf8
en_AU
en_AU.iso88591
en_AU.utf8
en_BW
en_BW.iso88591
en_BW.utf8
en_CA
en_CA.iso88591
en_CA.utf8
en_DK
en_DK.iso88591
en_DK.utf8
en_GB
en_GB.iso88591
en_GB.iso885915
en_GB.utf8
en_HK
en_HK.iso88591
en_HK.utf8
en_IE
en_IE.iso88591
en_IE.iso885915@euro
en_IE.utf8
en_IE@euro
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ
en_NZ.iso88591
en_NZ.utf8
en_PH
en_PH.iso88591
en_PH.utf8
en_SG
en_SG.iso88591
en_SG.utf8
en_US
en_US.iso88591
en_US.iso885915
en_US.utf8
en_ZA
en_ZA.iso88591
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW
en_ZW.iso88591
en_ZW.utf8
ja_JP.utf8


■manの動作確認

manのマニュアルは表示はできたが相変わらず英語表記だった。

[root@2d82556b4724 ~]# man man

一方、lsやcpコマンドのマニュアルは表示されるようになり、しかも日本語表記だった。

[root@2d82556b4724 ~]# man ls 
[root@2d82556b4724 ~]# man cp
CP(1)                                                                     ユーザーコマンド                                                                    CP(1)
名前
       cp - ファイルやディレクトリのコピーを行う
書式
       cp [OPTION]... [-T] SOURCE DEST
       cp [OPTION]... SOURCE... DIRECTORY
       cp [OPTION]... -t DIRECTORY SOURCE...
説明
       SOURCE から DEST へ、または複数の SOURCE を DIRECTORY へコピーします。

以上のことから、man-pages-ja パッケージを導入し、なおかつ、ja_JP.utf8ロケールが利用可能な場合に、lsやcpのマニュアルが日本語で表示できるのだとわかった。



■日時の表記について

上記の手順でロケールが利用可能になり、日時の表記は英語でなく日本語になった。

[root@4dd9c2c92bad ~]# date
2018年 12月 31日 月曜日 18:22:15 UTC

しかし、日本時間から9時間遅れていた。


○設定されているローカルタイム情報

[root@4dd9c2c92bad ~]# timedatectl status
      Local time: 月 2018-12-31 18:24:16 UTC
  Universal time: 月 2018-12-31 18:24:16 UTC
        RTC time: 月 2018-12-31 18:24:15
       Time zone: UTC (UTC, +0000)
     NTP enabled: n/a
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

○タイムゾーンをアジア/東京に設定

[root@4dd9c2c92bad ~]# timedatectl set-timezone Asia/Tokyo

状態の確認
[root@4dd9c2c92bad ~]# timedatectl status
      Local time: 火 2019-01-01 03:24:47 JST
  Universal time: 月 2018-12-31 18:24:47 UTC
        RTC time: 月 2018-12-31 18:24:46
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: n/a
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
日時の表示(日本時間)
[root@4dd9c2c92bad ~]# date
2019年  1月  1日 火曜日 03:24:55 JST


○timedatectlコマンドでなく次の方法でも可能

localtimeはバイナリだが、catで出力すると、UTC0という文字列が見えた。

[root@2d82556b4724 ~]# cat /etc/localtime
TZif2 UTCTZif2 UTC
UTC0
さきほどの/etc/localtimeバイナリファイルを、次のファイルで上書きした。

[root@2d82556b4724 ~]# cp /usr/share/zoneinfo/Japan /etc/localtime
cp: overwrite ‘/etc/localtime’? y

現在の日本時間で表示可能になった。

[root@2d82556b4724 ~]# date
2018年 11月 21日 水曜日 09:31:26 JST



■コミットしてイメージ化

設定が全て終わったら、コンテナを終了した後に、Dockerホスト側でイメージ化しておく。

コンテナを終了した。
[root@2d82556b4724 ~]# poweroff


Dockerホストに接続してコンテナをコミットした。
# docker commit 2d82556b4724 image-cetos7-ja

# docker image list | grep image-cetos7-ja
image-cetos7-ja                    latest              d8e8b34178ff        7 hours ago         683MB


◆glibc のアップデートで上記の設定が失われた。

〇アップデート後にロケールが失われた。

アップデート前
#  LANG=ja_JP.utf8 date
2018年 12月  8日 土曜日 19:21:09 JST

アップデート
# yum update glibc
Updated:
  glibc.x86_64 0:2.17-260.el7
Dependency Updated:
  glibc-common.x86_64 0:2.17-260.el7
Complete!

アップデート後
# LANG=ja_JP.utf8 date
Sat Dec  8 19:26:41 JST 2018

使用できるロケールがほとんど失われた。(上記のものと比較)
# locale -a
C
POSIX
en_US.utf8

〇再び日本用のロケールを追加した。

# localedef -v -c -i ja_JP -f UTF-8 ja_JP.UTF-8
# locale -a
C
POSIX
en_US.utf8
ja_JP.utf8
# LANG=ja_JP.utf8 date
2018年 12月  8日 土曜日 19:39:10 JST 

以上




<参考>

○ロケールの設定について

(1) locale: Cannot Set LC_ALL to default locale: No such file or directory.
< https://www.linuxquestions.org/questions/linux-general-1/locale-cannot-set-lc_all-to-default-locale-no-such-file-or-directory-218622/ > 2018年11月21日

・How to set up a clean UTF-8 environment in Linux
< https://perlgeek.de/en/article/set-up-a-clean-utf8-environment > 2018年11月21日

・【Linux入門】ローカライゼーションのためのロケール情報設定方法
< https://eng-entrance.com/linux-localization-locale > 2018年11月21日

・Linuxのローカライゼーション系LANG変数:langについて
< https://eng-entrance.com/linux-localization-lang > 2018年11月21日

・ロケールの確認・設定
< http://hogepon.net/2016/12/01/post-25/ > 2018年11月21日

・[CentOS]CentOS7でのロケール(locale)の確認及び変更
< https://zero-config.com/centos/changelocale-002.html > 2018年11月21日

・How to Set Up System Locale on CentOS 7
< https://www.rosehosting.com/blog/how-to-set-up-system-locale-on-centos-7/ > 2018年11月21日

・CentOS 7 コンテナに消えない日本語ロケールを追加する
< https://qiita.com/teruo-oshida/items/08cb84efc2b581b0a439 > 2018年11月21日


○manについて

・Centos7のmanコマンドを日本語化する
< https://www.linux.ambitious-engineer.com/?p=982 > 2018年11月21日

・No manual entry for man
< https://unix.stackexchange.com/questions/182500/no-manual-entry-for-man > 2018年11月21日

・How to install man pages on centos?
< https://unix.stackexchange.com/questions/252530/how-to-install-man-pages-on-centos > 2018年11月21日


○日時について
・【設定確認から変更方法まで】Linuxでのタイムゾーンの扱い方
< https://eng-entrance.com/linux-time-timezone > 2019年1月1日

・Vagrant の CentOS 6 の時計時刻や表記を日本対応させる手順
< https://weblabo.oscasierra.net/vagrant-centos6-japanize/ > 2018年11月21日




2018年11月19日月曜日

【Linux CentOS 7】(ベースコンテナの作成)Dockerコンテナにdnsmasqを導入しhostsファイルの仕組みを整える方法

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


コンテナの/etc/hostsを編集しても、コンテナのstopアンドstartで、データが初期化されてしまう。
そのため、dnsmasqを活用して、hostsファイルに似た仕組みを構成した。



ここで使用するコンテナは、(2)「【Linux CentOS 7】Dockerコンテナ(CentOS7公式)にsshd、rsyslog、Postfix、crondを導入した【Docker-ce 18.06.1.ce】」で構成したものである。

これは、もともと(1)「【Linux CentOS 7】Dockerコンテナへssh接続する方法や、コンテナのイメージ化、削除、起動方法などについて【Docker-ce 18.06.1.ce】」をベースにしたものである。

もし、rsyslog、Postfix、crondなどが不要であれば、(1)のコンテナから作業を継続しても良い。

いずれも下記のように、--privileged を与えて起動する。



■設定を行うコンテナの起動

○Dockerホストにおいてこのコンテナを起動させた。

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


○そして、コンテナにSSH接続を行った。

192.168.100.3は、Dockerホストである。
$ ssh -p 222 root@192.168.100.3
[root@923d1942dcbb ~]#

以下は、コンテナ内での作業となる。



■dnsmasqとテストツールのインストール

○dnsmasqのインストール

[root@923d1942dcbb ~]# yum install dnsmasq
Installed:
  dnsmasq.x86_64 0:2.76-5.el7                                                 
Complete!

○有効化

[root@923d1942dcbb ~]# systemctl enable dnsmasq
Created symlink from /etc/systemd/system/multi-user.target.wants/dnsmasq.service to /usr/lib/systemd/system/dnsmasq.service.
○起動

[root@923d1942dcbb ~]# systemctl start dnsmasq


○状態の確認

[root@923d1942dcbb ~]# systemctl status dnsmasq
dnsmasq.service - DNS caching server.
   Loaded: loaded (/usr/lib/systemd/system/dnsmasq.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2018-11-18 21:32:42 UTC; 6s ago
 Main PID: 876 (dnsmasq)
   CGroup: /docker/923d1942dcbb471c99fe1295b36836368fbccddfae4eb6c2ac7979cdcc5ff123/system.slice/dnsmasq.service
           └─876 /usr/sbin/dnsmasq -k
           ‣ 876 /usr/sbin/dnsmasq -k
Nov 18 21:32:42 923d1942dcbb systemd[1]: Started DNS caching server..
Nov 18 21:32:42 923d1942dcbb systemd[1]: Starting DNS caching server....
Nov 18 21:32:42 923d1942dcbb dnsmasq[876]: started, version 2.76 cachesize 150
Nov 18 21:32:42 923d1942dcbb dnsmasq[876]: compile time options: IPv6 GNU-ge...y
Nov 18 21:32:42 923d1942dcbb dnsmasq[876]: reading /etc/resolv.conf
Nov 18 21:32:42 923d1942dcbb dnsmasq[876]: using nameserver 192.168.100.1#53
Nov 18 21:32:42 923d1942dcbb dnsmasq[876]: read /etc/hosts - 7 addresses
Hint: Some lines were ellipsized, use -l to show in full.

○ツールのインストール(digコマンドが使えるようになる)

[root@923d1942dcbb ~]# yum install bind-utils
Installed:
  bind-utils.x86_64 32:9.9.4-61.el7_5.1                                       
Dependency Installed:
  GeoIP.x86_64 0:1.5.0-11.el7        bind-libs.x86_64 32:9.9.4-61.el7_5.1     
Complete!


■dnsmasqの設定

コンテナは、/etc/hostsファイルを編集しても、再起動すると消えてしまう。
そのため、このhostsファイルの役割を、dnsmasqに担わせる設定を行った。


○オリジナルファイルを退避させた。

[root@923d1942dcbb ~]# mv /etc/dnsmasq.conf /etc/dnsmasq.conf.org


○独自の設定を行った。

★dnsmasqの設定は「【Linux CentOS 6.7 64bit】dnsmasqでドメイン名に応じて問い合わせ先を自動切替することなど【dnsmasq】」を参考にした。

[root@923d1942dcbb ~]# vi /etc/dnsmasq.conf
domain-needed
bogus-priv
no-resolv
no-poll
#server=/local.example.co.jp/192.168.0.5
#server=/co.jp/com/209.244.0.3
#server=9.9.9.9
server=8.8.8.8
server=8.8.4.4
#server=208.67.220.220
local=/localdomain/
#address=/pc01.example.com/192.168.123.45
no-hosts
addn-hosts=/etc/dnsmasq_static_hosts.conf
expand-hosts

○dnsmasq用の静的hostsファイルを作成した。

[root@923d1942dcbb ~]# vi /etc/dnsmasq_static_hosts.conf
127.0.0.1 localhost
127.0.0.1 outgoing.postfix

○dnsmasqの再起動

[root@923d1942dcbb ~]# systemctl restart dnsmasq


○動作テスト

dnsmasq用の静的hostsファイルに登録済の名前を解決した。
[root@923d1942dcbb ~]# dig @127.0.0.1 outgoing.postfix
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1 <<>> @127.0.0.1 outgoing.postfix
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54525
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;outgoing.postfix. IN A
;; ANSWER SECTION:
outgoing.postfix. 0 IN A 127.0.0.1

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Nov 18 21:57:00 UTC 2018
;; MSG SIZE  rcvd: 61
登録したとおり、127.0.0.1が得られた。


上位のDNSサーバに問い合わせた。
[root@923d1942dcbb ~]# dig @127.0.0.1 google.com   

; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1 <<>> @127.0.0.1 google.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16879
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;google.com. IN A
;; ANSWER SECTION:google.com. 58 IN A 216.*.*.*
;; Query time: 14 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Nov 18 21:55:12 UTC 2018
;; MSG SIZE  rcvd: 55


これでDNSサーバーが127.0.0.1で動作しているので、
コンテナが名前解決用サーバーとしてこれを使うように設定する。

コンテナの作成時に、--dnsオプションで指定する必要があるので、
一旦コンテナをコミットしてイメージ化し、オプションを含めて、コンテナを作成する。

下記に示す。



■DNSオプションを付けてコンテナを再作成する

○一旦コンテナを終了した。

[root@923d1942dcbb ~]# poweroff


以下の作業は、Dockerホストで行う。

○状態の確認
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS                       PORTS                              NAMES

923d1942dcbb        image-centos7-ssh2    "/sbin/init"        2 days ago          Exited (130) 8 seconds ago                                      centos7-ssh

コンテナは終了した。


○コンテナをコミットしてイメージ化した。

コンテナ名はcentos7-sshで動作していた。イメージ名はcentos7-basic1とした。
[root@localhost ~]# docker commit centos7-ssh centos7-basic1
sha256:d63ba5e1370ad5535466b7b4bcfcb55e91ff971df572d03e8ebda1ef170ef417

○作成したイメージの確認

[root@localhost ~]# docker image list
REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
centos7-basic1                     latest              d63ba5e1370a        10 seconds ago      569MB

○作成したイメージからコンテナを動作させた。

(インターネットに直に接している場合、Dockerのデフォルトではiptablesを書き換えて外部からのアクセスを許してしまうことになってしまうため厳禁である。)
[root@localhost ~]# docker run --privileged -d -p 222:22 --dns=127.0.0.1 --name centos7-test centos7-basic1 /sbin/init
WARNING: Localhost DNS setting (--dns=127.0.0.1) may fail in containers.
fdd3310372de70801cf6af3c6b95b6e0d325d2a6f1c1782a4bbc319a71c84f19
警告が出ているが、ここで指定している127.0.0.1はホスト上での意味はなくて、コンテナを指しているので問題ない。


○コンテナにSSH接続した。

192.168.100.3は、Dockerホストである。
このコンテナは、「【Linux CentOS 7】Dockerコンテナへssh接続する方法や、コンテナのイメージ化、削除、起動方法などについて【Docker-ce 18.06.1.ce】」をベースにしている。

$ ssh -p 222 root@192.168.100.3
[root@fdd3310372de ~]#

○既に設定済みのdnsmasqに登録したホスト名を名前解決できるか試した。

[root@fdd3310372de ~]# ping outgoing.postfix
PING outgoing.postfix (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.040 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.073 ms
^C
--- outgoing.postfix ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.040/0.056/0.073/0.018 ms
名前解決ができた。




<参考>
・Configure container DNS
< https://docs.docker.com/v17.09/engine/userguide/networking/default_network/configure-dns/ > 2018年11月19日

・コンテナの DNS を設定
< http://docs.docker.jp/engine/userguide/networking/default_network/donfigure-dns.html > 2018年11月19日

・2018/07/24(25?)のChrome68に備えて既存カスタムドメインのGitHub Pagesを常時SSL化 + digの使い方覚書
< https://qiita.com/beta_chelsea/items/ea8c890d9c9eb634d3c1 > 2018年11月19日

・いつからか、メールが送信できなくなっていたので暫定対処した
< https://risaiku.net/archives/4430/ > 2018年11月19日

2018年11月18日日曜日

【Linux CentOS 7】Dockerコンテナにボリュームをマウントしデータを永続化させる方法/ボリュームのバックアップ方法【Docker-ce 18.06.1.ce】

2018年11月27日 バックアップ方法の追加

コンテナはイメージから作成される。
コンテナ動作後に追加保存されたデータは、コンテナの消滅とともに失われる。

そのためデータを永続させるためには、ボリューム等を使う必要がある。
ボリュームは、Dockerにボリューム操作用の専用コマンドが用意されている。

他にも、Dockerホスト上のディレクトリを直接マウントする方法もあるが、
ここでは扱わない。


Dockerは、「【Linux CentOS 7】Dockerをyumでインストールする手順と簡単な動作テスト【Docker-ce 18.06.1.ce】」の手順でインストールした。



<手順の概要>

(ボリュームの作成)
・Dockerホストにおいて、まずボリュームを作成する。

(データボリュームコンテナの作成)
・このボリュームを、任意のディレクトリにマウントするコンテナを作成する。
これをデータボリュームコンテナと呼ぶ。

(メインコンテナの作成)
・さらにこのデータボリュームコンテナを、メインのコンテナにアタッチする。
すると、メインのコンテナは、データボリュームコンテナが使用するボリュームを使用できるようになる。
マウント先も自動で、データボリュームコンテナと同じ位置となる。



■ボリュームを作成

○testdata-volという名前の「空のボリューム」を作成した。
[root@localhost ~]# docker volume create testdata-vol
testdata-vol
○ボリュームの一覧の表示
[root@localhost ~]# docker volume list
DRIVER              VOLUME NAME
local               testdata-vol
○ボリュームの詳細表示
[root@localhost ~]# docker volume inspect testdata-vol
[
    {
        "CreatedAt": "2018-11-17T18:16:33-05:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/testdata-vol/_data",
        "Name": "testdata-vol",
        "Options": {},
        "Scope": "local"
    }
]

ホスト上のディレクトリに専用のディレクトリが設けられていた。
[root@localhost ~]# ls /var/lib/docker/volumes/
metadata.db   testdata-vol/ 
[root@localhost ~]# ls /var/lib/docker/volumes/testdata-vol/_data/

空だった。



■データボリュームコンテナの作成

作成済みボリューム「testdata-vol」を、/DATA にマウントするコンテナを作成した。
cetos7公式イメージを用いた。

このコンテナは、データボリュームコンテナとして用いるものなので動作させなくて良い。
(ただし、後で示すように動作するように設定しなおした。)

このデータボリュームコンテナには/DATAディレクトリがないので、/DATAディレクトリが新規作成され、ここに先のボリュームがマウントされる。


[root@localhost ~]# docker run -d --name testdatacont --mount source=testdata-vol,target=/DATA centos:centos7
0c808ad99adcf7db2be8cc0468cdb665d66186242f5593bb0a78962f4109b170
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS                      PORTS                              NAMES
0c808ad99adc        centos:centos7        "/bin/bash"         35 seconds ago      Exited (0) 34 seconds ago                                      testdatacont
起動コマンドで、-itと、/bin/bash を指定しなかったので、すぐに終了した。


○ところで、もしも、/DATAディレクトリが既にこのコンテナに存在していて中にファイルやディレクトリが存在していれば、マウントしようとしている「空のボリューム」にそれらが自動的にコピーされる。

例えば、Dockerイメージ「image-app1-20181128」の「/var/spool」のデータを全て、空のボリューム「vol_app1_var-spool」にコピーしたいとする。
これを意図して行うためには、次のようにコンテナをrunすればよかった。
(ただしコピー先のボリュームが空であることが重要。)

# docker run --net closednet --mount source=vol_app1_var-spool,target=/var/spool image-app1-20181128 nocommand

このイメージからコンテナが実行される前に、自動的にターゲットディレクトリの中身がボリュームにコピーされ満たされてから、ボリュームがターゲットディレクトリにマウントされる。
ただし、ここでは、イメージ内のファイルをボリュームに移すことが目的だから、コンテナが実行できないようなファイル名「nocommand」を指定しておく。
次のようなエラーが出て終了するが、目的は達成されている。(# ls /var/lib/docker/volumes/で確認する。)
docker: Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"nocommand\": executable file not found in $PATH": unknown.
ERRO[0000] error waiting for container: context canceled

また、イメージによっては勝手にポートを解放して、iptablesの内容を変更するものがあるので、--netオプションを用いている。これについてはここでは解説していない。



■メインコンテナの作成

このコンテナがメインである。名前を「test」とした。

上で作成したデータボリュームコンテナ「testdatacont」をボリュームとして使用する。
これによってこのコンテナには自動的に、データボリュームコンテナの/DATAがマウントされる。
つまり、ボリューム「testdata-vol」が利用できる。

[root@localhost ~]# docker run -d -it --name test --volumes-from testdatacont centos:centos7 /bin/bash
292e3bc0ec62ed5feaa9e766c3ae0b0fc063a9a7a705de450a09d102d99ffba9
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS                     PORTS                              NAMES292e3bc0ec62        centos:centos7        "/bin/bash"         3 seconds ago       Up 1 second                                                   test0c808ad99adc        centos:centos7        "/bin/bash"         9 minutes ago       Exited (0) 9 minutes ago                                      testdatacont


○動作テスト

メインコンテナのコンソールを表示
[root@localhost ~]# docker exec -it test /bin/bash
[root@292e3bc0ec62 /]#
ルートディレクトリ内にDATAが作成されているか確認
[root@292e3bc0ec62 /]# ls /
DATA  anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@292e3bc0ec62 /]# ls / -al
total 12
drwxr-xr-x   1 root root    18 Nov 17 23:11 .
drwxr-xr-x   1 root root    18 Nov 17 23:11 ..
-rwxr-xr-x   1 root root     0 Nov 17 23:11 .dockerenv
drwxr-xr-x   2 root root     6 Nov 17 22:56 DATA
(省略)

DATAディレクトリにファイルを保存した。
[root@292e3bc0ec62 /]# mkdir DATA/box     
[root@292e3bc0ec62 /]# touch DATA/box/text.txt
[root@292e3bc0ec62 /]# echo test >> DATA/box/text.txt
[root@292e3bc0ec62 /]# cat DATA/box/text.txt
test
日時が更新されていることを確認
[root@292e3bc0ec62 /]# ls / -al
total 12
drwxr-xr-x   1 root root    18 Nov 17 23:11 .
drwxr-xr-x   1 root root    18 Nov 17 23:11 ..
-rwxr-xr-x   1 root root     0 Nov 17 23:11 .dockerenv
drwxr-xr-x   3 root root    17 Nov 17 23:16 DATA
(省略)


ボリュームについてDockerホスト側でも更新を確認してみた。
[root@localhost ~]# ls /var/lib/docker/volumes/testdata-vol/_data/
box
[root@localhost ~]# ls /var/lib/docker/volumes/testdata-vol/_data/ -al
合計 0
drwxr-xr-x 3 root root 17 11月 17 18:16 .
drwxr-xr-x 3 root root 19 11月 17 17:56 ..
drwxr-xr-x 2 root root 22 11月 17 18:16 box
[root@localhost ~]# cat /var/lib/docker/volumes/testdata-vol/_data/box/text.txt
test
Dockerホスト側のボリュームに直接アクセスして、ファイルを表示させられた。



■ボリュームの削除テスト

[root@localhost ~]# docker volume rm testdata-vol
Error response from daemon: remove testdata-vol: volume is in use - [0c808ad99adcf7db2be8cc0468cdb665d66186242f5593bb0a78962f4109b170, 292e3bc0ec62ed5feaa9e766c3ae0b0fc063a9a7a705de450a09d102d99ffba9]
ボリュームは、データボリュームコンテナと、コンテナが使用しているため削除できない。

しかし、停止中のデータボリュームコンテナは削除できてしまうので注意。
そこで、続いて、データボリュームコンテナが削除できないように、動作した状態にした。
そうして、一連の手順を試した。



■ボリュームはそのままでもう一度、一連の手順

★予め、データボリュームコンテナと、メインコンテナは削除しておいた。
ただし、ボリュームはそのままにしている。


○データボリュームコンテナの作成(動作させておく)

データボリュームコンテナの名称は同じように、testdatacont とした。
ボリューム testdata-vol をマウントソースとし、/DATAディレクトリにマウントする。
今度は、動作するようにした。

[root@localhost ~]# docker run -d -it --name testdatacont --mount source=testdata-vol,target=/DATA centos:centos7 /bin/bash
3949ab31aea7886937772c2358bc8ffc16def7ee9e4026161011cfa9f4d48905
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS                       PORTS                              NAMES3949ab31aea7        centos:centos7        "/bin/bash"         2 seconds ago       Up 1 second                                                     testdatacont


○メインコンテナの作成

こちらは、最初のコマンドと同じ

[root@localhost ~]# docker run -d -it --name test --volumes-from testdatacont centos:centos7 /bin/bash
8cda669bbb74f53abf2d2477fb68771d75d99be527420889b9dc7fd571849716
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED              STATUS              PORTS                              NAMES8cda669bbb74        centos:centos7        "/bin/bash"         4 seconds ago        Up 2 seconds                                           test
3949ab31aea7        centos:centos7        "/bin/bash"         About a minute ago   Up About a minute                                      testdatacont


○再び動作テスト

メインコンテナのコンソールを表示
[root@localhost ~]# docker exec -it test /bin/bash
[root@8cda669bbb74 /]#
ボリュームはそのままだったので、前のデータが残っていることを確認
[root@8cda669bbb74 /]# ls DATA/box/text.txt
DATA/box/text.txt
[root@8cda669bbb74 /]# cat DATA/box/text.txt
test


■ボリュームのバックアップ方法


testdatacontデータコンテナーはvolumeを/DATAにマウントしている。
そしてこのtestdatacontデータコンテナーはメインコンテナにアタッチされている。
これによってメインコンテナは、volumeを/DATAに自動マウントしている。

今同様に、バックアップを作業するコンテナを新規作成し、testdatacontデータコンテナをアタッチすることで、自動的にvolume/DATAにマウントさせる。
さらにバックアップを作業するコンテナには、バックアップ先ディレクトリもマウントしておく。
今回はこの/DATAをバックアップ先ディレクトリへバックアップする。

  →はマウントの方向

▲メインコンテナとデータコンテナの関係

testdata-vol(ボリューム)---></DATA>testdatacont(データコンテナ)---></DATA>test(メインコンテナ)


▲バックアップ作業用コンテナとデータコンテナの関係

testdata-vol(ボリューム)---></DATA>testdatacont(データコンテナ)---></DATA>(バックアップ作業用コンテナ)</backup><---(ホスト上のバックアップ先ディレクトリ$(pwd)


したがって、手順は次の通りである。

○ホストマシン上のバックアップ先ディレクトリに移動

移動後にディレクトリのパスは、pwdコマンドで取得できる
# cd /root/backup/docker/test


○作業用コンテナが行うバックアップ作業

# docker run --volumes-from testdatacont -v $(pwd):/backup centos:centos7 tar cvfz /backup/volume_test_20181126.tgz /DATA

testdatacont データコンテナがメインコンテナにマウントされる。
(上で見てきたように、このデータコンテナは /DATA にボリュームをマウントしているものなので、この操作を行うことで、自動的にメインコンテナの /DATA にマウントされる。)

-v で、カレントディレクトリ(ここでは、/root/backup/docker/test)を、メインコンテナの /backup にマウントする。

イメージは、centos7を使う。

tar以下は、作業用コンテナが実行するバックアップ処理内容である。
/DATA(ボリュームに繋る)を、/backup/volume_test_20181126.tgz(ホスト上のファイルに繋る)にtarでコピーして圧縮して一つのファイルに梱包している。

完了後は、ホスト上のファイル操作で任意の方法で保管しておく。


以上




<参考>
・Use volumes
< https://docs.docker.com/storage/volumes/ > 2018年11月27日

・コンテナでデータを管理する
< http://docs.docker.jp/engine/userguide/dockervolumes.html > 2018年11月18日

・Dockerのデータボリュームをバックアップ・リストア
< https://www.lancard.com/blog/2016/09/06/docker%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%83%9C%E3%83%AA%E3%83%A5%E3%83%BC%E3%83%A0%E3%82%92%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%83%BB%E3%83%AA%E3%82%B9%E3%83%88%E3%82%A2/ > 2018年11月18日

・DockerでCentOS 7のイメージを利用してみよう
< https://weblabo.oscasierra.net/docker-centos7/ > 2018年11月18日

2018年11月17日土曜日

【Linux CentOS 7】(ベースコンテナの作成)Dockerコンテナ(CentOS7公式)にsshd、rsyslog、Postfix、crondを導入した【Docker-ce 18.06.1.ce】

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


使用したDockerイメージは下記のページのコンテナからcommitにより作成したものである。
これにより、sshdの導入と、リモート接続もできるようになった。

【Linux CentOS 7】Dockerコンテナへssh接続する方法や、コンテナのイメージ化、削除、起動方法などについて
http://akira-arets.blogspot.com/2018/11/linux-centos-docker-ssh.html


以下では、さらに、rsyslog、Postfix、crondの導入を行った。



○Dockerホストのカーネルは次のバージョンである。

# uname -a
Linux localhost.localdomain 3.10.0-862.11.6.el7.x86_64 #1 SMP Tue Aug 14 21:49:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

また、Dockerのバージョンは次の通り。
名前                : docker-ce
アーキテクチャー    : x86_64
バージョン          : 18.06.1.ce
リリース            : 3.el7
容量                : 168 M
リポジトリー        : installed
提供元リポジトリー  : docker-ce-stable


○Dockerホストにおいて、上記のイメージと手順によりコンテナを起動した。

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



○そして、このコンテナ内で設定作業するためコンテナにssh接続した。

$ ssh -p 222 root@192.168.10.3
[root@a42dafc368d1 ~]#


Postfixの設定の前に、rsyslogの導入を行った方が良い。
メールの送信がうまくいかないなど問題を把握するためにはログは必須である。

初期状態では、ログファイルを調べてみたが存在せず、rsyslogが入っていないことがわかった。
[root@a42dafc368d1 postfix]# tail /var/log/
btmp                grubby_prune_debug  lastlog             tallylog            wtmp                yum.log


■rsyslogの導入

○rsyslogのインストール
[root@a42dafc368d1 postfix]# yum install rsyslog
Installed:
  rsyslog.x86_64 0:8.24.0-16.el7_5.4                                                                                                                               
Dependency Installed:
  libestr.x86_64 0:0.1.9-2.el7                         libfastjson.x86_64 0:0.99.4-2.el7                         logrotate.x86_64 0:3.8.6-15.el7                   
Complete!

○rsyslogの有効化
[root@a42dafc368d1 ~]# systemctl enable rsyslog

○rsyslogの起動
[root@a42dafc368d1 ~]# systemctl start rsyslog

○状態の確認
[root@a42dafc368d1 ~]# systemctl status rsyslog
rsyslog.service - System Logging Service
   Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2018-11-15 21:53:10 UTC; 6s ago
     Docs: man:rsyslogd(8)
           http://www.rsyslog.com/doc/
 Main PID: 325 (rsyslogd)
   CGroup: /docker/a42dafc368d16f027930c57b4b4c1b779ab9f1a48e45851b3a0329d08a8df566/system.slice/rsyslog.service
           └─325 /usr/sbin/rsyslogd -n
           ‣ 325 /usr/sbin/rsyslogd -n
Nov 15 21:53:10 a42dafc368d1 systemd[1]: Starting System Logging Service...
Nov 15 21:53:10 a42dafc368d1 rsyslogd[325]:  [origin software="rsyslogd" swVersion="8.24.0" x-pid="325" x-info="http://www.rsyslog.com"] start
Nov 15 21:53:10 a42dafc368d1 systemd[1]: Started System Logging Service.

次に、Postfixの作業を行った。



■Postfixの導入

○インストール

[root@a42dafc368d1 ~]# yum install postfix
Installed:
  postfix.x86_64 2:2.10.1-6.el7                                                                                                                                       
Dependency Installed:
  mariadb-libs.x86_64 1:5.5.60-1.el7_5                                               systemd-sysv.x86_64 0:219-57.el7_5.3                                           
Complete!

○Postfixの有効化を行い、再起動で自動的に動作するようにした。
[root@a42dafc368d1 ~]# systemctl enable postfix

○Postfixの起動
[root@a42dafc368d1 ~]# systemctl start postfix
Job for postfix.service failed because the control process exited with error code. See "systemctl status postfix.service" and "journalctl -xe" for details.

エラーが発生したので調査した。
下記の通り、IPv6インターフェイスが存在していないためエラーになっているようだ。

[root@a42dafc368d1 ~]# systemctl status postfix
● postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Thu 2018-11-15 21:29:51 UTC; 6s ago
  Process: 175 ExecStart=/usr/sbin/postfix start (code=exited, status=1/FAILURE)
  Process: 174 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, status=0/SUCCESS)
  Process: 171 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, status=75)
Nov 15 21:29:49 a42dafc368d1 systemd[1]: Starting Postfix Mail Transport Agent...
Nov 15 21:29:49 a42dafc368d1 aliasesdb[171]: /usr/sbin/postconf: fatal: parameter inet_interfaces: no local interface found for ::1
Nov 15 21:29:50 a42dafc368d1 postfix/sendmail[173]: fatal: parameter inet_interfaces: no local interface found for ::1
Nov 15 21:29:50 a42dafc368d1 aliasesdb[171]: newaliases: fatal: parameter inet_interfaces: no local interface found for ::1
Nov 15 21:29:50 a42dafc368d1 postfix[175]: fatal: parameter inet_interfaces: no local interface found for ::1
Nov 15 21:29:51 a42dafc368d1 systemd[1]: postfix.service: control process exited, code=exited status=1
Nov 15 21:29:51 a42dafc368d1 systemd[1]: Failed to start Postfix Mail Transport Agent.
Nov 15 21:29:51 a42dafc368d1 systemd[1]: Unit postfix.service entered failed state.
Nov 15 21:29:51 a42dafc368d1 systemd[1]: postfix.service failed.

(以下からコンテナIDが代わりますが無視してください。)


○PostfixにおいてIPv6を無効化した。

デフォルト値はIPv4だけでなく、IPv6も有効になっている。
[root@923d1942dcbb ~]# postconf -d inet_protocols
inet_protocols = all
IPv4のみ利用するように設定した。
[root@923d1942dcbb ~]# postconf -e inet_protocols=ipv4

設定した値の確認を行った。
[root@923d1942dcbb ~]# postconf -n inet_protocols
inet_protocols = ipv4

○Postfixの起動を再び試みた。

[root@923d1942dcbb ~]# systemctl start postfix

今度はエラーが発生しなかった。


状態を確認した。
[root@923d1942dcbb ~]# systemctl status postfix
postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2018-11-16 16:03:18 UTC; 28s ago
  Process: 109 ExecStart=/usr/sbin/postfix start (code=exited, status=0/SUCCESS)
  Process: 108 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, status=0/SUCCESS)
  Process: 106 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, status=0/SUCCESS)
 Main PID: 180 (master)
   CGroup: /docker/923d1942dcbb471c99fe1295b36836368fbccddfae4eb6c2ac7979cdcc5ff123/system.slice/postfix.service
           ├─180 /usr/libexec/postfix/master -w
           ├─181 pickup -l -t unix -u
           └─182 qmgr -l -t unix -u
           ‣ 180 /usr/libexec/postfix/master -w
Nov 16 16:03:17 923d1942dcbb systemd[1]: Starting Postfix Mail Transport Agent...
Nov 16 16:03:18 923d1942dcbb postfix/master[180]: daemon started -- version 2.10.1, configuration /etc/postfix
Nov 16 16:03:18 923d1942dcbb systemd[1]: Started Postfix Mail Transport Agent.
動作していることがわかった。


ところで、/etc/hostsの「::1」部分をコメントアウトすることでも、Postfixは起動できたが、
コンテナの再起動に伴ってこのファイルは元に戻ってしまうため、再起動後にPostfixのに失敗した。
そのため、上述の通り、Postfixの設定でIPv6の使用をしないようにした方が良い。
[root@a42dafc368d1 postfix]# vi /etc/hosts
127.0.0.1       localhost
#::1    localhost ip6-localhost ip6-loopbackfe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2      a42dafc368d1


○メール送信テスト

[root@a42dafc368d1 postfix]# echo test | sendmail -f from@example.com to@example.com

送信テストをしたがメールがうまく配送されなかった。


Postfixはデフォルトでsyslogを利用する設定になっている。
[root@a42dafc368d1 postfix]# postconf -d syslog_facility
syslog_facility = mail
maillogというログファイルを確認する。
[root@a42dafc368d1 postfix]# less /var/log/maillog   
btmp                lastlog             messages            spooler             wtmp             
grubby_prune_debug  maillog             secure              tallylog            yum.log


ログによると、相手先SMTPサーバーとの接続でConnection time out になっていた
この際、25番ポートにダイレクトに接続しにいっていることがわかった。
そのため、ISPの25番ポートフィルタに引っかかってしまっているのだと考えた。

そのため、直接に相手先SMTPに接続するのはやめて、ISPなどのSMTPサーバにリレーするようにした


プライベートネットワーク内に準備しておいた上位SMTPサーバーにリレーするようにした。
[root@a42dafc368d1 postfix]# postconf -e "relayhost = xxx.example.com"

詳しくは、下記ページを参考にしてください。
【Postfix 2.6.6 x86_64】リレーの設定について【Linux CentOS 6.5 64bit】
https://akira-arets.blogspot.com/2015/05/postfix-266-x8664linux-centos-65-64bit.html


Postfixの再起動を行った。
[root@a42dafc368d1 postfix]# systemctl restart postfix

ログを確認した。
[root@a42dafc368d1 postfix]# tail /var/log/maillog
Nov 15 22:11:05   postfix/smtp[657]: : to=<user@example.com>, relay=xxx.example.com:25, delay=396, delays=396/0.02/0.13/0.07, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as )
Nov 15 22:11:05   postfix/qmgr[654]: : removed

これでメールの送信ができるようになった。

さらに、Crontabが使えるようにした。



■crondの導入

○パッケージのインストール(CentOS 7以外では、別の方法が必要。)
[root@a42dafc368d1 ~]# yum install cronie
Installed:
  cronie.x86_64 0:1.4.11-19.el7                                               
Dependency Installed:
  cronie-anacron.x86_64 0:1.4.11-19.el7                                       
  crontabs.noarch 0:1.11-6.20121102git.el7                                   
Complete!

○有効化
[root@a42dafc368d1 ~]# systemctl enable crond

○起動
[root@a42dafc368d1 ~]# systemctl start crond

○状態の確認
[root@a42dafc368d1 ~]# systemctl status crond
 crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2018-11-16 15:10:17 UTC; 8s ago
 Main PID: 737 (crond)
   CGroup: /docker/a42dafc368d16f027930c57b4b4c1b779ab9f1a48e45851b3a0329d08a8df566/system.slice/crond.service
           └─737 /usr/sbin/crond -n
           ‣ 737 /usr/sbin/crond -n
Nov 16 15:10:17 a42dafc368d1 crond[737]: (CRON) INFO (RANDOM_DELAY will be scaled with ...d.)
Nov 16 15:10:17 a42dafc368d1 systemd[1]: Started Command Scheduler.
Nov 16 15:10:17 a42dafc368d1 crond[737]: (CRON) INFO (running with inotify support)
Nov 16 15:10:17 a42dafc368d1 systemd[1]: Starting Command Scheduler...
Hint: Some lines were ellipsized, use -l to show in full.

○動作テストのための設定を追加

毎分、空の行をtestファイルに追記するようにした。
[root@a42dafc368d1 ~]# crontab -e
* * * * * /usr/bin/echo >> /root/test
:wqで保存すると、次のように表示された。
crontab: installing new crontab 
crondが起動していなければ、次のエラーが発生した。
no crontab for root - using an empty one
crontab: installing new crontab

しばらく待ってから、testファイルの存在を確認した。
[root@a42dafc368d1 ~]# ls
anaconda-ks.cfg  test
毎分、空の行も追記されていることがわかった。



◆コンテナのディスク、メモリ、プロセスがどうなっているか確認した。

○ディスクの使用状態を確認した。

[root@923d1942dcbb ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          16G  9.9G  5.9G  63% /
tmpfs            64M     0   64M   0% /dev
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/vda5        16G  9.9G  5.9G  63% /etc/hosts
shm              64M     0   64M   0% /dev/shm
tmpfs           2.0G  8.5M  2.0G   1% /run
tmpfs           405M     0  405M   0% /run/user/0

○メモリの使用状態を確認した。(Dockerホスト側のfreeコマンドと同じ結果となった。)

[root@923d1942dcbb ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           4.0G        170M        3.1G         16M        666M        3.5G
Swap:            0B          0B          0B

○プロセスの状態を確認した。

[root@923d1942dcbb ~]# top
top - 21:12:34 up 23:58,  1 user,  load average: 1.00, 1.01, 1.05
Tasks:  15 total,   1 running,  14 sleeping,   0 stopped,   0 zombie
%Cpu(s): 10.3 us, 37.9 sy,  0.0 ni, 51.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  4142136 total,  3284724 free,   175016 used,   682396 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  3707996 avail Mem
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND   
    1 root      20   0   43176   3316   2336 S   0.0  0.1   0:00.26 systemd   
   17 root      20   0   39080   3016   2708 S   0.0  0.1   0:00.13 systemd-jo+
   25 root      20   0   41624   1732   1196 S   0.0  0.0   0:00.16 systemd-ud+
   45 root      20   0  112812   4212   3188 S   0.0  0.1   0:00.00 sshd     
   46 root      20   0  218504   4248   2680 S   0.0  0.1   0:02.13 rsyslogd 
   49 root      20   0   26376   1612   1324 S   0.0  0.0   0:00.05 systemd-lo+
   50 dbus      20   0   58064   2244   1744 S   0.0  0.1   0:00.04 dbus-daemon
   57 root      20   0   26100   1564    924 S   0.0  0.0   0:00.03 crond     
   58 root      20   0    9904    824    696 S   0.0  0.0   0:00.00 agetty   
  139 root      20   0   89632   2120   1088 S   0.0  0.1   0:00.12 master   
  141 postfix   20   0   89804   4012   3008 S   0.0  0.1   0:00.03 qmgr     
  234 postfix   20   0   89736   3988   2992 S   0.0  0.1   0:00.02 pickup   
  235 root      20   0  155232   6028   4680 S   0.0  0.1   0:00.09 sshd     
  237 root      20   0   15224   1836   1460 S   0.0  0.0   0:00.01 bash     
  252 root      20   0   59580   1900   1396 R   0.0  0.0   0:00.01 top



◆Dockerホストの状態についても同様に確認した。

○Dockerホスト側のディスクの状態

[root@localhost ~]# df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置/dev/vda5         16G  9.9G  5.9G   63% /
devtmpfs         2.0G     0  2.0G    0% /dev
tmpfs            2.0G     0  2.0G    0% /dev/shm
tmpfs            2.0G  8.7M  2.0G    1% /run
tmpfs            2.0G     0  2.0G    0% /sys/fs/cgroup
/dev/vda2        2.0G   33M  2.0G    2% /tmp
/dev/vda1        473M  139M  335M   30% /boot
overlay           16G  9.9G  5.9G   63% /var/lib/docker/overlay2/eac780341079bd52807cb38bb0e99c75eb7af51132f529d953ac62ab12629515/merged
shm               64M     0   64M    0% /var/lib/docker/containers/923d1942dcbb471c99fe1295b36836368fbccddfae4eb6c2ac7979cdcc5ff123/mounts/shm
tmpfs            405M     0  405M    0% /run/user/0

○Dockerホスト側のfreeコマンドの結果(コンテナと同じ情報となった)

[root@localhost ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           4.0G        171M        3.1G         17M        667M        3.5G
Swap:            0B          0B          0B

○プロセスの一覧

(コンテナで動作中のプロセスsystemdなどが見えている。)
[root@localhost ~]# ps -A
  PID TTY          TIME CMD         
    1 ?        00:00:02 systemd
    2 ?        00:00:00 kthreadd
    3 ?        00:00:00 ksoftirqd/0
    5 ?        00:00:00 kworker/0:0H
    7 ?        00:00:00 migration/0
    8 ?        00:00:00 rcu_bh
    9 ?        00:00:06 rcu_sched
   10 ?        00:00:00 lru-add-drain
   11 ?        00:00:00 watchdog/0
   12 ?        00:00:00 watchdog/1
   13 ?        00:00:00 migration/1
   14 ?        00:00:00 ksoftirqd/1
   16 ?        00:00:00 kworker/1:0H
   18 ?        00:00:00 kdevtmpfs
   19 ?        00:00:00 netns
   20 ?        00:00:00 khungtaskd
   21 ?        00:00:00 writeback
   22 ?        00:00:00 kintegrityd
   23 ?        00:00:00 bioset
   24 ?        00:00:00 bioset
   25 ?        00:00:00 bioset
   26 ?        00:00:00 kblockd
   27 ?        00:00:00 md
   28 ?        00:00:00 edac-poller
   31 ?        00:00:00 kswapd0
   32 ?        00:00:00 ksmd
   33 ?        00:00:00 khugepaged
   34 ?        00:00:00 crypto
   42 ?        00:00:00 kthrotld
   44 ?        00:00:00 kmpath_rdacd
   45 ?        00:00:00 kaluad
   47 ?        00:00:00 kpsmoused
   48 ?        00:00:00 ipv6_addrconf
   61 ?        00:00:00 deferwq
   94 ?        00:00:00 kauditd
  225 ?        00:00:00 ata_sff
  230 ?        00:00:00 kworker/0:1H
  233 ?        00:00:00 scsi_eh_0
  234 ?        00:00:00 scsi_tmf_0
  235 ?        00:00:00 scsi_eh_1
  236 ?        00:00:00 scsi_tmf_1
  251 ?        00:00:00 ttm_swap
  265 ?        00:00:00 bioset
  266 ?        00:00:00 xfsalloc
  267 ?        00:00:00 xfs_mru_cache
  268 ?        00:00:00 xfs-buf/vda5
  269 ?        00:00:00 xfs-data/vda5
  270 ?        00:00:00 xfs-conv/vda5
  271 ?        00:00:00 xfs-cil/vda5
  272 ?        00:00:00 xfs-reclaim/vda
  273 ?        00:00:00 xfs-log/vda5
  274 ?        00:00:00 xfs-eofblocks/v
  275 ?        00:00:04 xfsaild/vda5
  344 ?        00:00:00 systemd-journal
  367 ?        00:00:00 lvmetad
  375 ?        00:00:00 systemd-udevd
  416 ?        00:00:00 xfs-buf/vda1
  417 ?        00:00:00 xfs-data/vda1
  418 ?        00:00:00 xfs-conv/vda1
  419 ?        00:00:00 xfs-cil/vda1
  420 ?        00:00:00 xfs-reclaim/vda
  421 ?        00:00:00 xfs-log/vda1
  422 ?        00:00:00 xfs-eofblocks/v
  423 ?        00:00:00 xfsaild/vda1
  427 ?        00:00:00 xfs-buf/vda2
  428 ?        00:00:00 xfs-data/vda2
  429 ?        00:00:00 xfs-conv/vda2
  430 ?        00:00:00 xfs-cil/vda2
  431 ?        00:00:00 xfs-reclaim/vda
  434 ?        00:00:00 xfs-log/vda2
  436 ?        00:00:00 xfs-eofblocks/v
  437 ?        00:00:00 xfsaild/vda2
  451 ?        00:00:00 kworker/1:1H
  457 ?        00:00:00 auditd
  480 ?        00:00:00 systemd-logind
  481 ?        00:00:00 dbus-daemon
  483 ?        00:00:00 polkitd
  484 ?        00:00:03 NetworkManager
  485 ?        00:00:05 irqbalance
  489 ?        00:00:00 qemu-ga
  494 ?        00:00:00 crond
  503 ?        00:00:00 chronyd
  551 ?        00:00:00 dhclient
  761 ?        00:00:20 tuned
  763 ?        00:00:00 sshd
  764 ?        00:00:09 rsyslogd
  862 ?        00:00:00 master
  864 ?        00:00:00 qmgr
  889 ?        00:03:52 dockerd
  896 ?        00:02:49 docker-containe
 1554 ?        23:56:27 agetty
 3962 ?        00:00:00 kworker/u4:0
 4704 ?        00:00:00 kworker/u4:1
 4726 ?        00:00:20 kworker/0:3
 4815 ?        00:00:00 docker-proxy
 4821 ?        00:00:00 docker-containe
 4837 ?        00:00:00 systemd (コンテナ内のsystemd)
 4884 ?        00:00:00 systemd-journal
 4895 ?        00:00:00 systemd-udevd
 4931 ?        00:00:00 sshd
 4932 ?        00:00:02 rsyslogd
 4936 ?        00:00:00 systemd-logind
 4937 ?        00:00:00 dbus-daemon
 4947 ?        00:00:00 crond
 4949 tty1     00:00:00 agetty
 5046 ?        00:00:00 master
 5048 ?        00:00:00 qmgr
 5309 ?        00:00:00 pickup (Dockerホスト側のPostfixプロセスのようである)
 5343 ?        00:00:00 pickup
 5344 ?        00:00:00 kworker/1:2
 5345 ?        00:00:00 kworker/0:1
 5362 ?        00:00:00 kworker/1:0
 5365 ?        00:00:00 kworker/0:0
 5367 ?        00:00:00 kworker/1:1
 5372 ?        00:00:00 sshd
 5374 pts/0    00:00:00 bash
 5388 pts/0    00:00:00 ps


Dockerコンテナを終了させてからメモリ使用量を確認した。

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS                        PORTS               NAMES
923d1942dcbb        image-centos7-ssh2    "/sbin/init"        6 hours ago         Exited (130) 17 seconds ago                       centos7-ssh
[root@localhost ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           4.0G        157M        3.2G        8.6M        656M        3.6G
Swap:            0B          0B          0B

コンテナ起動中と終了後の差を計算した。
171MB - 157MB = 14MB
盛り沢山のコンテナを起動して、僅か14MBの消費しかされていないということか。


ところで、以下は、コンテナのプロセスの残骸か?と思ったが、
そうではなくて、Dockerホスト側のプロセスだとわかった。
コンテナのプロセスは消滅しているようだ。

[root@localhost ~]# ps -A
(5000番台以降のみ表示)
 5309 ?        00:00:00 pickup
 5344 ?        00:00:00 kworker/1:2
 5396 ?        00:00:00 kworker/0:1
 5398 ?        00:00:00 kworker/1:1
 5401 ?        00:00:00 kworker/0:2
 5424 ?        00:00:00 kworker/u4:2
 5494 ?        00:00:00 sshd
 5496 pts/0    00:00:00 bash
 5520 ?        00:00:00 kworker/0:0
 5523 ?        00:00:00 kworker/1:0
 5526 pts/0    00:00:00 ps
コンテナの終了によってきれいさっぱり、掃除されているようである。
コンテナ内に、systemdがプロセス1として動作しているためなのだろう。(†1)


以上



<参考>
1、Docker and the PID 1 zombie reaping problem
< https://blog.phusion.nl/2015/01/20/docker-and-the-pid-1-zombie-reaping-problem/ > 2018年11月17日

・Running Syslog Within a Docker Container
< http://www.projectatomic.io/blog/2014/09/running-syslog-within-a-docker-container/ > 2018年11月17日

・Postfixのipv6設定を無効にする方法
< https://qiita.com/KoriCori/items/ce30aecf38c85c3afc01 > 2018年11月17日

・How to install crontab on Centos
< https://stackoverflow.com/questions/21802223/how-to-install-crontab-on-centos > 2018年11月17日

・Dockerで/etc/hostsファイルが操作出来ない対策
< https://qiita.com/jagaximo/items/6b71a03518bbd53d4de6 > 2018年11月17日

・Docker コンテナで /etc/hosts がイジれなくて残念だったのでメモ
< https://cloudpack.media/8224 > 2018年11月17日

投げ銭

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

Ad

Ad