Dock Nginx como proxy nodejs en local

En este momento estoy usando nginx en Docker para proxy mis aplicaciones de nodo

por ejemplo, website.dev en mi file de host

y mi configuration real de nginx es

 worker_processes 4; pid /run/nginx.pid; events {} http { server { listen 80; server_name website.dev; location / { proxy_pass http://localnode:3000; proxy_set_header X-Base-Path "/"; proxy_set_header Website-Name "test"; } } } 

Y empiezo mi contenedor docker con este command

 docker run --name infra-nginx --add-host localnode:$(ifconfig | grep inet | grep -v inet6 | grep -v 127.0.0.1 | awk '{print $2}') -p 80:80 -d docker-registry.bizzw.com:5000/infra-nginx:dev 

Dónde

 $(ifconfig | grep inet | grep -v inet6 | grep -v 127.0.0.1 | awk '{print $2}') is getting my local ip, not working all the time. 

El problema es que si quiero trabajar sin internet, no puedo. Y cuando cambie mi ip, tengo que reiniciar el contenedor con la nueva ip.

Intenté con esta configuration en su lugar

 worker_processes 4; pid /run/nginx.pid; events {} http { server { listen 80; server_name localhost; location / { return 200 'gangnam style!'; } } server { listen 80; server_name website.dev; location / { proxy_pass http://localhost:3000; proxy_set_header X-Base-Path "/"; proxy_set_header Website-Name "test"; } } } 

Y corriendo

 docker run --name infra-nginx --network host -d docker-registry.bizzw.com:5000/infra-nginx:dev 

En este caso, cuando estoy corriendo:

 curl http://website.dev/ 

yo tengo

 curl: (7) Failed to connect to website.dev port 80: Connection refused 

El docker ps está dando

 81da561dd131 ajouve/infra-nginx:dev "nginx -g 'daemon ..." 32 minutes ago Up 32 minutes infra-nginx 

el netstat -plant me está dando

 Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1/nginx: master pro tcp 0 0 172.17.0.1:35962 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35938 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35994 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:45080 172.17.0.5:6379 ESTABLISHED - tcp 0 0 172.17.0.1:35990 172.17.0.4:27017 ESTABLISHED - tcp 0 0 192.168.65.2:44900 151.101.0.204:80 TIME_WAIT - tcp 0 0 172.17.0.1:45126 172.17.0.5:6379 ESTABLISHED - tcp 0 0 172.17.0.1:36000 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35958 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:59172 172.17.0.3:5672 ESTABLISHED - tcp 0 0 172.17.0.1:35976 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:59106 172.17.0.3:5672 ESTABLISHED - tcp 0 0 172.17.0.1:35980 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35996 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:58356 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35966 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:45112 172.17.0.5:6379 ESTABLISHED - tcp 0 0 172.17.0.1:35932 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:58366 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35998 172.17.0.4:27017 ESTABLISHED - tcp 0 0 192.168.65.2:41386 206.251.255.63:80 TIME_WAIT - tcp 0 0 172.17.0.1:58358 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35956 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35924 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:36004 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:58360 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35964 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35916 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:58362 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:59148 172.17.0.3:5672 ESTABLISHED - tcp 0 0 172.17.0.1:59166 172.17.0.3:5672 ESTABLISHED - tcp 0 0 172.17.0.1:35944 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35912 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35954 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:45116 172.17.0.5:6379 ESTABLISHED - tcp 0 0 172.17.0.1:58354 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35988 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:59122 172.17.0.3:5672 ESTABLISHED - tcp 0 0 192.168.65.2:34936 5.153.231.4:80 TIME_WAIT - tcp 0 0 192.168.65.2:44904 151.101.0.204:80 TIME_WAIT - tcp 0 0 172.17.0.1:59162 172.17.0.3:5672 ESTABLISHED - tcp 0 0 172.17.0.1:59180 172.17.0.3:5672 ESTABLISHED - tcp 0 0 172.17.0.1:45130 172.17.0.5:6379 ESTABLISHED - tcp 0 0 172.17.0.1:59140 172.17.0.3:5672 ESTABLISHED - tcp 0 0 172.17.0.1:36002 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35922 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:35970 172.17.0.4:27017 ESTABLISHED - tcp 0 0 172.17.0.1:58364 172.17.0.4:27017 ESTABLISHED - tcp6 0 0 :::6379 :::* LISTEN - tcp6 0 0 :::15672 :::* LISTEN - tcp6 0 0 :::5672 :::* LISTEN - tcp6 0 0 :::27017 :::* LISTEN - 

Desde el contenedor de docker:

 curl -v localhost 

Está dando

 * Rebuilt URL to: localhost/ * Hostname was NOT found in DNS cache * Trying ::1... * connect to ::1 port 80 failed: Connection refused * Trying 127.0.0.1... * Connected to localhost (127.0.0.1) port 80 (#0) > GET / HTTP/1.1 > User-Agent: curl/7.38.0 > Host: localhost > Accept: */* > < HTTP/1.1 200 OK * Server nginx/1.10.3 is not blacklisted < Server: nginx/1.10.3 < Date: Fri, 29 Sep 2017 08:46:10 GMT < Content-Type: text/plain < Content-Length: 14 < Connection: keep-alive < * Connection #0 to host localhost left intact gangnam style! 

Pero curl -v website.dev está volviendo

 * Rebuilt URL to: website.dev/ * Hostname was NOT found in DNS cache * Trying 127.0.0.1... * Connected to website.dev (127.0.0.1) port 80 (#0) > GET / HTTP/1.1 > User-Agent: curl/7.38.0 > Host: website.dev > Accept: */* > < HTTP/1.1 502 Bad Gateway * Server nginx/1.10.3 is not blacklisted < Server: nginx/1.10.3 < Date: Fri, 29 Sep 2017 08:46:37 GMT < Content-Type: text/html < Content-Length: 173 < Connection: keep-alive < <html> <head><title>502 Bad Gateway</title></head> <body bgcolor="white"> <center><h1>502 Bad Gateway</h1></center> <hr><center>nginx/1.10.3</center> </body> </html> * Connection #0 to host website.dev left intact 

Y docker inspect infra-nginx

 [ { "Id": "16941d22442a257f0874a772df935514c658ac16ec67eb3f65606b4d7c0ee62e", "Created": "2017-09-29T08:31:21.144827953Z", "Path": "nginx", "Args": [ "-g", "daemon off;" ], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 2656, "ExitCode": 0, "Error": "", "StartedAt": "2017-09-29T08:31:21.548119911Z", "FinishedAt": "0001-01-01T00:00:00Z" }, "Image": "sha256:25d085baee52923e32f8d134048238fb67e71173e01f758c391119235f7fc565", "ResolvConfPath": "/var/lib/docker/containers/16941d22442a257f0874a772df935514c658ac16ec67eb3f65606b4d7c0ee62e/resolv.conf", "HostnamePath": "/var/lib/docker/containers/16941d22442a257f0874a772df935514c658ac16ec67eb3f65606b4d7c0ee62e/hostname", "HostsPath": "/var/lib/docker/containers/16941d22442a257f0874a772df935514c658ac16ec67eb3f65606b4d7c0ee62e/hosts", "LogPath": "/var/lib/docker/containers/16941d22442a257f0874a772df935514c658ac16ec67eb3f65606b4d7c0ee62e/16941d22442a257f0874a772df935514c658ac16ec67eb3f65606b4d7c0ee62e-json.log", "Name": "/infra-nginx", "RestartCount": 0, "Driver": "aufs", "MountLabel": "", "ProcessLabel": "", "AppArmorProfile": "", "ExecIDs": null, "HostConfig": { "Binds": null, "ContainerIDFile": "", "LogConfig": { "Type": "json-file", "Config": {} }, "NetworkMode": "host", "PortBindings": {}, "RestartPolicy": { "Name": "no", "MaximumRetryCount": 0 }, "AutoRemove": false, "VolumeDriver": "", "VolumesFrom": null, "CapAdd": null, "CapDrop": null, "Dns": [], "DnsOptions": [], "DnsSearch": [], "ExtraHosts": null, "GroupAdd": null, "IpcMode": "", "Cgroup": "", "Links": null, "OomScoreAdj": 0, "PidMode": "", "Privileged": false, "PublishAllPorts": false, "ReadonlyRootfs": false, "SecurityOpt": null, "UTSMode": "", "UsernsMode": "", "ShmSize": 67108864, "Runtime": "runc", "ConsoleSize": [ 0, 0 ], "Isolation": "", "CpuShares": 0, "Memory": 0, "NanoCpus": 0, "CgroupParent": "", "BlkioWeight": 0, "BlkioWeightDevice": null, "BlkioDeviceReadBps": null, "BlkioDeviceWriteBps": null, "BlkioDeviceReadIOps": null, "BlkioDeviceWriteIOps": null, "CpuPeriod": 0, "CpuQuota": 0, "CpuRealtimePeriod": 0, "CpuRealtimeRuntime": 0, "CpusetCpus": "", "CpusetMems": "", "Devices": [], "DeviceCgroupRules": null, "DiskQuota": 0, "KernelMemory": 0, "MemoryReservation": 0, "MemorySwap": 0, "MemorySwappiness": -1, "OomKillDisable": false, "PidsLimit": 0, "Ulimits": null, "CpuCount": 0, "CpuPercent": 0, "IOMaximumIOps": 0, "IOMaximumBandwidth": 0 }, "GraphDriver": { "Data": null, "Name": "aufs" }, "Mounts": [], "Config": { "Hostname": "moby", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "ExposedPorts": { "443/tcp": {}, "80/tcp": {} }, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "NGINX_VERSION=1.10.3-1~jessie" ], "Cmd": [ "nginx", "-g", "daemon off;" ], "ArgsEscaped": true, "Image": "ajouve/infra-nginx:dev", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": {} }, "NetworkSettings": { "Bridge": "", "SandboxID": "175272649c9a9c5abbfde7516328bdab5cb3825e1e027eee0580eb18f7ff77cb", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": {}, "SandboxKey": "/var/run/docker/netns/default", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "", "Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "", "IPPrefixLen": 0, "IPv6Gateway": "", "MacAddress": "", "Networks": { "host": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "3e04a4c12b5a5b3f55e7b4e918dadec64806b5c926fc249e8aa3e28398a02954", "EndpointID": "7de54daaa31230c9492a463792015af727e9562eaacbaa0c2d70cdc3d3b04236", "Gateway": "", "IPAddress": "", "IPPrefixLen": 0, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "", "DriverOpts": null } } } } ] 

Entonces, cuando lo ejecutas usando el --net host en realidad todavía no está en la networking mac como tal. Es por eso que no está funcionando.

De la documentation

La Mac tiene una dirección IP cambiante (o ninguna si no tiene acceso a la networking). A partir de 17.06, nuestra recomendación es conectarnos al nombre DNS especial solo Mac docker.for.mac.localhost que se resolverá en la dirección IP interna utilizada por el host.

Entonces necesitas cambiar tu configuration a

 worker_processes 4; pid /run/nginx.pid; events {} http { server { listen 80; server_name localhost; location / { return 200 'gangnam style!'; } } server { listen 80; server_name website.dev; location / { proxy_pass http://docker.for.mac.localhost:3000; proxy_set_header X-Base-Path "/"; proxy_set_header Website-Name "test"; } } } 

Y debe ejecutar el contenedor como se muestra a continuación

 docker run --name infra-nginx -p 80:80 -d docker-registry.bizzw.com:5000/infra-nginx:dev 

Lo estás haciendo demasiado complejo. Simplemente EXPONGA un puerto como 8080 del contenedor de su aplicación.

En nginx use:

 listen 80; server_name _; location / { proxy_pass http://127.0.0.2:8080; } 

Ok, creo que la solución que hice es bastante simple.

Primero tengo una aplicación en nodejs ejecutándose en el puerto 3000 en mi máquina local, así que si voy a localhost: 3000 en el browser, puedo ver la aplicación ejecutándose.

Luego creo un file llamado default.conf dentro de una carpeta en mi máquina ~/projects/docker/default.conf , puedes crear ese file donde quieras . Y pegue este código dentro del file:

 server { listen 80; server_name myapp.com; location / { proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } 

}

Mire la línea proxy_pass http://localhost:3000; Estoy networkingireccionando a mi aplicación que se ejecuta en mi máquina local.

Luego ejecuto un nginx container con el siguiente command:

 sudo docker run -d -p 80:80 --name="nginx" --net="host" -v ~/projects/docker/default.conf:/etc/nginx/conf.d/default.conf:ro nginx 

El -p 80:80 es unir ese puerto al nginx container

El --net="host" es decirle al contenedor que la networking que usará es la misma que el host, significa lo mismo que mi máquina, con esto puedo reenviar al localhost:3000 desde el interior del contenedor.

El -v ~/projects/docker/default.conf:/etc/nginx/conf.d/default.conf:ro le dice al nginx que su file de configuration será el file que tengo en mi máquina local.

Significa algo así como: encontrará este file /etc/nginx/conf.d/default.conf en esta location ~/projects/docker/default.conf

Y eso es todo.

Si voy a mi browser y localhost solo localhost (sin el puerto) pasará por el nginx container y será networkingirigido a la aplicación que se ejecuta en el localhost:3000 en mi máquina local

dejame saber si esto te ayuda