Docker:如何在Windows上使用Docker Toolbox共享卷

21

我正在尝试通过Docker容器在我的Windows 7电脑上设置开发环境。

我已经安装了Windows版的Docker工具箱。

我有一个包含Apache和PHP 5.6的镜像,如下所示:

FROM php:5.6.15-apache

RUN apt-get update && apt-get install -y \
apt-utils vim git php5-mysql php5-memcache php5-memcached php5-intl \
wget
RUN apt-get install libapache2-mod-php5 -y -o Dpkg::Options::="--force-confdef"
RUN docker-php-ext-install mbstring
RUN docker-php-ext-install pdo pdo_mysql
RUN apt-get install libcurl4-gnutls-dev -y
RUN docker-php-ext-install curl
RUN a2enmod rewrite

ENV APACHE_RUN_USER myname
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
ENV APACHE_PID_FILE /var/run/apache2.pid

EXPOSE 80

COPY php.ini /usr/local/etc/php/php.ini
COPY apache-config.conf /etc/apache2/sites-enabled/000-default.conf
RUN echo "ServerName 127.0.1.1" >> /etc/apache2/apache2.conf

这个镜像已经被创建,我可以通过在Docker快速启动终端中运行“docker images”来查看它。

在我的apache-config.conf文件中,我只有一个小小的虚拟主机,用于访问一个只有一个index.php文件的测试网站。

然后我尝试在Docker快速启动终端中创建容器:

docker run --name=php5.6_container --rm -v "//c/sites:/var/www/html" -p 80:80 -p 8080:8080 php5.6

我收到了以下错误信息:

AH00112: Warning: DocumentRoot [/var/www/html/test] does not exist
AH00112: Warning: DocumentRoot [/var/www/html/test] does not exist
[Tue Dec 08 16:36:37.703143 2015] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.10 (Debian) configured -- resuming normal operations
[Tue Dec 08 16:36:37.703733 2015] [core:notice] [pid 1] AH00094: Command line: '
apache2 -D FOREGROUND'

看起来我的音量选项没有被考虑在内。并且容器没有被创建。

我可能做错了什么?

5个回答

59

请参阅https://docs.docker.com/engine/userguide/dockervolumes/#mount-a-host-directory-as-a-data-volume上的Windows和Mac的备注。 特别的是:

如果您在Mac或Windows上使用Docker Machine,则您的Docker守护程序仅对您的OS X或Windows文件系统具有有限访问权限。 Docker Machine会尝试自动共享您的 /Users (OS X) 或 C:\Users (Windows) 目录。

基本上,您需要将站点文件移动到某个位置,例如c:\Users\sites,然后使用文档中建议的方法进行挂载。

docker run --name=php5.6_container --rm -v "/c/Users/sites:/var/www/html" -p 80:80 -p 8080:8080 php5.6

谢谢您先生!接下来,如果您有想法,我还有另一个问题:现在我的容器已经启动并运行了Apache,但我尝试在浏览器中访问它却无法做到。我尝试检查我的容器,但没有找到IP地址("IPAddress":" "),当我尝试编辑容器上的/etc/hosts文件以添加127.0.0.1 test.loc,并重新启动apache2服务时,它停止了我的容器并且我的编辑未被保存...有什么想法吗? - jiboulex
2
那可能需要一个新的问题。我宁愿不要在评论中解决后续问题。 - Andy Shinn
这个答案完全有效。然而,在Windows上使用Docker的其他方法也是存在的。 - Grzegorz Gajos

6
  • 打开 "Oracle VM VirtualBox"
  • 一旦选择了 "default",点击 "配置"
  • 进入 "共享文件夹",添加所需的文件夹
  • 然后通过在控制台中键入以下内容重启 "default"

    docker-machine restart default


2
(在VirtualBox 5.2上)您需要勾选“使其永久”复选框,否则添加的文件夹将在重新启动后被删除。 - joniba
我还必须选择“自动挂载”复选框。 - Michal Fapso

4

步骤1:C:/Program Files/Oracle/VirtualBox/VBoxManage sharedfolder add default -name $shared_folder -hostpath d:/data

显示共享文件夹:

VBoxManage showvminfo default | less

步骤2(a):mount -t vboxsf -o uid=1000,gid=50 $shared_folder /data

步骤2(b):将自动挂载添加到boot2docker中

登录到机器后,以root身份编辑/创建/mnt/sda1/var/lib/boot2docker/bootlocal.sh文件,并将下面的块添加到文件中,sda1可能与您的不同...

mkdir -p /data mount -t vboxsf -o uid=1000,gid=50 $shared_folder /data

然后,docker-machine restart default

步骤3:在运行容器时添加卷(以gogs为例) docker run --name=gogs -rm --net=host -d -v /fuple:/data gogs/gogs


0

我认为在Docker卷选项中,不需要使用双引号:

docker run --name=php5.6_container --rm -v //c/sites:/var/www/html -p 80:80 -p 8080:8080 php5.6

检查它是否正常工作。我不确定。

请参阅卷映射示例,网址为在容器中管理数据


谢谢你的回答,Somnath,但它并没有改变任何东西 :( - jiboulex

0

这个消息是一个“警告”,而不是错误消息。你确定你的容器没有被创建吗?你用命令“docker ps -a”检查过了吗?

如果这个消息是你问题的根本原因,你应该解决容器内 /var/www/html/test 不存在的问题。如果它不需要,你应该从 Apache 配置中删除它(可能在文件 /etc/apache2/sites-enabled/000-default.conf 或 /etc/apache2/apache2.conf 中)。

如果 /var/www/html/test 是必需的,你可以尝试添加

RUN mkdir /var/www/html/test

在您的Dockerfile中,为了确保目录存在,需要添加以下代码。

此外,为了尝试调试问题,您可能希望尝试在不使用卷的情况下运行容器。如果没有错误,则应进入容器(“docker exec -it php5.6_container bash”),以便在容器内调试潜在问题并检查容器的结构。


我使用docker ps -a命令检查了运行后的情况,但没有创建容器。我尝试了在卷选项中去掉引号再次运行命令,但出现了相同的错误,不过这次容器被创建了。我不想运行mkdir命令,因为测试文件夹应该在我正在尝试与容器共享的卷中:( 在Linux上它运行良好,但我无法在Windows上使其工作:( :( - jiboulex
1
你确定你的Docker环境实际上可以访问//c/sites吗?我还没有尝试过Docker工具箱。但是在之前的版本(Boot2Docker)中,我更喜欢使用//c/Users/Public路径。在你的情况下,你可能想将目录sites复制到C:/Users/Public/sites,然后尝试使用“-v //c/Users/Public/sites:/var/www/html”映射你的卷。 - iclman

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