投げ銭

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

LINK


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

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

人気の投稿(1ヶ月間)

Ad

Ad

投げ銭

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

2018年12月9日日曜日

【Linux CentOS 7】ASTERISK 11.25.3 をインストールし動作させた。


下記で用いている特権Dockerコンテナは、次のページで作成したイメージをベースにしている。

しかし、通常のCentOS 7でも同じ方法でASTERISKを導入できると思う。

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


まず、次のようにしてコンテナを動作させた。
Dockerホスト222ポートを22ポートに通して、SSH接続を受け付けている。

Asteriskの実際の動作で必要なポートの解放については、ここでは考慮していない。

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

# docker run --privileged -d -p 222:22 --name asterisk11 image_centos7-ja_20181208 /sbin/init

そして、このコンテナにSSH接続を行い、下記のように設定作業を行った。



■ASTERISKのインストール

○アップデート
[root@24ad4455f276 ~]# yum update


○必要なパッケージの導入
[root@24ad4455f276 ~]# yum install gcc gcc-c++ libxml2 libxml2-devel openssl-devel ncurses-devel sqlite-devel newt-devel libuuid-devel uuid-devel make wget


○ソースファイルの展開先
[root@24ad4455f276 ~]# mkdir software/asterisk -p
[root@24ad4455f276 ~]# cd software/asterisk/


○ソースファイルの取得
[root@24ad4455f276 asterisk]# wget http://downloads.asterisk.org/pub/telephony/asterisk/old-releases/asterisk-11.25.3.tar.gz

[root@24ad4455f276 asterisk]# ls -l
total 34312
-rw-r--r-- 1 root root 35134682 Sep 19  2017 asterisk-11.25.3.tar.gz

○コンパイルとインストール
[root@24ad4455f276 asterisk]# tar zxvf asterisk-11.25.3.tar.gz
[root@24ad4455f276 asterisk]# cd asterisk-11.25.3

以下、(1)(2)(3)の手順がある。

(1)
[root@24ad4455f276 asterisk-11.25.3]# ./configure
(略)
configure: creating ./config.status
config.status: creating makeopts
config.status: creating autoconfig.h
configure: Menuselect build configuration successfully completed
               .$$$$$$$$$$$$$$$=..
            .$7$7..          .7$$7:.
          .$$:.                 ,$7.7
        .$7.     7$$$$           .$$77
     ..$$.       $$$$$            .$$$7
    ..7$   .?.   $$$$$   .?.       7$$$.
   $.$.   .$$$7. $$$$7 .7$$$.      .$$$.
 .777.   .$$$$$$77$$$77$$$$$7.      $$$,
 $$$~      .7$$$$$$$$$$$$$7.       .$$$.
.$$7          .7$$$$$$$7:          ?$$$.
$$$          ?7$$$$$$$$$$I        .$$$7
$$$       .7$$$$$$$$$$$$$$$$      :$$$.
$$$       $$$$$$7$$$$$$$$$$$$    .$$$.
$$$        $$$   7$$$7  .$$$    .$$$.
$$$$             $$$$7         .$$$.
7$$$7            7$$$$        7$$$
 $$$$$                        $$$
  $$$$7.                       $$  (TM)
   $$$$$$$.           .7$$$$$$  $$
     $$$$$$$$$$$$7$$$$$$$$$.$$$$$$
       $$$$$$$$$$$$$$$$.
configure: Package configured for:
configure: OS type  : linux-gnu
configure: Host CPU : x86_64
configure: build-cpu:vendor:os: x86_64 : unknown : linux-gnu :
configure: host-cpu:vendor:os: x86_64 : unknown : linux-gnu :

(2)
[root@24ad4455f276 asterisk-11.25.3]# make
(略)
updating cache ./config.cache
creating ./config.status
creating Makefile
creating makelist
creating config.h
   [LD] abstract_jb.o acl.o adsi.o alaw.o aoc.o app.o ast_expr2.o ast_expr2f.o asterisk.o astfd.o astmm.o astobj2.o audiohook.o autochan.o autoservice.o bridging.o callerid.o ccss.o cdr.o cel.o channel.o channel_internal_api.o chanvars.o cli.o config.o config_options.o data.o datastore.o db.o devicestate.o dial.o dns.o dnsmgr.o dsp.o enum.o event.o features.o file.o fixedjitterbuf.o format.o format_cap.o format_pref.o frame.o framehook.o fskmodem.o global_datastores.o hashtab.o heap.o http.o image.o indications.o io.o jitterbuf.o loader.o lock.o logger.o manager.o md5.o message.o named_acl.o netsock.o netsock2.o pbx.o plc.o poll.o presencestate.o privacy.o rtp_engine.o say.o sched.o security_events.o sha1.o sip_api.o slinfactory.o srv.o stdtime/localtime.o strcompat.o strings.o stun.o syslog.o taskprocessor.o tcptls.o tdd.o term.o test.o threadstorage.o timing.o translate.o udptl.o ulaw.o utils.o version.o xml.o xmldoc.o editline/libedit.a  -> asterisk
