kuro

2 minute read

docker-composeでnginxが動かなかったときのメモ

久しぶりにwindows10のvagrant内でdockerを動かしlaravelの環境を構築してみようという矢先、nginxがうまく動かなかったので、その時のメモです。


目次



*状況と原因


ブラウザでlocalhost:8080でnginxのページが見れない状況でした。 ブラウザには「接続がリセットされました」と表示されていました。

とりあえず、コンテナをすべて停止して削除してから

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

でもう一度立ち上げる

docker-compose up -d

でもう一度立ち上げるも上手くいかず。

docker-compose.ymlを見直し、Vagrantfileを見直し、ポートが間違っていないか確認したが、ちゃんと設定されているようでした。

docker-compose.yml

services:
    nginx:
        image: nginx
        ports:
        - '8080:80'
        volumes:
        - ./nginx/conf.d:/etc/nginx/conf.d
        - ./nginx/log:/var/log/nginx
        restart: always
        container_name: nginx001

Vagrantfile

config.vm.network "forwarded_port", guest: 8080, host: 8080

むむ…次にbashからvagrantにsshログインしてcurlで読み取ってみました。

curl localhost:8080
curl: (56) Recv failure: 接続が相手からリセットされました

やっぱり同じ結果だったので、docker内のnginx自身に問題がありそう…

直接vagrantに入ったまま、docker run で直接、別ポート別名のnginxコンテナを作成してみました。 そしてcurlでアクセスしてみると

docker run --name nginx001_test -d -p 8081:80 nginx

curl localhost:8081
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>..........
.......

上手く動いているよう… ということは docker run で出来て、 docker-compose up で出来ていないことが分かる。

二つのコンテナの違いを見るためにexecでnginxに入ってみました。

docker exec -it nginx001 bash

#別タブから
docker exec -it nginx001_test bash

docker-compose.ymlで関係のありそうなところを探してみると

        volumes:
        - ./nginx/conf.d:/etc/nginx/conf.d
        - ./nginx/log:/var/log/nginx

/etc/nginx/conf.d内にあるはずのdefault.confが消えていた!

なるほど、動かないわけだ…


*解決策


マウントしてある/nginx/conf.dフォルダ内にdefault.confを作り、上手くいっている方のコンテナからdefault.confの内容をコピペし、

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

upし直すと

docker-compose up -d --force-recreate

上手く動きました。

でもどうしてマウントしてあるのに、conf.dフォルダ内の中身がホスト側に反映されなかったんだろう…という新たな疑問が残りました。
ログファイルの方がうまくマウント出来ているのに…

久しぶりにdockerに触れたので3時間も時間を取られてしまいました…。