私はDockerを始めたばかりで、基本的にこれらの手順を示している tutorial に従っていました。
次のようなDockerfileを作成します。
From php:7.0-Apache copy src/ /var/www/html EXPOSE 80
Dockerfileがある場所からコンテナーをビルドします。
$ docker build -t mytest .
イメージ「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'
だから、私はそれを解決する方法を知りません。何か助け?
警告メッセージを解決する別の(おそらくより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と完全修飾ドメイン名についての知識を提供することを願っています。
これはエラーではなく、単なる警告であり、無視しても問題ありません。 ServerName
が設定されていないため、マシンIPが同じであると想定されます。
/etc/Apache2/sites-available
内にあるデフォルトの構成を見ると、000-default.conf
とdefault-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を使用してデフォルト構成のファイルを上書きする必要があります。その後、警告は消えます。
この警告を回避するには、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 を参照してください)