# rm

<!---MARKER_GEN_START-->
Remove one or more containers

### Aliases

`docker container rm`, `docker container remove`, `docker rm`

### Options

| Name                                      | Type   | Default | Description                                             |
|:------------------------------------------|:-------|:--------|:--------------------------------------------------------|
| [`-f`](#force), [`--force`](#force)       | `bool` |         | Force the removal of a running container (uses SIGKILL) |
| [`-l`](#link), [`--link`](#link)          | `bool` |         | Remove the specified link                               |
| [`-v`](#volumes), [`--volumes`](#volumes) | `bool` |         | Remove anonymous volumes associated with the container  |


<!---MARKER_GEN_END-->

## Examples

### Remove a container

This removes the container referenced under the link `/redis`.

```console
$ docker rm /redis

/redis
```

### <a name="link"></a> Remove a link specified with `--link` on the default bridge network (--link)

This removes the underlying link between `/webapp` and the `/redis`
containers on the default bridge network, removing all network communication
between the two containers. This does not apply when `--link` is used with
user-specified networks.

```console
$ docker rm --link /webapp/redis

/webapp/redis
```

### <a name="force"></a> Force-remove a running container (--force)

This command force-removes a running container.

```console
$ docker rm --force redis

redis
```

The main process inside the container referenced under the link `redis` will receive
`SIGKILL`, then the container will be removed.

### Remove all stopped containers

Use the [`docker container prune`](container_prune.md) command to remove all
stopped containers, or refer to the [`docker system prune`](system_prune.md)
command to remove unused containers in addition to other Docker resources, such
as (unused) images and networks.

Alternatively, you can use the `docker ps` with the `-q` / `--quiet` option to
generate a list of container IDs to remove, and use that list as argument for
the `docker rm` command.

Combining commands can be more flexible, but is less portable as it depends
on features provided by the shell, and the exact syntax may differ depending on
what shell is used. To use this approach on Windows, consider using PowerShell
or Bash.

The example below uses `docker ps -q` to print the IDs of all containers that
have exited (`--filter status=exited`), and removes those containers with
the `docker rm` command:

```console
$ docker rm $(docker ps --filter status=exited -q)
```

Or, using the `xargs` Linux utility:

```console
$ docker ps --filter status=exited -q | xargs docker rm
```

### <a name="volumes"></a> Remove a container and its volumes (-v, --volumes)

```console
$ docker rm --volumes redis
redis
```

This command removes the container and any volumes associated with it.
Note that if a volume was specified with a name, it will not be removed.

### Remove a container and selectively remove volumes

```console
$ docker create -v awesome:/foo -v /bar --name hello redis
hello

$ docker rm -v hello
```

In this example, the volume for `/foo` remains intact, but the volume for
`/bar` is removed. The same behavior holds for volumes inherited with
`--volumes-from`.
