If containers are isolated, how can they communicate to the host machine, perhaps to store data? Because when we create a container from an image, any data generated is lost when the container is removed.
如果容器是隔离的,它们如何与主机通信,也许可以存储数据? 因为当我们从图像创建容器时,删除容器后生成的所有数据都会丢失。
So we need a way to have permanent storage.
因此,我们需要一种永久存储的方法。
We can do so using Bind Mounts and Volumes.
我们可以使用Bind Mounts and Volumes来做到这一点。
There’s not a lot of difference between the two, except Bind Mounts can point to any folder on the host computer, and are not managed by Docker directly.
两者之间没有太大区别,除了Bind Mounts可以指向主机上的任何文件夹,并且不直接由Docker管理。
Let’s start with them. One classic example is logs. Suppose your app creates a log file, inside the container, in /usr/src/app/logs
. You can map that to a folder on the host machine, using the -v
(same as --volume
) flag when you run the container with docker run
, like this: -v ~/logs:/usr/src/app/logs
让我们从他们开始。 一个经典的例子是日志。 假设您的应用在/usr/src/app/logs
的容器内创建了一个日志文件。 您可以映射到主机上的文件夹,使用-v
(同--volume
当你运行容器)标志docker run
:像这样-v ~/logs:/usr/src/app/logs
This will map that folder to the logs subfolder in the user’s home directory.
这会将该文件夹映射到用户主目录中的logs子文件夹。
Node: the
-m
or--mount
flag works in a very similar way节点:
-m
或--mount
标志的工作方式非常相似
This is the flag used with the examplenode
image we created previously:
这是我们先前创建的examplenode
图像使用的标志:
docker run -d -p 80:3000 -v ~/logs:/usr/src/app/logs --name node-app examplenode
So now we can run our Node app, and any log will be stored in the host computer, rather than inside the Docker container.
因此,现在我们可以运行Node应用程序,所有日志都将存储在主机中,而不是Docker容器中。
Note that the
examplenode
app does not generate any log in/usr/src/app/logs
, it’s just an example and you would need to set that logging up first.请注意,
examplenode
应用程序不会在/usr/src/app/logs
生成任何日志,这只是一个示例,您需要首先设置该日志记录。
The details about the volume will be listed when you run docker inspect
on the container name, under “Mounts”:
当您对容器名称运行docker inspect
,将在“挂载”下列出有关卷的详细信息:
"Mounts": [
{
"Type": "bind",
"Source": "/Users/flavio/logs",
"Destination": "/usr/src/app/logs",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
Can you see "Type": "bind"
? That means that we have created a bind mount.
您可以看到"Type": "bind"
吗? 这意味着我们已经创建了一个绑定安装 。
Now, let’s talk about Volumes.
现在,让我们谈谈Volumes 。
The difference between Bind Mounts and Volumes is that by creating volumes, Docker will store the data in a folder it manages, which means it will take care of file permissions and ownership, and it will give you the tools to manage those volumes. While bind mounts are based on filesystem paths, and Docker can’t provide the tooling around them.
Bind Mounts和Volumes之间的区别在于,通过创建卷,Docker会将数据存储在它管理的文件夹中,这意味着它将处理文件权限和所有权,并为您提供管理这些卷的工具。 尽管绑定挂载基于文件系统路径,但Docker无法提供围绕它们的工具。
For example, Docker lets you remove all unused volumes by running docker volume prune
or docker system prune --volumes
.
例如,Docker可让您通过运行docker system prune --volumes
docker volume prune
或docker system prune --volumes
删除所有未使用的卷。
To create a volume, we first need to run docker volume create
:
要创建一个卷,我们首先需要运行docker volume create
:
docker volume create logs
Now you can use docker volume ls
and docker volume inspect
to get more data about the system volumes:
现在,您可以使用docker volume ls
和docker volume inspect
来获取有关系统卷的更多数据:
Now run docker run
with the option -v logs:/usr/src/app/logs
(tell the volume name instead of a folder)
现在使用-v logs:/usr/src/app/logs
选项运行docker run
(告诉卷名而不是文件夹)
docker run -d -p 80:3000 -v logs:/usr/src/app/logs --name node-app examplenode
Now running docker inspect
on the image will show the mounted volume:
现在在图像上运行docker inspect
将显示已安装的卷:
"Mounts": [
{
"Type": "volume",
"Name": "logs",
"Source": "/var/lib/docker/volumes/logs/_data",
"Destination": "/usr/src/app/logs",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
See? Now the logs will be stored in the /var/lib/docker/volumes/logs/_data
folder.
看到? 现在,日志将存储在/var/lib/docker/volumes/logs/_data
文件夹中。
Volumes will be essential when it will be time to deploy a container on a cloud service, for example.
例如,当需要在云服务上部署容器时,卷将至关重要。
You can remove a volume running docker volume rm
.
您可以删除运行docker volume rm
。
翻译自: https://flaviocopes.com/docker-access-files-outside-container/