使用 NGINX 反向代理在 Azure Linux 应用程序服务上为容器提供 Docker Compose:拨打 unix /tmp/docker.sock:连接:没有此类文件或目录

fra*_*ezy 5 nginx docker docker-compose azure-web-app-service jwilder-nginx-proxy

我正在使用 Docker Compose 在 Azure Linux 应用服务容器上运行 ASP.NET Core 3.0 多容器应用程序。容器通过 CI 管道构建并推送到 Azure 容器注册表,CD 管道使用“docker-compose.[environment].yml”部署到应用程序服务。

我正在尝试使用 nginx 和 jwilder 的 docker-gen 作为反向代理(单独的容器以避免将 docker 套接字绑定到公开暴露的容器服务),并使用虚拟主机名通过网络访问各种服务。

我似乎在以下三个错误之间兜圈子:

1. Web 应用程序显示“欢迎使用 Nginx”页面,并重复日志:

2020-02-26T15:18:44.021444322Z 2020/02/26 15:18:44 观看 docker 事件

2020-02-26T15:18:44.022275908Z 2020/02/26 15:18:44 检索 docker 服务器信息时出错:获取http://unix.sock/info:拨打 unix /tmp/docker.sock:连接:没有这样的文件或目录

2020-02-26T15:18:44.022669201Z 2020/02/26 15:18:44 列出容器时出错:获取http://unix.sock/containers/json?all=1:拨打 unix /tmp/docker.sock:连接:没有这样的文件或目录

2020-02-26T15:18:44.405594944Z 2020/02/26 15:18:44 Docker 守护进程连接中断

2. 502 网关错误

502 - Web 服务器在充当网关或代理服务器时收到无效响应。您要查找的页面有问题,无法显示。当 Web 服务器(充当网关或代理)联系上游内容服务器时,它从内容服务器收到无效响应。

3. 应用服务的“应用程序错误:(”页面。

这是我的 docker-compose.development.yml:

version: "3.7"

services:
  nginx:
    image: nginx
    environment:
      DEFAULT_HOST: ***.azurewebsites.net
    ports:
      - "80:80"
    volumes:
      - "${WEBAPP_STORAGE_HOME}/tmp/nginx:/etc/nginx/conf.d"

  dockergen:
    image: jwilder/docker-gen
    command: -notify-sighup nginx -watch /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf
    volumes_from:
      - nginx
    volumes:
      - "/var/run/docker.sock:/tmp/docker.sock:ro"
      - "${WEBAPP_STORAGE_HOME}./nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl"

  webapp:
    image: ***.azurecr.io/digitalcore:dev
    restart: always
    environment:
      VIRTUAL_HOST: ***.azurewebsites.net
    depends_on:
      - nginx
Run Code Online (Sandbox Code Playgroud)

“webapp”服务 dockerfile(公开端口 80、443):

FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
WORKDIR /source

COPY . .
RUN dotnet restore

RUN dotnet publish --output /app/ --configuration Release --no-restore

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
WORKDIR /app
COPY --from=build /app .

EXPOSE 80 443
ENTRYPOINT ["dotnet", "DigitalCore.WebApp.dll"]
Run Code Online (Sandbox Code Playgroud)

错误 #1 似乎是我最接近看到它工作的,问题集中在为 Azure Linux 应用服务正确配置卷(经过大量挖掘后,${WEBAPP_STORAGE_HOME} 出现了)。

到目前为止,网络和容器名称似乎只会让我的工作变得更糟,因此它们被删除,以尝试保持最基本的功能以使其正常工作。“webapp”服务是我目前关注的焦点

有人能发现我哪里错了吗?我将永远感激任何智慧的话语......

更新:

看起来有些进展 - 从容器卷中删除“ro”权限后,现在可以找到 docker.sock,但 docker-gen 无法连接到端点。

2020-02-26T22:21:44.186316399Z 2020/02/26 22:21:44 观看 docker 事件

2020-02-26T22:21:44.187487428Z 2020/02/26 22:21:44 检索 docker 服务器信息时出错:无法连接到 Docker 端点

2020-02-26T22:21:44.188270247Z 2020/02/26 22:21:44 列出容器时出错:无法连接到 Docker 端点

2020-02-26T22:21:44.500471940Z 2020/02/26 22:21:44 Docker 守护进程连接中断

更新2

我现在已经构建了容器并推送到 Azure 容器注册表,因此我不会从不同的位置拉取。这是我当前的 docker-compose:

version: "3.7"

services:
  nginx:
    image: ***.azurecr.io/nginx:dev
    ports:
      - "80:80"
    volumes:
      - "${WEBAPP_STORAGE_HOME}/etc/nginx/conf.d"

  dockergen:
    image: ***.azurecr.io/dockergen:dev
    privileged: true
    command: -notify-sighup nginx -watch -only-exposed /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf
    volumes_from:
      - nginx
    volumes:
      - "${WEBAPP_STORAGE_HOME}/var/run/docker.sock:/tmp/docker.sock"
      - "${WEBAPP_STORAGE_HOME}./nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl"

  webapp:
    image: ***.azurecr.io/digitalcore:dev
    restart: always
    environment:
      VIRTUAL_HOST: ***.azurewebsites.net
    depends_on:
      - nginx
Run Code Online (Sandbox Code Playgroud)