web-dev-qa-db-ja.com

サーバーの完全修飾ドメイン名を確実に決定できませんでした... Dockerでそれを解決する方法は?

私はDockerを始めたばかりで、基本的にこれらの手順を示している tutorial に従っていました。

  1. 次のようなDockerfileを作成します。

    From php:7.0-Apache copy src/ /var/www/html EXPOSE 80

  2. Dockerfileがある場所からコンテナーをビルドします。

    $ docker build -t mytest .

  3. イメージ「mytest」が生成された後、次のコマンドで実行します。

    $ docker run -p 80 mytest

それは私がエラーとして受け取るものです:

AH00558: Apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
AH00558: Apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
[Sun Sep 17 16:25:12.340564 2017] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.10 (Debian) PHP/7.0.23 configured -- resuming normal operations
[Sun Sep 17 16:25:12.340666 2017] [core:notice] [pid 1] AH00094: Command line: 'Apache2 -D FOREGROUND'

だから、私はそれを解決する方法を知りません。何か助け?

17
zwitterion

警告メッセージを解決する別の(おそらくよりDockerっぽい)方法を提供したいと思います。しかし、まず、whatを理解するのが理にかなっています。Apacheは、ServerNameを盲目的に設定する前に、実際にドメイン名を把握しようとしています。 http://ratfactor.com/Apache-fqdn.html には、プロセスを説明した良い記事があります。

getnameinfoがApacheが名前を検索するために使用するものであり、/etc/nsswitch.confを使用して検索の最初の場所を決定することを確認できたら、何を修正するかを判断できます。

コンテナ内のnsswitch.confをチェックアウトすると、外部DNSの前に/etc/hostsファイルでホストを検索していることがわかります。

# cat /etc/nsswitch.conf | grep hosts
hosts:          files dns

これを知っていれば、構成ファイルに追加する代わりに、Dockerランタイムでファイルに影響を与えることができますか?

Docker runリファレンスドキュメントを見ると、 https://docs.docker.com/engine/reference/run/#managing-etchosts/etc/hostsファイルのセクションがあります=。それは言及しています:

コンテナの/ etc/hostsには、コンテナ自体のホスト名とlocalhostおよびその他の一般的なものを定義する行があります。

したがって、コンテナのホスト名を設定するだけで、/etc/hostsに追加され、Apacheの警告が解決されます。幸いなことに、これは--hostnameまたは-hオプションを使用すると非常に簡単です。これを完全修飾ドメイン名に設定すると、Dockerは/etc/hostsファイルに設定し、Apacheがそれを取得します。

これを試すのはとても簡単です。警告付きの例(ホスト名なし):

$ docker run --rm php:7.0-Apache
AH00558: Apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
AH00558: Apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
[Sun Sep 17 19:00:32.919074 2017] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.10 (Debian) PHP/7.0.23 configured -- resuming normal operations
[Sun Sep 17 19:00:32.919122 2017] [core:notice] [pid 1] AH00094: Command line: 'Apache2 -D FOREGROUND'

-hオプションを完全修飾ドメイン名に設定すると、次のようになります。

$ docker run --rm -h myapp.mydomain.com php:7.0-Apache
[Sun Sep 17 19:01:27.968915 2017] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.10 (Debian) PHP/7.0.23 configured -- resuming normal operations
[Sun Sep 17 19:01:27.968968 2017] [core:notice] [pid 1] AH00094: Command line: 'Apache2 -D FOREGROUND'

これが質問への回答に役立ち、Apacheと完全修飾ドメイン名についての知識を提供することを願っています。

20
Andy Shinn

これはエラーではなく、単なる警告であり、無視しても問題ありません。 ServerNameが設定されていないため、マシンIPが同じであると想定されます。

/etc/Apache2/sites-available内にあるデフォルトの構成を見ると、000-default.confdefault-ssl.confが見つかります

root@d591ab6febff:/etc/Apache2/sites-available# cat 000-default.conf
<VirtualHost *:80>
    # The ServerName directive sets the request scheme, hostname and port that
    # the server uses to identify itself. This is used when creating
    # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual Host. For the default virtual Host (this file) this
    # value is not decisive as it is used as a last resort Host regardless.
    # However, you must set it for any further virtual Host explicitly.
    #ServerName www.example.com

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
    # error, crit, alert, emerg.
    # It is also possible to configure the loglevel for particular
    # modules, e.g.
    #LogLevel info ssl:warn

    ErrorLog ${Apache_LOG_DIR}/error.log
    CustomLog ${Apache_LOG_DIR}/access.log combined

    # For most configuration files from conf-available/, which are
    # enabled or disabled at a global level, it is possible to
    # include a line for only one particular virtual Host. For example the
    # following line enables the CGI configuration for this Host only
    # after it has been globally disabled with "a2disconf".
    #Include conf-available/serve-cgi-bin.conf
</VirtualHost>

ServerNameディレクティブは構成内でコメント化されます

#ServerName www.example.com

したがって、警告が心配な場合は、以下のように必要な値に変更する必要があります

ServerName www.tarunlalwani.com
ServerAlias tarunlalwani.com

フォルダーに構成を作成し、Dockerfileを使用してデフォルト構成のファイルを上書きする必要があります。その後、警告は消えます。

2
Tarun Lalwani

この警告を回避するには、IPでServerNameを設定できます。

この例を参照してください: tagplus5/docker-php/7-Apache/Dockerfile

    apt-get install -y --no-install-recommends iproute2 Apache2 php7.0 libapache2-mod-php7.0 \
        php7.0-mysql php7.0-sqlite php7.0-bcmath php7.0-curl ca-certificates && \
    apt-get autoremove -y && \
    rm -rf /var/lib/apt/lists/* && \
echo "ServerName $(ip route get 8.8.8.8 | awk '{print $NF; exit}')" >> /etc/Apache2/Apache2.conf && \

(iprouteはMacでは異なる動作をしますが、ホストによって異なります。 iproute2mac issue 8 を参照してください)

0
VonC