协慌网

登录 贡献 社区

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

我正在尝试将主机目录挂载到 Docker 容器中,以便主机上完成的所有更新都将反映到 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

1 directory, 5 files kishore$ pwd /Users/kishore/tdock

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 <code translate="no">c9f9a7e09c54ee1c2cc966f15c963b4af320b5203b8c46689033c1ab8872a0ea</code>

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 exit

kishore$ docker -v
Docker version 0.9.1, build 867b2a9

  • 我不知道如何检查 boot2docker 版本

问题,面临的问题:

  1. 我该如何将 main_folder 链接到 docker 容器中存在的 test_container 文件夹?
  2. 我需要自动进行此操作。如何在不真正使用run -d -v命令的情况下做到这一点?
  3. 如果 boot2docker 崩溃怎么办? Docker 文件存储在哪里(除 Dockerfile 之外)?

答案

您可以通过几种方法来执行此操作。最简单的方法是使用 dockerfile ADD命令,如下所示:

ADD . /path/inside/docker/container

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

执行此操作的第二种方法是尝试的方法,即装入卷。由于尝试尽可能地可移植,您无法将主机目录映射到 dockerfile 中的 docker 容器目录,因为主机目录可以根据运行的机器而更改。要将主机目录映射到 Docker 容器目录,您需要在使用docker run -v标志,例如:

# Run a container using the `alpine` image, mount the `/tmp`
# directory from your host into the `/container/directory`
# directory in your container, and run the `ls` command to
# show the contents of that directory.
docker run \
    -v /tmp:/container/directory \
    alpine \
    ls /container/directory

这个问题的用户使用的是Docker version 0.9.1, build 867b2a9 ,我将为您提供 docker 版本 > = 17.06 的答案。

您想要的是,使本地目录在容器目录内保持同步,这是通过安装类型为bind的卷来完成的。这将绑定源(您的系统)和目标(在 Docker 容器中)目录。这几乎与在 Linux 上安装目录相同。

根据 Docker 文档,现在要安装的适当命令是mount而不是-v 。这是它的文档:

  • --mount :由多个键值对组成,用逗号分隔。每个键 / 值对采用<key>=<value>元组的形式。 --mount语法比-v--volume更为冗长,但是键的顺序并不重要,并且标志的值更易于理解。

  • 安装的type ,可以是bindvolumetmpfs(我们将使用bind

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

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

/test_container (目标)挂载当前目录(源),我们将使用:

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

您还必须处理文件权限,请参阅本文

2 个连续的挂载:我想这里很多帖子可能正在使用两个 boot2docker,您看不到任何东西的原因是您是从 boot2docker 而不是从主机装载目录。

您基本上需要连续 2 次安装:

第一个将目录从主机装载到系统的目录

第二个将新目录从 boot2docker 挂载到您的容器,如下所示:

  • boot2docker上挂载本地系统

    sudo mount -t vboxsf hostfolder /boot2dockerfolder
  • 2)在 Linux 容器上boot2docker

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

然后,当你ls里面containerfolder你会看到你的内容hostfolder