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

Posted

技术标签:

【中文标题】Docker:在 Windows 上使用 Docker Toolbox 共享卷【英文标题】:Docker: Sharing a volume on Windows with Docker Toolbox 【发布时间】:2016-03-13 16:41:43 【问题描述】:

我正在尝试通过我的 Windows 7 计算机上的 Docker 容器设置开发人员环境。

我已经为 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'

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

我做错了什么?

【问题讨论】:

【参考方案1】:

请参阅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 服务时,它停止了我的容器并且我的编辑没有保存..有什么想法吗? 那可能需要一个新问题。我宁愿不作为 cmets 解决后续问题。 这个答案是完全有效的。不过也有other ways of using Docker on Windows【参考方案2】: 打开“Oracle VM VirtualBox” 选择“默认”后,点击“配置” 转到“剪切文件夹”添加所需的文件夹

然后在你的控制台输入重启默认

docker-machine 重启默认

【讨论】:

(在VirtualBox 5.2上)你需要勾选“永久”复选框,否则重新启动后添加的文件夹将被删除。 我还必须选中“自动安装”复选框【参考方案3】:

第一步: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

【讨论】:

【参考方案4】:

该消息是“警告”而不是错误消息。你确定你的容器没有创建吗?你检查过命令“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 上运行:(: ( 您确定您实际上可以从 Docker 环境访问 //c/sites。我还没有尝试过 Docker 工具箱。但是对于以前的版本(Boot2Docker),我更喜欢使用 //c/Users/Public 中的路径。在您的情况下,您可能希望将目录站点复制到 C:/Users/Public/sites,然后尝试使用“-v //c/Users/Public/sites:/var/www/html”映射您的卷【参考方案5】:

我认为对于 Docker 卷选项,不需要双引号:

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

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

请参阅 Manage data in containers 上的卷映射示例。

【讨论】:

感谢您的回答 Somnath,但它不会改变任何东西 :(

以上是关于Docker:在 Windows 上使用 Docker Toolbox 共享卷的主要内容,如果未能解决你的问题,请参考以下文章

docker部署安装

Docker 安装应用

浅谈Windows与Linux环境中的Docker容器

VMware安装的Windows10下Docker的安装

如何在 Mac 的 Dock 上对应用程序的多个窗口进行分组

docker 系列 - Dock高阶知识点文章汇集