如何在Docker容器中装载主机目录?

我正在尝试将一个主机目录挂载到docker容器中,以便在主机上完成的所有更新都反映到docker容器中。 在Google和Google阅读docker链接之后,我无法成功。

有人可以指出我在哪里做错了吗? 这是我做的

kishore$ cat Dockerfile 
 FROM ubuntu:trusty RUN apt-get update RUN apt-get -y install git curl vim CMD ["/bin/bash"] WORKDIR /test_container VOLUME ["/test_container"] 

 kishore$ tree . ├── Dockerfile └── main_folder ├── tfile1.txt ├── tfile2.txt ├── tfile3.txt └── tfile4.txt 

kishore$ tree . ├── Dockerfile └── main_folder ├── tfile1.txt ├── tfile2.txt ├── tfile3.txt └── tfile4.txt

1目录,5个文件
kishore $ pwd
/用户/基肖尔马布/ tdock

 kishore$ docker build --tag=k3_s3:latest . 

kishore$ docker build --tag=k3_s3:latest .

 Uploading context 7.168 kB Uploading context Step 0 : FROM ubuntu:trusty ---> 99ec81b80c55 Step 1 : RUN apt-get update ---> Using cache ---> 1c7282005040 Step 2 : RUN apt-get -y install git curl vim ---> Using cache ---> aed48634e300 Step 3 : CMD ["/bin/bash"] ---> Running in d081b576878d ---> 65db8df48595 Step 4 : WORKDIR /test_container ---> Running in 5b8d2ccd719d ---> 250369b30e1f Step 5 : VOLUME ["/test_container"] ---> Running in 72ca332d9809 ---> 163deb2b1bc5 Successfully built 163deb2b1bc5 Removing intermediate container b8bfcb071441 Removing intermediate container d081b576878d Removing intermediate container 5b8d2ccd719d Removing intermediate container 72ca332d9809 

kishore $ docker run -d -v / Users / kishore / main_folder:/ test_container k3_s3:latest
c9f9a7e09c54ee1c2cc966f15c963b4af320b5203b8c46689033c1ab8872a0ea

 kishore$ docker run -i -t k3_s3:latest /bin/bash 

kishore$ docker run -i -t k3_s3:latest /bin/bash

 root@0f17e2313a46:/test_container# ls -al total 8 drwx------ 2 root root 4096 Apr 29 05:15 . drwxr-xr-x 66 root root 4096 Apr 29 05:15 .. 

root @ 0f17e2313a46:/ test_container#exit
出口

 kishore$ docker -v Docker version 0.9.1, build 867b2a9 
  • 我不知道如何检查boot2docker版本

问题,面临的问题:

  1. 如何将main_folder链接到docker容器中的test_container文件夹?
  2. 我需要做这个自动,如何做到这一点,而不是真的使用运行-d -v命令。
  3. 如果boot2docker崩溃会发生什么? docker文件在哪里存储(除了Dockerfile)?

有几种方法可以做到这一点。 最简单的方法是使用dockerfile ADD命令,如下所示:

 ADD . /path/inside/docker/container 

但是,在构builddockerfile之后,主机上对此目录所做的任何更改都不会显示在容器中。 这是因为在构build容器时,docker将目录压缩为.tar ,并将该上下文永久上传到容器中。

第二种方法是尝试安装一个卷。 由于尝试尽可能便携,因此无法将主机目录映射到dockerfile中的泊坞窗容器目录,因为主机目录可以根据运行的计算机而更改。 要将主机目录映射到docker容器目录,需要在使用docker运行时使用-v标志,如下所示:

 docker run -v /host/directory:/container/directory -other -options image_name command_to_run 

2个连续的坐骑:我猜这里的许多post可能会使用两个boot2docker,原因是你没有看到任何东西,因为你是从boot2docker挂载一个目录而不是你的主机。 你基本上需要2个连续的挂载:第一个从你的主机挂载一个目录到你的系统,第二个挂载新的目录从boot2docker到你的容器,像这样:

1.在boot2docker上挂载本地系统

 sudo mount -t vboxsf hostfolder /boot2dockerfolder 

2.在linux容器上挂载boot2docker文件

 docker run -v /boot2dockerfolder:/root/containerfolder -i -t imagename 

那么当你在容器文件夹里面时,你会看到你的主文件夹的内容

是否有可能通过boot2docker或类似的东西在OS X上使用boot2docker

我已经做了相同的经验 – 命令是正确的,但无论如何,没有任何东西(明智的)被安装在容器中。

事实certificate,这已经在docker文档中解释了。 当你键入docker run -v /var/logs/on/host:/var/logs/in/container ...那么/var/logs/on/host实际上是从boot2docker VM镜像映射的,而不是你的Mac镜像。

你将不得不通过你的虚拟机pipe道共享文件夹到你的实际主机(在我的情况下,Mac)。

你可以使用cli的-v选项,这个工具不能通过Dockerfile来使用

docker run -t -i -v <host_dir>:<container_dir> ubuntu /bin/bash

其中host_dir是您要装载的主机的目录。 你不需要担心容器的目录,如果不存在,docker会创build它。

如果你在主机上做了host_dir的任何修改(在root权限下),它对容器是可见的,反之亦然。

[更新]截至2017年6月, Docker for Mac负责处理所有烦人的部分,您必须要处理VirtualBox。 它使您可以使用/private前缀映射本地主机上的所有内容。 更多信息在这里 。 [/ UPDATE]

