LoginSignup
1
6

More than 5 years have passed since last update.

docker-nginx を vagrant(centos 7)上で動かしたが、mac(ローカルマシン)から接続できず苦戦した話

Last updated at Posted at 2017-01-17

macから疎通できない…

nginx: nginx:1.10.2-alpine (Official)
vagrant: centos7.0-tommy-muehle

macでcurl 192.168.33.xx:8080としてもdocker logs -f docker_nginx_1にアクセスログすら流れない。しかしvm上で curl localhost:8080 とするとちゃんと返ってくる

考えたこと1

[vagrant or mac] port forwardingがうまくいっていない

→ (centos)netstat -tanp | grep LISTEN
→(mac)lsof -i -P | grep "LISTEN"
http://qiita.com/RyujiKawazoe/items/e45d1c5bf9892123d00f
問題なし

考えたこと2

[docker] docker-compose.ymlの設定が誤っている

  nginx:
    image: nginx:1.10.2-alpine
    volumes:
     - ./nginx/nginx.conf:/etc/nginx/nginx.conf
     - ./nginx/mynginx.cnf:/etc/nginx/conf.d/mysite.template
    ports:
     - "8080:80"
    environment:
     - NGINX_HOST=127.0.0.1
     - NGINX_PORT=80
     .....
    command: /bin/sh -c "envsubst < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"

「公式からコピペしてきたしそんな変な設定してないっしょ」と思い軽く流し読み。(この思い込みが良くなかった…)

考えたこと3

[docker] nginx.confが誤っている

upstream backend {
    server ${NGINX_HOST_SERVER}:1337;
}

server {
    listen ${NGINX_PORT};
    server_name ${NGINX_HOST};

    location ~ .*\.(jpg|gif|png|css|js|inc|ico) {
        expires 30d;
        root  ${NGINX_WEB_ROOT};
    }

    location / {
        add_header Access-Control-Allow-Origin '*';
        add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
        add_header Access-Control-Allow-Headers 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
        add_header Access-Control-Allow-Credentials true;

        expires modified +10m;
        proxy_pass  http://backend;
        break;
    }
}

これもざっと見(他のPJで使用していて実績があったため)OKっぽい

考えたこと4

[vagrant] firewalldが動いている

OFFにしたよなぁと思いつつ念のため見返すも、やはり動いてない

考えたこと5

[vagrant] 消滅したはずのiptablesが何か悪さをしている

動いてない

そして正解へ

CentOS7 (vagrant) に docker をインストールして nginx で hello world するまで
を見つけ、この通りに実行するとすんなりmacからtelnetが通るではないか。
(sudo sysctl -w net.ipv4.ip_forward=1をvagrant上で実行する必要はあったが)

これはいよいよ、nginx.confくらいしか違いがないぞということで見直すと…

server_name ${NGINX_HOST};が間違ってただけ(白目)

nginxは HTTP リクエストに対して、最初にどのサーバでそれを処理すべきか を決定します。その際に用いられるのが、リクエストヘッダ中の Host フィールド です。以下の例では、このHost フィールドと server_name が一致した 場合、該当するサーバ設定が採用されます。

誤:server_name 127.0.0.1;
正:server_name _; or server_name 192.168.33.xx;

(何にもマッチしないと最初のserverディレクティブが使われるので。あるいはVagrantfileのprivate_networkで設定したIPでも良い)

おわりに

めっちゃはまった...

(追記)19:59

vagrant:~ $ sudo sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1

なんかこいつが重要な気がしてきた…
これが無効だとそもそも疎通できない?(要調査)

1
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
6