Building Documentation For: channels pbx apps codecs formats cdr cel bridges funcs tests main res addons
 +--------- Asterisk Build Complete ---------+
 + Asterisk has successfully been built, and +
 + can be installed by running:              +
 +                                           +
 +                make install               +
 +-------------------------------------------+

(3)
[root@24ad4455f276 asterisk-11.25.3]# make install
(略)
 +---- Asterisk Installation Complete -------+
 +                                           +
 +    YOU MUST READ THE SECURITY DOCUMENT    +
 +                                           +
 + Asterisk has successfully been installed. +
 + If you would like to install the sample   +
 + configuration files (overwriting any      +
 + existing config files), run:              +
 +                                           +
 +                make samples               +
 +                                           +
 +-----------------  or ---------------------+
 +                                           +
 + You can go ahead and install the asterisk +
 + program documentation now or later run:   +
 +                                           +
 +               make progdocs               +
 +                                           +
 + **Note** This requires that you have      +
 + doxygen installed on your local system    +
 +-------------------------------------------+

○サンプルファイルのインストール
[root@24ad4455f276 asterisk-11.25.3]# make samples


○自動起動用のスクリプトのインストール
[root@24ad4455f276 asterisk-11.25.3]# make config


以下、asteriskを起動させる段階でも、パッケージ不足や手順の不足を補っている。



■asteriskの起動

〇システム起動時に自動起動させる設定
[root@24ad4455f276 asterisk-11.25.3]# systemctl enable asterisk
asterisk.service is not a native service, redirecting to /sbin/chkconfig.
Executing /sbin/chkconfig asterisk on

〇asteriskの起動と状態の確認
[root@24ad4455f276 asterisk-11.25.3]# systemctl start asterisk
Job for asterisk.service failed because the control process exited with error code. See "systemctl status asterisk.service" and "journalctl -xe" for details.
asteriskの起動に失敗した。

ステータスを表示させた。
[root@24ad4455f276 asterisk-11.25.3]# systemctl status asterisk
● asterisk.service - LSB: Asterisk PBX
   Loaded: loaded (/etc/rc.d/init.d/asterisk; bad; vendor preset: disabled)
   Active: failed (Result: exit-code) since Sat 2018-12-08 11:15:37 UTC; 11s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 19926 ExecStart=/etc/rc.d/init.d/asterisk start (code=exited, status=1/FAILURE)
Dec 08 11:15:37 24ad4455f276 systemd[1]: Starting LSB: Asterisk PBX...
Dec 08 11:15:37 24ad4455f276 asterisk[19926]: /etc/rc.d/init.d/asterisk: line 42: /etc/rc.d/init.d/functions: No such file or...ectory
Dec 08 11:15:37 24ad4455f276 systemd[1]: asterisk.service: control process exited, code=exited status=1
Dec 08 11:15:37 24ad4455f276 systemd[1]: Failed to start LSB: Asterisk PBX.
Dec 08 11:15:37 24ad4455f276 systemd[1]: Unit asterisk.service entered failed state.
Dec 08 11:15:37 24ad4455f276 systemd[1]: asterisk.service failed.
Hint: Some lines were ellipsized, use -l to show in full.

必要なパッケージを導入した。
[root@24ad4455f276 asterisk-11.25.3]# yum install initscripts
Installed:
  initscripts.x86_64 0:9.49.46-1.el7
Dependency Installed:
  sysvinit-tools.x86_64 0:2.88-14.dsf.el7
Complete!

再び起動を試行した。
[root@24ad4455f276 asterisk-11.25.3]# systemctl start asterisk
^C

エラーも何も表示されない状態になったので、ctrl+c で強制停止した。
ステータスを表示させたが有益な情報は得られなかった。

ldconfigを実行した。(†1)
[root@24ad4455f276 asterisk-11.25.3]# ldconfig


再び、起動させてみる。
[root@24ad4455f276 asterisk-11.25.3]# systemctl start asterisk
Starting asterisk (via systemctl):                         [  OK  ]
起動したようである。


