在Windows 8上挂载Docker卷无法工作

3

背景

我想在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不能挂载卷。为什么?

其他信息

  • I am using the Docker Toolbox: https://www.docker.com/products/docker-toolbox
  • I know that's the good IP address because when I try to reach it in my web browser, I see my nginx container displaying logs.
  • The environment variable APPLICATION_PATH set as //C:/Users/my_user/Documents/Development/my_application cannot work because Docker use the ":" character as separator for volume declaration:

    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]

  • It's not a nginx problem because when I create an index.phtml file in the folder, I am able to run it:

    <?php
    echo 'Hello world!';
    

1
你使用“docker for windows”吗?你能验证一下卷“C”是否共享吗?你能在应用程序路径中添加冒号(APPLICATION_PATH=C:/Users/my_user/Documents/Development/my_application)吗?也许这个链接会有所帮助。此外,请验证IP地址。 - Holger
我该如何验证“C”是共享的?对于其他问题,我已编辑了我的原始帖子。 - darckcrystale
@Holger 感谢你的问题,我能够找到问题所在。请看下面的答案,谢谢! - darckcrystale
通常情况下,我很想知道为什么我的问题被踩了 :| - darckcrystale
1个回答

13

好的,我终于做到了!

简述

按照以下步骤可以在容器内访问C:\。

1. 安装Docker工具箱

点击这里下载:https://www.docker.com/products/docker-toolbox

安装它。

2. 运行Hello world

打开Docker快速启动终端。

已打开Docker快速启动终端

在其中运行:

docker run hello-world

3. 将 C:\ 与 Docker 共享

打开 Virtualbox

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 快速启动终端

进入你的 Docker Compose 文件夹,然后启动它:

cd /path_to_your_compose_folder
docker-compose up

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

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

解释Docker栈

默认的虚拟机现在已经在Virtualbox中创建并运行,所以你必须使用Virtualbox共享文件夹。

共享后,默认虚拟机内将有一个挂载了自定义名称(在上面的例子中是"C",但也可以是"elephant"或其他任何名称)的文件夹。

最后,Docker将从默认虚拟机挂载卷到容器中:你必须在卷声明中使用默认机器共享文件夹的名称(在上面的例子中是"C",但也可以是"elephant"或其他任何名称)。

解释Docker文件夹共享


非常感谢您,我已经苦苦挣扎了一段时间,多亏了您的帖子,我解决了这个问题。 - tmp dev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接