关于Docker文件系统的奥秘

时间:2018-06-22 10:26:48

标签: docker filesystems

刚刚开始使用docker。我已经创建了一个映像,启动了一个容器,但是当我在容器中写入文件时,它会显示在本地磁盘上。我不知道为什么会这样,如果那样的话,我怎么可能运行图像的许多实例。

这就是我要做的

docker container ls
 CONTAINER ID        IMAGE               COMMAND                  
 CREATED             STATUS              PORTS                    NAMES
 5bf6d45b4f79        docker_1_web        "bundle exec rails s…"   About an hour ago   Up About an hour    0.0.0.0:3000->3000/tcp   docker_1_web_1
 d5d0991da014        postgres            "docker-entrypoint.s…"   About an hour ago   Up About an hour    5432/tcp                 docker_1_db_1

然后

docker exec -it 5bf6d45b4f79 echo "hello" > temp.txt

docker exec -it 5bf6d45b4f79 cat temp.txt
hello

但是在Mac命令行上的本地磁盘上

cat temp.txt
hello

在我的Mac命令行上是

echo "goodbye" >> temp.txt
cat temp.txt
hello
goodbye

然后在容器中

docker exec -it 5bf6d45b4f79 cat temp.txt
hello
goodbye

Du!怎么来的?我以为Docker容器写入了自己的文件系统。所以我完全迷惑了。

这也意味着我无法运行图像的多个实例,因为它们都将写入相同的文件。

3 个答案:

答案 0 :(得分:3)

让我们澄清一下:

  

操作时:

docker exec -it 5bf6d45b4f79 echo "hello" > temp.txt
docker exec -it 5bf6d45b4f79 cat temp.txt
hello
     

您正在容器中执行echo "hello",但stdoutput存储在主机中。因此,在主机中看到temp.txt是正常的。

如果要将temp.txt保存在容器中,请尝试:

docker exec -it 5bf6d45b4f79 bash -c "echo 'hello' > temp.txt"

并且temp.txt将在您的容器工作目录上生成。

  

当您这样做:

     

但是在Mac命令行上的本地磁盘上

cat temp.txt hello Followed on my Mac command line by

echo "goodbye" >> temp.txt cat temp.txt hello goodbye 
     

然后在       容器

docker exec -it 5bf6d45b4f79 cat temp.txt hello goodbye
     

您正在共享temp.txt,也许是在主机和docker之间共享的docker volume中生成的

答案 1 :(得分:1)

docker exec -it 5bf6d45b4f79 echo "hello" > temp.txt

让您的容器打印hello,然后> temp.txt获取此输出并在您的主机上生成一个文件。

要使容器打印hello,然后在自身内部创建temp.txt,则必须使用:

docker container exec -it <your_container_name> sh -c 'echo "hello" > temp.txt'

解释:

sh -c在容器内创建一个新的shell并运行echo "hello" > temp.txt'。这意味着> temp.txt部分将由此Shell处理,因此文件将在容器内创建。

您尝试执行此操作的方式是主机的外壳,该外壳处理命令的> temp.txt部分,因此在主机上创建了文件。

答案 2 :(得分:0)

使用它来获取docker容器的终端并为主机打开一个单独的窗口。但这就是我的方法。
docker exec -it 5bf6d45b4f79 /bin/bash