カテゴリー: Docker

SymfonyのアプリをAlpineコンテナに構築する際にgrep関係でつまずいた

Symfony2.8から3系のLTSにアップデートするためにまずは環境構築をと思い、
今までの開発環境からコンテナの開発環境に移行する時に起きた問題。

■今までの開発環境
CentOS6
PHP5.6.3
MySQL5.5

■今回試した開発環境
Docker
httpd:2.4.25-alpine
php:5.6-fpm-alpine
mysql:5.5

環境を構築してからソースをgit cloneして
設置していく際に以下のエラーが発生。

You have requested a non-existent service “*****************”.

サービスは読み込まれているか以下のコマンドで確認。

# ./app/console debug:container
/bin/grep: unrecognized option: fixed-strings
BusyBox v1.24.2 (2017-11-23 08:52:33 GMT) multi-call binary.

Usage: grep [-HhnlLoqvsriwFE] [-m N] [-A/B/C N] PATTERN/-e PATTERN.../-f FILE [FILE]...

Search for PATTERN in FILEs (or stdin)

        -H      Add 'filename:' prefix
        -h      Do not add 'filename:' prefix
        -n      Add 'line_no:' prefix
        -l      Show only names of files that match
        -L      Show only names of files that don't match
        -c      Show only count of matching lines
        -o      Show only the matching part of line
        -q      Quiet. Return 0 if PATTERN is found, 1 otherwise
        -v      Select non-matching lines
        -s      Suppress open and read errors
        -r      Recurse
        -i      Ignore case
        -w      Match whole words only
        -x      Match whole lines only
        -F      PATTERN is a literal (not regexp)
        -E      PATTERN is an extended regexp
        -m N    Match up to N times per file
        -A N    Print N lines of trailing context
        -B N    Print N lines of leading context
        -C N    Same as '-A N -B N'
        -e PTRN Pattern to match
        -f FILE Read pattern from file

Symfony Container Public Services
=================================
・・・
いつもより少ないサービス一覧
・・・

するといつもより少ない。。
あと、以下の部分が気になる。

/bin/grep: unrecognized option: fixed-strings
BusyBox v1.24.2 (2017-11-23 08:52:33 GMT) multi-call binary.

もしかしたらBusyBoxのgrepに何かあるんじゃないかということで、

JMS\DiExtraBundleの設定を変更してみる。
https://jmsyst.com/bundles/JMSDiExtraBundle/master/configuration
「disable_grep: true」を追加。

Symfony/app/config/config.yml

jms_di_extra:
    locations:
        all_bundles: false
        bundles: [AppBundle]
        directories: ["%kernel.root_dir%/../src"]

↓に変更

jms_di_extra:
    locations:
        all_bundles: false
        bundles: [AppBundle]
        directories: ["%kernel.root_dir%/../src"]
    disable_grep: true

とりあえず動いた。

Dockerのゲストコンテナ内からホストのsendmailを使ってメールを送信する

Dockerのゲストコンテナ内からホストのsendmailを使ってメールを送信する

※※※開発環境用の設定なので公開サーバでこの設定は行わない。※※※

■やりたいこと
ホストのCentOS7のsendmailを使ってコンテナ内からメールを送りたい
そのままの状態だと接続に失敗している

■ホストの構成
VagrantにCentOS7をインストールしてそこにDockerを入れている

■ゲスト側からホストのIPを把握する

# ip route
default via 172.18.0.1 dev eth0 
172.18.0.0/16 dev eth0  proto kernel  scope link  src 172.18.0.2 

この場合ホストのIPは「172.18.0.1」

■ホスト側の最初の状態

# netstat -an | grep 25
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN

ローカル127.0.0.1からのSMTPだけ受け付けている状態
ホスト側のsendmailでローカル以外からもSMTPを受け付けるようにする必要がある

■設定ファイルをコピーして、ローカルだけに制限している行を無効化する

# cp /etc/mail/sendmail.mc /etc/mail/sendmail.mc.org
# vim /etc/mail/sendmail.mc
# diff /etc/mail/sendmail.mc.org /etc/mail/sendmail.mc
118c118
< DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
---
> dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl

■「sendmail.mc」を「sendmail.cf」へ変換する

# m4 sendmail.mc > sendmail.cf
-bash: m4: command not found

入ってなかった。。

■ツールが入っていないのでインストール

# yum -y install sendmail-cf

これで「m4」が入る

