Docker 将文件从容器fs复制到同级容器

Docker 将文件从容器fs复制到同级容器,docker,docker-run,Docker,Docker Run,假设我在一个容器中运行,该容器以以下内容开头: docker run -v /var/run/docker.sock:/var/run/docker.sock foo 然后,我从上述容器中启动另一个容器: docker run -v /var/run/docker.sock:/var/run/docker.sock bar 我的问题是-第二个命令中的/var/run/docker.sock是否指向与第一个命令相同的/var/run/docker.sock 容器应该是同级的,所以我的第二个问题

假设我在一个容器中运行,该容器以以下内容开头:

docker run -v /var/run/docker.sock:/var/run/docker.sock foo
然后,我从上述容器中启动另一个容器:

docker run -v /var/run/docker.sock:/var/run/docker.sock bar
我的问题是-第二个命令中的/var/run/docker.sock是否指向与第一个命令相同的/var/run/docker.sock

容器应该是同级的,所以我的第二个问题是-如何使用-v选项将文件从“外部”容器获取到“内部”容器中?我希望做:

docker run -v "/foo:/bar" -v /var/run/docker.sock:/var/run/docker.sock bar

当一个人将docker套接字装入容器时,他/她会让容器控制主机上运行的docker实例

您可以将其视为类似于为多个容器提供网站的URL。类似容器所做的任何事情都会影响到类似的网站,并且所有人都会看到这些变化

具体来说,在这种设置下,没有容器的层次结构:只有多个容器控制同一个docker守护进程,而该守护进程本来可以通过主机上的
docker
命令进行控制。通过docker守护进程,每个容器在主机上执行几乎所有操作的能力都是相同的,默认情况下,容器提供的隔离几乎完全被破坏

出于这个原因,docker中的docker有一些固有的安全含义,但更多关于这些的内容可以在internet的其他地方找到

要回答第二个问题,在容器之间复制文件需要运行一个命令,该命令将在源容器中发出文件的内容,并将其传送到一个命令,该命令将写入目标容器中的目标文件。例如:

docker exec container1 cat /source/file | docker exec -i container2 bash -c "cat > /dest/file"
docker cp container1:/source/file file
docker cp file container2:/dest/file
mkdir shared
docker run -d --name=container1 -v $PWD/shared:/mnt/share image command
docker run -d --name=container2 -v $PWD/shared:/mnt/share image command
复制多个文件可能涉及在源文件中创建tarball并在另一个文件中展开它:

docker exec container1 tar -C /source -c dir| docker exec -i container2 tar -C /dest -x
为了方便起见,对于容器中没有shell或
tar
的情况,
docker cp
可用于将文件从容器复制到主机。通过将文件从源容器复制到主机,然后复制到目标容器,您可以获得相同的解决方案,但需要花费一些临时存储。例如:

docker exec container1 cat /source/file | docker exec -i container2 bash -c "cat > /dest/file"
docker cp container1:/source/file file
docker cp file container2:/dest/file
mkdir shared
docker run -d --name=container1 -v $PWD/shared:/mnt/share image command
docker run -d --name=container2 -v $PWD/shared:/mnt/share image command
不过你发现了什么。另一种方法是将一个目录从主机装载到两个容器中,并通过该目录进行通信。例如:

docker exec container1 cat /source/file | docker exec -i container2 bash -c "cat > /dest/file"
docker cp container1:/source/file file
docker cp file container2:/dest/file
mkdir shared
docker run -d --name=container1 -v $PWD/shared:/mnt/share image command
docker run -d --name=container2 -v $PWD/shared:/mnt/share image command

尽管存在拼写错误,但上面的示例将导致两个容器可用。这两个容器中的进程可以通过
/mnt/share
共享文件,并且将由主机上的
共享
目录支持。

为什么他可以挂载
-v/foo:/bar
?在第一个容器内运行docker时,它是否像第二个容器的卷命令的主机?@matanper您是对的。如果问题中的示例是试图通过
-v
装载使一个容器中的目录可供另一个容器使用,那么这将不会真正起作用。任何
docker
客户端通过该套接字发送的命令都会发送到一个单独的docker守护程序:主机上运行的守护程序。此守护程序希望提供给
-v
的源目录在主机上可用,并将尝试在那里找到它们。OP应该使用此答案(或Docker文档)中描述的技术之一在容器之间复制文件。您可以展示一个在两个容器之间共享卷的示例吗?@MrCholo I在最后一点上进行了一些扩展,但其想法是在主机上创建一个目录(普通ol目录或命名卷)并使用
-v
将其装入两个容器中。这些容器将能够通过这个目录共享文件。