所有当前的答案都谈论Boot2docker。 因为现在已经不赞成docker-machine了,所以对docker-machine有效:

首先,进入docker-machine虚拟机并创build我们要映射到的文件夹:

 docker-machine ssh $MACHINE_NAME "sudo mkdir -p \"$VOL_DIR\"" 

现在将文件夹共享到VirtualBox:

 WORKDIR=$(basename "$VOL_DIR") vboxmanage sharedfolder add "$MACHINE_NAME" --name "$WORKDIR" --hostpath "$VOL_DIR" --transient 

最后,再次进入docker-machine并挂载我们刚分享的文件夹:

 docker-machine ssh $MACHINE_NAME "sudo mount -t vboxsf -o uid=\"$U\",gid=\"$G\" \"$WORKDIR\" \"$VOL_DIR\"" 

注意:对于UID和GID,只要尚未被占用,基本上可以使用任何整数。

这是在OS X El Capitan的docker-machine 0.4.1和docker 1.8.3上testing的。

我只是尝试让我的SailsJS应用程序在Docker容器中运行,以保持我的物理机器清洁。

我正在使用以下命令在/ app下挂载我的SailsJS / NodeJS应用程序:

 cd my_source_code_folder
 docker run -it -p 1337:1337 -v $(pwd):/ app my_docker / image_with_nodejs_etc
 docker run -v /host/directory:/container/directory -t IMAGE-NAME /bin/bash docker run -v /root/shareData:/home/shareData -t kylemanna/openvpn /bin/bash 

在我的系统中,我已经更正了nhjk的答案,当您添加-t标志时,它的工作完美无瑕。

2015年7月更新 – boot2docker现在支持直接安装。 您可以直接从Mac提示符使用-v /var/logs/on/host:/var/logs/in/container ,而无需双重安装

boot2docker与VirtualBox Guest Additions一起使用
如何挂载/用户到boot2docker

https://medium.com/boot2docker-lightweight-linux-for-docker/boot2docker-together-with-virtualbox-guest-additions-da1e3ab2465c

tl; dr使用VirtualBox Guest Additions构build自己的定制boot2docker.iso(请参阅链接 )或下载http://static.dockerfiles.io/boot2docker-v1.0.1-virtualbox-guest-additions-v4.3.12.iso并保存到〜/ .boot2docker / boot2docker.iso。

如何将main_folder链接到Docker容器中的test_container文件夹?

下面的命令是正确的,除非您在使用boot2docker的mac上(取决于将来的更新),在这种情况下,您可能会find该文件夹​​为空。 请参阅mattes回答一个教程纠正这一点。

 docker run -d -v /Users/kishore/main_folder:/test_container k3_s3:latest 

我需要使这个自动运行,如何做到这一点,而不真正使用运行-d -v命令。

你不能真正摆脱使用这些命令,它们是docker工作方式的内在。 你最好将它们放到一个shell脚本中,以免你重复写出它们。

如果boot2docker崩溃会发生什么? docker文件存储在哪里?

如果您设法使用-v arg并引用您的主机,那么这些文件在主机上将是安全的。

如果你已经使用了“docker build -t myimage”。 与一个Dockerfile然后你的文件将被烘焙到图像。

我相信你的docker图像存储在boot2docker-vm中。 当我从VirtualBox中删除虚拟机时,我发现了这个问题。 (注意,我不知道Virtualbox是如何工作的,所以图片可能仍然隐藏在其他地方,只是不可见泊坞窗)。

这个问题的用户使用Docker version 0.9.1, build 867b2a9 ,我会给你一个docker版本> = 17.06的答案。

你想要什么,保持本地目录在容器目录内同步,是通过挂载typesbind卷来完成的。 这将绑定源(您的系统)和目标(在docker容器)目录。 这几乎与在Linux上安装目录相同。

根据Docker的文档 ,相应的挂载命令现在mount而不是-v 。 这是它的文档:

  • --mount :由多个键值对组成,用逗号分隔,每个由一个元组组成。 --mount语法比-v--volume更详细,但键的顺序不重要,标志的值更易于理解。

  • mount的type ,可以是bindvolumetmpfs(我们要使用绑定

  • 山的source 。 对于绑定挂载,这是Docker守护程序主机上文件或目录的path。 可以指定为sourcesrc

  • destination将文件或目录将被安装在容器中的path作为其值。 可能被指定为destinationdsttarget

所以,要使用/test_container (target)装载当前目录(源),我们将使用:

  docker run -it --mount src="$(pwd)",target=/test_container,type=bind k3_s3 

如果这些装载参数有空格,则必须在它们周围加引号。 当我知道他们不知道的时候,我会用`pwd`代替:

  docker run -it --mount src=`pwd`,target=/test_container,type=bind k3_s3 

你也将不得不处理文件的权限,看到这篇文章 。

有同样的问题。 在docker文档中find这个:

注意:主机目录本质上取决于主机。 因为这个原因,你不能从Dockerfile挂载一个主机目录,VOLUME指令不支持传递一个host-dir,因为内置映像应该是可移植的。 主机目录在所有可能的主机上都不可用。

所以,只有在docker run命令中使用-v参数才能挂载一个读/写主机目录,因为其他答案正确地指出了这一点。

我发现像/ var / usr / etc这样的系统指令下的任何目录都不能在容器下挂载。

指令应在用户的空间-v切换指示docker守护程序将本地目录挂载到容器

docker run -t -d -v / {local} / {path}:/ {container} / {path} –name {container_name} {imagename}