Как получить доступ к файлам вне контейнера Docker

Если контейнеры изолированы, как они могут связываться с хост-машиной, например, для хранения данных? Потому что, когда мы создаем контейнер из изображения, любые сгенерированные данные теряются при удалении контейнера.

Итак, нам нужен способ иметь постоянное хранилище.

Мы можем сделать это, используяПривязать скакуновиОбъемы.

Между ними нет большой разницы, за исключением того, что Bind Mounts может указывать на любую папку на главном компьютере и не управляется Docker напрямую.

Начнем с них. Классический пример - бревна. Предположим, ваше приложение создает файл журнала внутри контейнера в/usr/src/app/logs. Вы можете сопоставить это с папкой на главном компьютере, используя-v(такой же как--volume), когда вы запускаете контейнер сdocker run, так:-v ~/logs:/usr/src/app/logs

Это сопоставит эту папку с подпапкой журналов в домашнем каталоге пользователя.

Узел:-mили же--mountфлаг работает очень похоже

Это флаг, используемый сexamplenodeизображение, которое мы создали ранее:

docker run -d -p 80:3000 -v ~/logs:/usr/src/app/logs --name node-app examplenode

Итак, теперь мы можем запустить наше приложение Node, и любой журнал будет храниться на главном компьютере, а не внутри контейнера Docker.

Обратите внимание, чтоexamplenodeприложение не генерирует логин/usr/src/app/logs, это всего лишь пример, и вам нужно сначала настроить эту регистрацию.

Подробная информация о томе будет указана при запуске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.

Now, let’s talk about 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.

For example, Docker lets you remove all unused volumes by running docker volume prune or docker system prune --volumes.

To create a volume, we first need to run 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:

Now run docker run with the option -v logs:/usr/src/app/logs (tell the volume name instead of a folder)

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:

"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.

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 <name>.


More docker tutorials: