安装在 Windows 8 上的 Docker 卷不起作用

标签 docker docker-compose

语境

我想在 Windows 8 上运行 Docker Compose 应用程序。我在 Ubuntu 16.04 下制作它并且它完美地工作。

这个 Docker Compose 运行:

  • nginx
  • php-fpm

  • 这两个容器使用卷。

    文件

    我的 .env文件:
    COMPOSE_CONVERT_WINDOWS_PATHS=1
    APPLICATION_PATH=//C/Users/my_user/Documents/Development/my_application
    

    我的 docker-compose.yml文件:
    version: '2'
    
    services:
      web:
        build: ../application-web/
        ports:
         - "80:80"
        tty: true
        # Add a volume to link php code on the host and inside the container
        volumes:
         - ${APPLICATION_PATH}:/usr/share/nginx/html/application
         - ${APPLICATION_PATH}/docker_files/docker-assistant:/usr/share/nginx/html/assistant
        # Add hostnames to allow devs to call special url to open sites
        extra_hosts:
         - "localhost:127.0.0.1"
         - "assistant.docker:127.0.0.1"
         - "application.dev:127.0.0.1"
        depends_on:
         - custom-php
        links:
         - custom-php:custom-php
    
      custom-php:
        build: ../application-php/
        ports:
         - "50:50"
        volumes:
         - ${APPLICATION_PATH}:/usr/share/nginx/html/application
         - ${APPLICATION_PATH}/docker_files/docker-assistant:/usr/share/nginx/html/assistant
    

    问题

    当我跑 docker-compose up , 一切顺利。容器启动。
    但是当我尝试联系 http://192.168.99.100 时在我的网络浏览器中,我收到了 403 错误。

    我的调查显示在 nginx 和 php 容器中没有挂载的卷:
    docker exec -it compose_web_1 bash
    ls -la /usr/share/nginx/html/assistant/
    

    显示
    drwxr.xr.x 2 root root   80 May 18 15:30 .
    drwxr.xr.x 2 root root 4096 May 18 16:10 ..
    

    Docker 似乎无法挂载卷。为什么?

    其他信息
  • 我正在使用 Docker 工具箱:https://www.docker.com/products/docker-toolbox
  • 我知道这是一个很好的 IP 地址,因为当我尝试在我的 Web 浏览器中访问它时,我看到我的 nginx 容器显示日志。
  • 环境变量 APPLICATION_PATH设为 //C:/Users/my_user/Documents/Development/my_application无法工作,因为 Docker 使用“:”字符作为卷声明的分隔符:

    ERROR: Volume //C:/Users/my_user/Documents/Development/my_application://C:/Users/my_user/Documents/Development/my_application has incorrect format, should be external:internal[:mode]

  • 这不是 nginx 问题,因为当我创建 index.phtml 时文件夹中的文件,我可以运行它:
    <?php
    echo 'Hello world!';
    
  • 最佳答案

    好吧,我终于做到了!

    TL; 博士

    按照这些说明访问容器内的 C:\。

    1.安装Docker工具箱

    去这里拿:https://www.docker.com/products/docker-toolbox

    安装它。

    2. 运行一个 Hello world

    打开 Docker 快速入门终端。

    Docker Quickstart Terminal opened

    在里面运行:

    docker run hello-world
    

    3. 与 Docker 共享 C:\

    打开虚拟机

    Virtualbox opened
    default的开启配置虚拟机并转至 shared folders
    Configuration of the default virtual machine

    通过单击右侧的按钮修改或创建新的共享文件夹。将选项设置为:
  • C:\
  • C
  • 自动安装
  • 永久配置

  • 然后验证。

    enter image description here

    4.激活分享

    关闭 default虚拟机然后重新启动它。

    5. 设置你的路径

    例如。如果您有 .env文件:
    COMPOSE_CONVERT_WINDOWS_PATHS=1
    APPLICATION_PATH=//C/path_from_C_to_the_folder_you_want_to_share_on_the_volume
    

    /!\需要设置 COMPOSE_CONVERT_WINDOWS_PATHS到 1!

    6. 开始你的 Compose

    在 Docker 快速入门终端中:

    Docker Quickstart Terminal opened

    转到您的 Docker Compose 文件夹,然后启动它:
    cd /path_to_your_compose_folder
    docker-compose up
    

    我为什么要这样做?太复杂了!

    Docker 技术依赖于 Linux 命名空间。没有 Linux,它就无法工作。要允许在 Windows 上使用 Docker,Docker 需要安装 Linux 虚拟机。所有的容器都将在其中运行。

    Docker stack explained
    default虚拟机现在已在 Virtualbox 中创建并运行,这就是您必须使用 Virtualbox 共享文件夹的原因。

    分享后,default虚拟机将在其中安装一个带有自定义名称的文件夹(在上面的示例中,它是 C,但也可以是 elephant 或其他名称)。

    最后,Docker 将从 default 挂载卷。虚拟机到容器:你得用default的名字卷声明中的机器共享文件夹(在上面的示例中,它是 C,但它可以是 elephant 或其他)。

    Docker folder share explained

    关于安装在 Windows 8 上的 Docker 卷不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44054058/

    相关文章:

    linux - 我应该在 Windows 或 Docker 命令行上运行 Docker 命令吗?

    docker - 通过Jenkins将SpringBoot部署到docker中的另一台服务器

    docker - Ubuntu docker-compose 错误的 Compose 文件版本

    node.js - 使用 `docker-compose run`时无法调试,但是 `docker-compose up`有效

    angular - 为 Angular 项目启用 Docker 支持

    node.js - 显示正方形的图表 js

    php - 如何防止 Docker Compose 卷覆盖 `composer install` 的更改?

    mysql - Docker MySQL连接DBeaver

    docker-compose - 如何在 Ansible 中运行临时 docker compose 命令?

    django - Docker:服务 'web'无法构建(Django应用程序)