mirror of https://github.com/docker/docs.git
storage: added block storage mount example
Signed-off-by: David Karlsson <david.karlsson@docker.com>
This commit is contained in:
parent
0de7f57f79
commit
ad077fb8e9
|
@ -91,7 +91,8 @@ If you need to specify volume driver options, you must use `--mount`.
|
||||||
> --mount 'type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH>,volume-driver=local,volume-opt=type=nfs,volume-opt=device=<nfs-server>:<nfs-path>,"volume-opt=o=addr=<nfs-address>,vers=4,soft,timeo=180,bg,tcp,rw"'
|
> --mount 'type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH>,volume-driver=local,volume-opt=type=nfs,volume-opt=device=<nfs-server>:<nfs-path>,"volume-opt=o=addr=<nfs-address>,vers=4,soft,timeo=180,bg,tcp,rw"'
|
||||||
> --name myservice \
|
> --name myservice \
|
||||||
> <IMAGE>
|
> <IMAGE>
|
||||||
{: .warning}
|
>
|
||||||
|
> {: .warning}
|
||||||
|
|
||||||
The examples below show both the `--mount` and `-v` syntax where possible, and
|
The examples below show both the `--mount` and `-v` syntax where possible, and
|
||||||
`--mount` is presented first.
|
`--mount` is presented first.
|
||||||
|
@ -520,6 +521,100 @@ $ docker volume create \
|
||||||
The `addr` option is required if you specify a hostname instead of an IP.
|
The `addr` option is required if you specify a hostname instead of an IP.
|
||||||
This lets Docker perform the hostname lookup.
|
This lets Docker perform the hostname lookup.
|
||||||
|
|
||||||
|
### Block storage devices
|
||||||
|
|
||||||
|
You can mount a block storage device, such as an external drive or a drive partition, to a container.
|
||||||
|
The following example shows how to create and use a file as a block storage device,
|
||||||
|
and how to mount the block device as a container volume.
|
||||||
|
|
||||||
|
> **Important**
|
||||||
|
>
|
||||||
|
> The following procedure is only an example.
|
||||||
|
> The solution illustrated here isn't recommended as a general practice.
|
||||||
|
> Don't attempt this approach unless you're very confident about what you're doing.
|
||||||
|
{: .important }
|
||||||
|
|
||||||
|
#### How mounting block devices works
|
||||||
|
|
||||||
|
Under the hood, the `--mount` flag using the `local` storage driver invokes the
|
||||||
|
Linux `mount` syscall and forwards the options you pass to it unaltered.
|
||||||
|
Docker doesn't implement any additional functionality on top of the native mount features supported by the Linux kernel.
|
||||||
|
|
||||||
|
If you're familiar with the
|
||||||
|
[Linux `mount` command](https://man7.org/linux/man-pages/man8/mount.8.html),
|
||||||
|
you can think of the `--mount` options as being forwarded to the `mount` command in the following manner:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ mount -t <mount.volume-opt.type> <mount.volume-opt.device> <mount.dst> -o <mount.volume-opts.o>
|
||||||
|
```
|
||||||
|
|
||||||
|
To illustrate this further, consider the following `mount` command example.
|
||||||
|
This command mounts the `/dev/loop5` device to the path `/external-drive` on the system.
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ mount -t ext4 /dev/loop5 /external-drive
|
||||||
|
```
|
||||||
|
|
||||||
|
The following `docker run` command achieves a similar result, from the point of view of the container being run.
|
||||||
|
Running a container with this `--mount` option sets up the mount in the same way as if you had executed the
|
||||||
|
`mount` command from the previous example.
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ docker run \
|
||||||
|
--mount='type=volume,dst=/external-drive,volume-driver=local,volume-opt=device=/dev/loop5,volume-opt=type=ext4'
|
||||||
|
```
|
||||||
|
|
||||||
|
You can't execute the `mount` command inside the container directly,
|
||||||
|
because the container is unable to access the `/dev/loop5` device.
|
||||||
|
That's why we're using the `--mount` option for the `docker run` command instead.
|
||||||
|
|
||||||
|
#### Example: Mounting a block device in a container
|
||||||
|
|
||||||
|
The following steps create an `ext4` filesystem and mounts it into a container.
|
||||||
|
The filesystem support of your system depends on the version of the Linux kernel you are using.
|
||||||
|
|
||||||
|
1. Create a file and allocate some space to it:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ fallocate -f 1G disk.raw
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Build a filesystem onto the `disk.raw` file:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ mkfs.ext4 disk.raw
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Create a loop device:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ losetup -f --show disk.raw
|
||||||
|
/dev/loop5
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> `losetup` creates an ephemeral loop device that's removed after
|
||||||
|
> system reboot, or manually removed with `losetup -d`.
|
||||||
|
|
||||||
|
4. Run a container that mounts the loop device as a volume:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ docker run -it --rm \
|
||||||
|
--mount='type=volume,dst=/external-drive,volume-driver=local,volume-opt=device=/dev/loop5,volume-opt=type=ext4' \
|
||||||
|
ubuntu bash
|
||||||
|
```
|
||||||
|
|
||||||
|
When the container starts, the path `/external-drive` mounts the
|
||||||
|
`disk.raw` file from the host filesystem as a block device.
|
||||||
|
|
||||||
|
5. When you're done, and the device is unmounted from the container,
|
||||||
|
detach the loop device to remove the device from the host system:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ losetup -d /dev/loop5
|
||||||
|
```
|
||||||
|
|
||||||
## Back up, restore, or migrate data volumes
|
## Back up, restore, or migrate data volumes
|
||||||
|
|
||||||
Volumes are useful for backups, restores, and migrations.
|
Volumes are useful for backups, restores, and migrations.
|
||||||
|
|
Loading…
Reference in New Issue