■もう一度変換

# cd /etc/mail/
# m4 sendmail.mc > sendmail.cf

■リレーを許可するIPを指定する

# cp /etc/mail/access /etc/mail/access_org
# vim /etc/mail/access
# cat /etc/mail/access
Connect:localhost.localdomain           RELAY
Connect:localhost                       RELAY
Connect:127.0.0.1                       RELAY
Connect:XXX.XXX.XXX.XXX                 RELAY <- ゲストIP追加 172.17.0.0など

■再起動

# systemctl restart sendmail.service

■確認

# netstat -an | grep 25
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN

あとはfirewallなど適切に設定すればOK

Vagrant CentOS7 上でdockerはじめてみた

Vagrant CentOS7 上でdockerはじめてみた

Vagrantbox.es
http://www.vagrantbox.es/

CentOS 7 x64 (Minimal, Shrinked, Guest Additions 4.3.26) (Monthly updates)
https://github.com/holms/vagrant-centos7-box/releases/download/7.1.1503.001/CentOS-7.1.1503-x86_64-netboot.box

↑のboxで起動しただけの初期状態からdockerをインストールする。

■dockerを探す

[vagrant@localhost ~]$ yum search docker
Loaded plugins: fastestmirror
・・・・・
============================================================================================================ N/S matched: docker ============================================================================================================
cockpit-docker.x86_64 : Cockpit user interface for Docker containers
docker-logrotate.x86_64 : cron job to run logrotate on docker containers
docker-python.x86_64 : An API client for docker written in Python
docker-registry.noarch : Registry server for Docker
docker-registry.x86_64 : Registry server for Docker
docker-selinux.x86_64 : SELinux policies for Docker
docker.x86_64 : Automates deployment of containerized applications
docker-devel.x86_64 : A golang registry for global request variables (source libraries)

  Name and summary matches only, use "search all" for everything.

■インストール

[root@localhost ~]# yum install docker

[root@localhost ~]# systemctl status docker.service
docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled)
   Active: inactive (dead)
     Docs: http://docs.docker.com

■いざ起動

[root@localhost ~]# systemctl start docker.service
Job for docker.service failed. See 'systemctl status docker.service' and 'journalctl -xn' for details.

動かない。。

[root@localhost ~]# systemctl status docker.service
docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled)
   Active: failed (Result: exit-code) since Fri 2015-06-26 03:37:05 UTC; 4min 2s ago
     Docs: http://docs.docker.com
  Process: 2467 ExecStart=/usr/bin/docker -d $OPTIONS $DOCKER_STORAGE_OPTIONS $DOCKER_NETWORK_OPTIONS $ADD_REGISTRY $BLOCK_REGISTRY $INSECURE_REGISTRY (code=exited, status=1/FAILURE)
 Main PID: 2467 (code=exited, status=1/FAILURE)

Jun 26 03:36:05 localhost.localdomain systemd[1]: Starting Docker Application Container Engine...
Jun 26 03:36:05 localhost.localdomain docker[2467]: time="2015-06-26T03:36:05Z" level=info msg="+job serveapi(unix:///var/run/docker.sock)"
Jun 26 03:36:05 localhost.localdomain docker[2467]: time="2015-06-26T03:36:05Z" level=info msg="Listening for HTTP on unix (/var/run/docker.sock)"
Jun 26 03:37:05 localhost.localdomain docker[2467]: time="2015-06-26T03:37:05Z" level=fatal msg="Shutting down daemon due to errors: error intializing graphdriver: exit status 1"
Jun 26 03:37:05 localhost.localdomain systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE
Jun 26 03:37:05 localhost.localdomain systemd[1]: Failed to start Docker Application Container Engine.
Jun 26 03:37:05 localhost.localdomain systemd[1]: Unit docker.service entered failed state.

■以下のページを発見。

CentOS7でDockerを動かす場合
http://shimakaze.hatenablog.com/entry/2015/04/02/103449

■とりあえず「libdevmapper」インストール。

# yum -y install libdevmapper.so.1.02

[root@localhost ~]# systemctl start docker.service
Job for docker.service failed. See 'systemctl status docker.service' and 'journalctl -xn' for details.

