options for `--volume` with a data volume include:
| Option | Description |
| ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `readonly`, `ro` | If present, causes the volume to be [mounted into the container as read-only](#use-a-read-only-volume). |
| `volume-nocopy` | If present, data at the destination isn't copied into the volume if the volume is empty. By default, content at the target destination gets copied into a mounted volume if empty. |
```console {title="Example"}
$ docker run -v myvolume:/data:ro
```
## Create and manage volumes
Unlike a bind mount, you can create and manage volumes outside the scope of any
container.
Create a volume:
```console
$ docker volume create my-vol
```
List volumes:
```console
$ docker volume ls
local my-vol
```
Inspect a volume:
```console
$ docker volume inspect my-vol
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
```
Remove a volume:
```console
$ docker volume rm my-vol
```
## Start a container with a volume
If you start a container with a volume that doesn't yet exist, Docker creates
the volume for you. The following example mounts the volume `myvol2` into
`/app/` in the container.
The following `-v` and `--mount` examples produce the same result. You can't
run them both unless you remove the `devtest` container and the `myvol2` volume
after running the first one.
{{< tabs >}}
{{< tab name="`--mount`" >}}
```console
$ docker run -d \
--name devtest \
--mount source=myvol2,target=/app \
nginx:latest
```
{{< /tab >}}
{{< tab name="`-v`" >}}
```console
$ docker run -d \
--name devtest \
-v myvol2:/app \
nginx:latest
```
{{< /tab >}}
{{< /tabs >}}
Use `docker inspect devtest` to verify that Docker created the volume and it mounted
correctly. Look for the `Mounts` section:
```json
"Mounts": [
{
"Type": "volume",
"Name": "myvol2",
"Source": "/var/lib/docker/volumes/myvol2/_data",
"Destination": "/app",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
```
This shows that the mount is a volume, it shows the correct source and
destination, and that the mount is read-write.
Stop the container and remove the volume. Note volume removal is a separate
step.
```console
$ docker container stop devtest
$ docker container rm devtest
$ docker volume rm myvol2
```
## Use a volume with Docker Compose
The following example shows a single Docker Compose service with a volume:
```yaml
services:
frontend:
image: node:lts
volumes:
- myapp:/home/node/app
volumes:
myapp:
```
Running `docker compose up` for the first time creates a volume. Docker reuses the same volume when you run the command subsequently.
You can create a volume directly outside of Compose using `docker volume create` and
then reference it inside `compose.yaml` as follows:
```yaml
services:
frontend:
image: node:lts
volumes:
- myapp:/home/node/app
volumes:
myapp:
external: true
```
For more information about using volumes with Compose, refer to the
[Volumes](/reference/compose-file/volumes.md)
section in the Compose specification.
### Start a service with volumes
When you start a service and define a volume, each service container uses its own
local volume. None of the containers can share this data if you use the `local`
volume driver. However, some volume drivers do support shared storage.
The following example starts an `nginx` service with four replicas, each of which