起動後の状態の確認
[root@24ad4455f276 asterisk-11.25.3]# systemctl status asterisk -l
asterisk.service - LSB: Asterisk PBX
   Loaded: loaded (/etc/rc.d/init.d/asterisk; bad; vendor preset: disabled)
   Active: active (running) since Sat 2018-12-08 14:29:21 UTC; 8s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 20930 ExecStop=/etc/rc.d/init.d/asterisk stop (code=exited, status=0/SUCCESS)
  Process: 20974 ExecStart=/etc/rc.d/init.d/asterisk start (code=exited, status=0/SUCCESS)
 Main PID: 21003 (asterisk)
   CGroup: /docker/24ad4455f27604b55f691aa3c35c7d948eac9334cff7b4aa216bf7ca9dcc8625/system.slice/asterisk.service
           ├─21001 /bin/sh /usr/sbin/safe_asterisk
           └─21003 /usr/sbin/asterisk -f -vvvg -c
           ‣ 21003 /usr/sbin/asterisk -f -vvvg -c
Dec 08 14:29:21 24ad4455f276 systemd[1]: Starting LSB: Asterisk PBX...
Dec 08 14:29:21 24ad4455f276 asterisk[20974]: Starting asterisk:
Dec 08 14:29:21 24ad4455f276 systemd[1]: PID file /var/run/asterisk/asterisk.pid not readable (yet?) after start.
Dec 08 14:29:21 24ad4455f276 systemd[1]: asterisk.service: Supervising process 21003 which is not our child. We'll most likely not notice when it exits.
Dec 08 14:29:21 24ad4455f276 systemd[1]: Started LSB: Asterisk PBX.


上記の状態表示で、pidファイルが(まだ)読める状態になっていないとある。
そこで念の為にpidファイルの確認をした。

読める状態であった。(asteriskはrootユーザーで動作中である。)
[root@24ad4455f276 asterisk-11.25.3]# ls -l /var/run/asterisk/asterisk.pid
-rw-r--r-- 1 root root 6 Dec  8 14:29 /var/run/asterisk/asterisk.pid

[root@24ad4455f276 asterisk-11.25.3]# cat /var/run/asterisk/asterisk.pid
21003
動作中のプロセスも確認した。
[root@24ad4455f276 asterisk-11.25.3]# ps -A | grep asterisk
21001 ?        00:00:00 safe_asterisk
21003 ?        00:00:00 asterisk
タイミング的に、pidファイルが読めなかったのではないだろうか。(†3)


また、上記の状態表示の次の行では、プロセス21003は自分の子プロセスでないもののsystemd[1]は監視していると言っている。
次のようにプロセスツリーを確認すると、systemdのツリーにasteriskが存在していることがわかった。

プロセスツリーの確認
[root@24ad4455f276 asterisk-11.25.3]# yum install psmisc
[root@24ad4455f276 asterisk-11.25.3]# pstree
systemd─┬─agetty
         ├─crond
         ├─dbus-daemon
         ├─dnsmasq
         ├─master─┬─pickup
         │        └─qmgr
         ├─rsyslogd───2*[{rsyslogd}]
         ├─safe_asterisk───asterisk───42*[{asterisk}]
         ├─sshd───sshd───bash───tmux
         ├─systemd-journal
         ├─systemd-logind
         ├─systemd-udevd
         └─tmux───bash───pstree


以上より、特に問題が発生しているわけではないと判断した。



■asteriskのCLIを表示

[root@24ad4455f276 asterisk-11.25.3]# asterisk -r
Asterisk 11.25.3, Copyright (C) 1999 - 2013 Digium, Inc. and others.
Created by Mark Spencer <markster@digium.com>
Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type 'core show license' for details.
=========================================================================
Connected to Asterisk 11.25.3 currently running on 24ad4455f276 (pid = 20563)
24ad4455f276*CLI>
!              acl            ael            agent          agi            aoc            calendar       cc
cdr            cel            channel        cli            confbridge     config         console        core
data           database       devstate       dialplan       dnsmgr         dundi          event          fax
features       file           group          hangup         help           http           iax2           indication
keys           local          logger         manager        mgcp           minivm         mixmonitor     module
moh            no             originate      parkedcalls    phoneprov      presencestate  pri            queue
realtime       reload         rtcp           rtp            say            sip            skinny         stun
timing         udptl          ulimit         unistim        voicemail
24ad4455f276*CLI>

以上




<参考>
(1)Asterisk 11
< https://www.voip-info.jp/index.php/Asterisk_11 > 2018年12月8日

(2)CentOS7のAsterisk11イメージ作った
< https://qiita.com/tukiyo3/items/6fe69285ac076672072c > 2018年12月8日

(3)PIDファイル読み取り不可
< http://www.zabbix.jp/node/4158 > 2018年12月8日

(4)How to Install Asterisk on CentOS 7
< https://www.rosehosting.com/blog/how-to-install-asterisk-on-centos-7/ > 2018年12月8日

(5)CentOS7でpstreeが無い
< https://qiita.com/todanano/items/f421c237eaa2d9adff04 > 2018年12月8日

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日

投げ銭

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

Ad

Ad