[root@localhost ~]# systemctl status docker.service
docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled)
   Active: failed (Result: exit-code) since Fri 2015-06-26 03:45:26 UTC; 14s ago
     Docs: http://docs.docker.com
  Process: 2680 ExecStart=/usr/bin/docker -d $OPTIONS $DOCKER_STORAGE_OPTIONS $DOCKER_NETWORK_OPTIONS $ADD_REGISTRY $BLOCK_REGISTRY $INSECURE_REGISTRY (code=exited, status=1/FAILURE)
 Main PID: 2680 (code=exited, status=1/FAILURE)

Jun 26 03:45:26 localhost.localdomain systemd[1]: Starting Docker Application Container Engine...
Jun 26 03:45:26 localhost.localdomain docker[2680]: time="2015-06-26T03:45:26Z" level=info msg="+job serveapi(unix:///var/run/docker.sock)"
Jun 26 03:45:26 localhost.localdomain docker[2680]: time="2015-06-26T03:45:26Z" level=info msg="Listening for HTTP on unix (/var/run/docker.sock)"
Jun 26 03:45:26 localhost.localdomain docker[2680]: time="2015-06-26T03:45:26Z" level=fatal msg="Shutting down daemon due to errors: error intializing graphdriver: Error running DeleteDevice dm_task_run failed"
Jun 26 03:45:26 localhost.localdomain systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE
Jun 26 03:45:26 localhost.localdomain systemd[1]: Failed to start Docker Application Container Engine.
Jun 26 03:45:26 localhost.localdomain systemd[1]: Unit docker.service entered failed state.

まだ動かない。。

■調べて以下のページをみつける。

[1.6.0][graphdriver] prior storage driver “devicemapper” failed: error intializing graphdriver #13008
https://github.com/docker/docker/issues/13008

[root@localhost lib]# pwd
/var/lib
[root@localhost lib]# rm -rf docker/

とりあえず消してみた。

[root@localhost ~]# systemctl start docker.service
Job for docker.service failed. See 'systemctl status docker.service' and 'journalctl -xn' for details.

[root@localhost ~]# systemctl status docker.service -l
docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled)
   Active: failed (Result: exit-code) since Fri 2015-06-26 03:51:46 UTC; 47s ago
     Docs: http://docs.docker.com
  Process: 15073 ExecStart=/usr/bin/docker -d $OPTIONS $DOCKER_STORAGE_OPTIONS $DOCKER_NETWORK_OPTIONS $ADD_REGISTRY $BLOCK_REGISTRY $INSECURE_REGISTRY (code=exited, status=1/FAILURE)
 Main PID: 15073 (code=exited, status=1/FAILURE)

Jun 26 03:51:45 localhost.localdomain systemd[1]: Starting Docker Application Container Engine...
Jun 26 03:51:46 localhost.localdomain docker[15073]: time="2015-06-26T03:51:46Z" level=info msg="+job serveapi(unix:///var/run/docker.sock)"
Jun 26 03:51:46 localhost.localdomain docker[15073]: time="2015-06-26T03:51:46Z" level=info msg="Listening for HTTP on unix (/var/run/docker.sock)"
Jun 26 03:51:46 localhost.localdomain docker[15073]: time="2015-06-26T03:51:46Z" level=fatal msg="Shutting down daemon due to errors: error intializing graphdriver: Unable to take ownership of thin-pool (centos-docker--pool) that already has used data blocks"
Jun 26 03:51:46 localhost.localdomain systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE
Jun 26 03:51:46 localhost.localdomain systemd[1]: Failed to start Docker Application Container Engine.
Jun 26 03:51:46 localhost.localdomain systemd[1]: Unit docker.service entered failed state.

動かない・・・。

■一旦dockerを消す。

[root@localhost ~]# yum remove docker  

■とりあえずupdateする。

[root@localhost ~]# yum update

■もう一回いれてみる。

[root@localhost ~]# yum install docker

[root@localhost ~]# systemctl start docker

[root@localhost ~]# systemctl status docker
docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled)
   Active: active (running) since Fri 2015-06-26 03:57:52 UTC; 17s ago
     Docs: http://docs.docker.com
 Main PID: 1027 (docker)
   CGroup: /system.slice/docker.service
           └─1027 /usr/bin/docker -d --selinux-enabled

