Docker容器遇到套接字问题(单独的Flask + Nginx容器)

Eri*_*rik 3 nginx uwsgi docker docker-compose

在运行docker-compose build && docker-compose up并尝试点击我的索引页面后,我的多容器Docker设置遇到以下错误:

[crit] 8#8: *1 connect() to unix:/tmp/uwsgi.sock failed (2: No such file or directory) while connecting to upstream, client: 192.168.99.1, server: localhost, request: "GET / HTTP/1.1", upstream: "uwsgi://unix:/tmp/uwsgi.sock:", host: "192.168.99.100"
Run Code Online (Sandbox Code Playgroud)

这是我的docker-compose.yml:

web:
  restart: always
  build: ./web-app
  expose:
    - "8000"
  command: /usr/local/bin/uwsgi --ini sample-uwsgi.ini

nginx:
  restart: always
  build: ./nginx/
  ports:
    - "80:80"
  links:
    - web:web
Run Code Online (Sandbox Code Playgroud)

nginx的/ Dockerfile

FROM nginx
RUN rm /etc/nginx/conf.d/default.conf
ADD sample-nginx.conf /etc/nginx/conf.d/
Run Code Online (Sandbox Code Playgroud)

nginx的/采样nginx.conf

server {

    listen 80;
    server_name localhost;
    charset utf-8;
    client_max_body_size 75M;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/tmp/uwsgi.sock;
    }
}
Run Code Online (Sandbox Code Playgroud)

web应用程序/ Dockerfile

FROM ansible/ubuntu14.04-ansible:stable

WORKDIR /root
ADD application.py application.py
ADD requirements.txt requirements.txt
ADD sample-uwsgi.ini sample-uwsgi.ini

ADD ansible /srv/ansible
WORKDIR /srv/ansible

RUN ansible-playbook container-bootstrap.yml -c local
Run Code Online (Sandbox Code Playgroud)

web应用程序/采样uswgi.ini

[uwsgi]

module = application
callable = app

master = true
processes = 5

socket = /tmp/uwsgi.sock

chown-socket = www-data:www-data

vacuum = true
enable-threads=True
die-on-term = true
Run Code Online (Sandbox Code Playgroud)

UPDATE

根据@kryten的建议,我将使用TCP/IP

更新了nginx.conf:

server {

    listen 80;
    server_name localhost;
    charset utf-8;
    client_max_body_size 75M;

    location / {
        uwsgi_pass localhost:8000;
        include uwsgi_params;
    }
}
Run Code Online (Sandbox Code Playgroud)

更新了uwsgi.ini:

[uwsgi]

module = application
callable = app

master = true
processes = 5

socket = localhost:8000

chown-socket = www-data:www-data

vacuum = true
enable-threads=True
die-on-term = true
Run Code Online (Sandbox Code Playgroud)

我现在正在追求以下错误:

[error] 8#8: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.99.1, server: localhost, request: "GET / HTTP/1.1", upstream: "uwsgi://127.0.0.1:8000", host: "192.168.99.100"
Run Code Online (Sandbox Code Playgroud)

tuo*_*mur 6

由于webnginx是单独的容器,nginx需要通过TCP 连接到另一台计算机.链接容器已完成大部分工作,您只需指向上游web:8000而不是localhost.


Kry*_*ten 5

看起来您的某个应用程序试图通过Unix套接字而不是通过TCP/IP进行连接.

这不适用于不同的容器,因为在另一个容器中无法访问一个容器(套接字所在的容器)中的文件系统.

解决方案是重新配置应用程序以通过TCP/IP而不是Unix套接字进行连接.

也许能够通过在插座驻留到其他容器中的文件系统暴露的位置进行连接,但我从来没有试过这种&不知道是否会工作.