Jun 26 03:57:51 localhost.localdomain docker[1027]: time="2015-06-26T03:57:51Z" level=warning msg="Docker could not enable SELinux on the host system"
Jun 26 03:57:51 localhost.localdomain docker[1027]: time="2015-06-26T03:57:51Z" level=info msg="+job init_networkdriver()"
Jun 26 03:57:52 localhost.localdomain docker[1027]: time="2015-06-26T03:57:52Z" level=info msg="-job init_networkdriver() = OK (0)"
Jun 26 03:57:52 localhost.localdomain docker[1027]: time="2015-06-26T03:57:52Z" level=info msg="Loading containers: start."
Jun 26 03:57:52 localhost.localdomain docker[1027]: time="2015-06-26T03:57:52Z" level=info msg="Loading containers: done."
Jun 26 03:57:52 localhost.localdomain docker[1027]: time="2015-06-26T03:57:52Z" level=info msg="docker daemon: 1.6.2 ba1f6c3/1.6.2; execdriver: native-0.2; graphdriver: devicemapper"
Jun 26 03:57:52 localhost.localdomain docker[1027]: time="2015-06-26T03:57:52Z" level=info msg="+job acceptconnections()"
Jun 26 03:57:52 localhost.localdomain docker[1027]: time="2015-06-26T03:57:52Z" level=info msg="-job acceptconnections() = OK (0)"
Jun 26 03:57:52 localhost.localdomain docker[1027]: time="2015-06-26T03:57:52Z" level=info msg="Daemon has completed initialization"
Jun 26 03:57:52 localhost.localdomain systemd[1]: Started Docker Application Container Engine.

動いた・・・!

先に「libdevmapper.so.1.02」がはいってないといけなかったのか?

■動いたので自動起動に。

[root@localhost ~]# systemctl enable docker
ln -s '/usr/lib/systemd/system/docker.service' '/etc/systemd/system/multi-user.target.wants/docker.service'

■Dockerイメージの検索

[root@localhost ~]# docker search centos
INDEX       NAME                                    DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/centos                        The official build of CentOS.                   1087      [OK]       
docker.io   docker.io/tutum/centos                  Centos image with SSH access. For the root...   13                   [OK]
docker.io   docker.io/blalor/centos                 Bare-bones base CentOS 6.5 image                9                    [OK]
docker.io   docker.io/torusware/speedus-centos      Always updated official CentOS docker imag...   6                    [OK]
docker.io   docker.io/million12/centos-supervisor   Base CentOS-7 with supervisord launcher, h...   4                    [OK]
docker.io   docker.io/jdeathe/centos-ssh            CentOS-6 6.6 x86_64 / EPEL Repo. / OpenSSH...   3                    [OK]
docker.io   docker.io/layerworx/centos              A general CentOS 6 image with the EPEL6 an...   2                    [OK]
docker.io   docker.io/akroh/centos                  Centos 6 container that has been updated w...   0                    [OK]
docker.io   docker.io/nathonfowlie/centos-jre       Latest CentOS image with the JRE pre-insta...   0                    [OK]
docker.io   docker.io/pdericson/centos              Docker image for CentOS                         0                    [OK]

■Dockerイメージのダウンロード
とりあえず公式のcentosを取得する

[root@localhost ~]# docker pull docker.io/centos
Trying to pull repository docker.io/centos ...
7322fbe74aa5: Download complete
f1b10cd84249: Download complete
c852f6d61e65: Download complete
Status: Downloaded newer image for docker.io/centos:latest

■ダウンロードしたイメージの確認

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.io/centos    latest              7322fbe74aa5        7 days ago          172.2 MB

■Dockerコンテナの作成
docker runでコンテナの新規作成と実行の両方が行われる

[root@localhost ~]# docker run -it --name centos1 docker.io/centos:latest /bin/bash
Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning.
[root@f89ddd90d0fd /]# 

実行された。

docker run の主なオプション
-i:コンテナーの標準入力を開く。/bin/bashなどでコンテナーを操作する際に指定
-t:tty(端末デバイス)を確保する。/bin/bashなどでコンテナーを操作する際に指定
-d:バックグラウンドで実行する(後述)。既定では、コンテナーをフォアグラウンドで実行するため、Webサーバーやアプリケーションサーバーなど常時実行するコンテナーで指定
-p {ホストのポート番号}:{コンテナーのポート番号}:Dockerサーバーのホストとポートマッピングを構成

■コンテナにapache入れてみる。

[root@f89ddd90d0fd /]# yum install httpd

■一旦コンテナ停止

[root@f89ddd90d0fd /]# exit
exit

[Ctrl]+[d]キーでbashプロセスを終了できる。

コンテナを停止することなく、元のシェルに戻したい場合は[Ctrl-P]+[Ctrl-q]でコンテナのTTYを抜けられる。

■停止中のコンテナも含めてコンテナの状態を確認する

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS                     PORTS               NAMES
f89ddd90d0fd        docker.io/centos:latest   "/bin/bash"         9 minutes ago       Exited (0) 3 minutes ago                       centos1

■コンテナの起動

[root@localhost ~]# docker start centos1
centos1

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS              PORTS               NAMES
f89ddd90d0fd        docker.io/centos:latest   "/bin/bash"         10 minutes ago      Up 19 seconds                           centos1 

■コンテナへの再接続

[root@localhost ~]# docker attach centos1
Enter押す
[root@f89ddd90d0fd /]# 

■[Ctrl-P]+[Ctrl-q]でTTY抜けてみる。

[root@f89ddd90d0fd /]# [root@localhost ~]# 

■コンテナの停止

[root@localhost ~]# docker stop centos1
centos1

■コンテナの再起動
※コンテナのプロセスを強制終了して再度スタート

[root@localhost ~]# docker restart centos1
centos1

■コンテナのコミット

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS                     PORTS               NAMES
f89ddd90d0fd        docker.io/centos:latest   "/bin/bash"         About an hour ago   Exited (0) 7 seconds ago                       centos1

[root@localhost ~]# docker commit -a MOGUMAGU -m "CentOS7 installed Apache" centos1 localrepo:withApache
74fe551af11fbdbe8e5e4849fcd4dd580ce7057d80e976ceeaaf8b9750954756

保存したイメージの確認

[root@localhost ~]# docker images localrepo
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
localrepo           withApache          74fe551af11f        44 seconds ago      268.4 MB

イメージの作成履歴を見る

[root@localhost ~]# docker images -t
Warning: '-t' is deprecated, it will be removed soon. See usage.
└─f1b10cd84249 Virtual Size: 0 B
  └─c852f6d61e65 Virtual Size: 172.2 MB
    └─7322fbe74aa5 Virtual Size: 172.2 MB Tags: docker.io/centos:latest
      └─74fe551af11f Virtual Size: 268.4 MB Tags: localrepo:withApache

■コンテナの削除

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS                     PORTS               NAMES
f89ddd90d0fd        docker.io/centos:latest   "/bin/bash"         About an hour ago   Exited (0) 5 minutes ago                       centos1
[root@localhost ~]# docker rm centos1
centos1
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost ~]# 

※保管が必要ならあらかじめdocker commitでイメージを保管しておくこと

■さっき作ったコンテナから起動

[root@localhost ~]# docker run -it --name centos2 localrepo:withApache /bin/bash
Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning.
[root@5cdc79690cee /]# 
[root@5cdc79690cee /]# yum info httpd
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
Installed Packages
Name        : httpd
Arch        : x86_64
Version     : 2.4.6
Release     : 31.el7.centos
Size        : 9.4 M
Repo        : installed
From repo   : base
Summary     : Apache HTTP Server
URL         : http://httpd.apache.org/
License     : ASL 2.0
Description : The Apache HTTP Server is a powerful, efficient, and extensible
            : web server.

apache入ってる。

[Ctrl-P]+[Ctrl-q]でTTY抜ける

[root@5cdc79690cee ~]# [root@localhost ~]# 

コンテナの起動状態を確認。

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                  COMMAND             CREATED              STATUS              PORTS               NAMES
5cdc79690cee        localrepo:withApache   "/bin/bash"         About a minute ago   Up About a minute                       centos2

動いてる。

■webサーバとして起動する例
先ほどコミットしたlocalrepo:withApacheをベースにwebサーバを起動しブラウザから確認する。

[root@localhost ~]# docker run -d --name webserver --expose=80 --publish 80:80 localrepo:withApache /usr/sbin/httpd -D FOREGROUND 

上記でホストのipでブラウザアクセスしたらapacheの初期画面が表示される。

状態はこちら

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                  COMMAND                CREATED             STATUS                     PORTS                NAMES
6fd53d6fd905        localrepo:withApache   "/usr/sbin/httpd -D    3 minutes ago       Up 3 minutes               0.0.0.0:80->80/tcp   webserver
5cdc79690cee        localrepo:withApache   "/bin/bash"            46 minutes ago      Exited (0) 8 minutes ago                        centos2

実際のコンテンツなどはホストとボリュームを共有して保持しておくほうがいいみたい。