常见命令

1. 拉取镜像

docker pull <镜像名>:<标签>

常用参数

  • <镜像名>:要拉取的镜像名称。
  • <标签>:镜像的版本标签(如latest8.0等)。

示例

docker pull nginx:latest

2. 推送镜像

docker push <镜像名>:<标签>

常用参数

  • <镜像名>:要推送的镜像名称,通常为<Docker Hub用户名>/<镜像名>
  • <标签>:镜像的版本标签。

示例

docker push myrepo/myimage:1.0

docker push 和 docker pull

3. 查看本地镜像

docker images

常用参数

  • -q:只显示镜像的ID。
  • -a:显示所有镜像,包括中间层镜像。

示例

docker images -a

4. 删除镜像

docker rmi <镜像ID或名称>

常用参数

  • -f:强制删除正在使用的镜像。

示例

docker rmi nginx:latest

docker rmi

5. 构建镜像

docker build -t <镜像名>:<标签> <Dockerfile所在目录>

常用参数

  • -t:为构建的镜像命名并打标签。
  • --no-cache:不使用缓存,强制重新构建镜像。

示例

docker build -t myapp:1.0 .

docker build

6. 打包镜像

docker save -o <文件名.tar> <镜像名>:<标签>

常用参数

  • -o:指定保存的文件名。

示例

docker save -o myapp.tar myapp:1.0

docker save

7. 挂载打包的镜像

docker load -i <文件名.tar>

示例

docker load -i myapp.tar

docker load

8. 运行镜像

docker run -d -p <主机端口>:<容器端口> --name <容器名> <镜像名>:<标签> -v<数据卷>:<容器内目录>

常用参数

  • -d:后台运行容器。
  • -p:端口映射。
  • --name:为容器命名。
  • -v:挂载数据卷

示例

docker run -d -p 8080:80 --name mynginx nginx:latest -v /spark:/opt/spark

9. 停止容器

docker stop <容器ID或名称>

示例

docker stop mynginx

10. 启动容器

docker start <容器ID或名称>

示例

docker start mynginx

docker run 、 docker stop 和 docker start

11. 查看容器运行状态

docker ps

常用参数

  • -a:显示所有容器(包括未运行的)。
  • --format{}:格式化输出

示例

docker ps -a

12. 删除容器

docker rm <容器ID或名称>

常用参数

  • -f:强制删除正在运行的容器。

示例

docker rm mynginx

docker rm

13. 查看运行容器日志

docker logs <容器ID或名称>

常用参数

  • -f:实时输出日志。
  • --tail:显示日志的最后N行。

示例

docker logs -f mynginx

14. 进入容器内部

docker exec -it <容器ID或名称> /bin/bash

常用参数

  • -it:允许交互式终端进入容器。
  • /bin/bash:进入容器后使用的Shell。

示例

docker exec -it mynginx /bin/bash

数据卷

数据卷(Volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁,这种映射是双向的

数据卷(Volume)是 Docker 中一种持久化数据的机制,允许你将数据从容器内保存到宿主机的指定位置。通过数据卷,容器可以方便地共享、存储和管理数据。它主要解决了容器中的数据不会随着容器删除而丢失的问题。

数据卷的特点:

  1. 持久化存储:数据卷可以将容器内的数据存储到宿主机的文件系统中,确保容器删除后数据依然存在。
  2. 数据共享:多个容器可以共享同一个数据卷,实现跨容器的数据访问和同步。
  3. 独立于容器生命周期:数据卷的生命周期独立于容器,即使容器删除,数据卷上的数据仍然保留。
  4. 性能优化:数据卷可以避免数据复制带来的性能开销,直接与宿主机文件系统交互,速度更快。
  5. 备份和迁移方便:可以轻松将数据卷中的数据进行备份或迁移到其他主机。

数据卷只能在创建容器(docker run)的时候挂载,以及创建的容器无法再挂载数据卷

数据卷操作常见命令

1. 创建数据卷

docker volume create <卷名>

示例

docker volume create my_volume

这个命令会创建一个名为 my_volume 的数据卷。如果不提供卷名,Docker 会自动生成一个随机名称。

  • 常用参数
    • 没有额外的参数,使用默认设置创建卷。如果需要自定义驱动或其他选项,可以通过 --driver--opt 指定,但这是高级选项,通常不需要。
docker volume create --driver local --opt type=tmpfs --opt device=tmpfs my_tmpfs_volume
  • --driver:指定卷的驱动程序(如 local)。
  • --opt:提供额外的选项配置卷的类型和设备。
    • 常见参数:
      • type:指定文件系统类型,常见值包括 tmpfs(将数据存储在内存中,不持久化)、none(无文件系统类型,用于绑定宿主机目录)。
      • device:指定宿主机上的设备或路径,或在 tmpfs 的情况下,指定 tmpfs 本身。
      • o:挂载选项,用于设置卷的额外参数。常见值有:
        • size:限制 tmpfs 卷的最大内存使用大小(例如 size=100m 表示 100 MB)。
        • bind:用于绑定宿主机目录到容器。
        • ro:只读挂载,防止容器对数据卷进行写入。

2. 查看所有数据卷

docker volume ls

示例

docker volume ls
  • 常用参数

    • -q:只显示卷的名称,而不是完整的列表信息。

    示例

    docker volume ls -q
    

3. 删除指定数据卷

docker volume rm <卷名>

示例

docker volume rm my_volume
  • 常用参数

    • -f:强制删除卷,即使卷被某个容器使用时也能删除。

    示例

    docker volume rm -f my_volume
    

4. 查看某个数据卷的详情

docker volume inspect <卷名>

示例

docker volume inspect my_volume

这会返回指定数据卷的详细信息(JSON 格式),包括存储路径、驱动程序、挂载点等。

5. 清除未使用的数据卷

docker volume prune

示例

docker volume prune

此命令会清理所有未被使用的“悬空”数据卷。它会要求你确认清理,输入 y 后执行。

  • 常用参数

    • -f:跳过确认步骤,直接删除未使用的卷。

    示例

    docker volume prune -f
    

6. 查看容器元数据

docker inspect <容器名或容器ID>

docker inspect 命令用于查看容器的详细元数据信息,包括其配置、状态、网络设置、挂载卷等信息,输出为 JSON 格式。

示例

docker inspect my_container

这将返回容器 my_container 的所有元数据。

  • 常用参数

    • --format:自定义输出格式,用于筛选所需的信息。

    示例: 仅查看容器的 IP 地址:

    docker inspect --format='{{.NetworkSettings.IPAddress}}' my_container
    

    查看容器的状态信息:

    docker inspect --format='{{.State.Status}}' my_container
    
  • 在执行docker run命令时,使用 -V 数据卷:容器 内目录可以完成数据卷挂载
  • 当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷

本地目录挂载

这种挂载存在一些匿名卷

本地目录挂载(Bind Mount)是 Docker 中的一种机制,它允许你将宿主机的文件或目录挂载到容器内的指定路径。这使得容器可以直接访问和修改宿主机上的文件或目录,通常用于数据共享、持久化存储或使用宿主机上的配置文件。

本地目录挂载的特点:

  • 双向同步:容器和宿主机之间的数据是双向同步的,容器内对挂载目录的修改会直接反映在宿主机上,反之亦然。
  • 持久化:与 Docker 卷类似,挂载的目录可以实现数据持久化,但与 Docker 卷不同,绑定挂载完全由宿主机的文件系统管理。
  • 灵活性:允许你选择宿主机上的任何路径进行挂载,适合需要直接操作宿主机文件的场景。

使用 docker run 挂载本地目录

挂载的时候使用的是绝对路径

可以在创建容器时使用 --mount-v--volume)选项将宿主机的目录或文件挂载到容器内。

1. 使用 --mount

这是推荐的现代方式,语法清晰,适合复杂的挂载场景。

docker run -d --mount type=bind,source=<宿主机路径>,target=<容器路径> <镜像名>
  • type=bind:表示使用绑定挂载。
  • source=<宿主机路径>:宿主机上的目录或文件路径。
  • target=<容器路径>:容器内的挂载点路径。

示例: 将宿主机的 /home/user/data 目录挂载到容器的 /app/data 目录:

docker run -d --mount type=bind,source=/home/user/data,target=/app/data nginx

2. 使用 -v

这是早期的方式,仍然广泛使用,但在处理更复杂的挂载场景时可读性不如 --mount 高。

docker run -d -v <宿主机路径>:<容器路径> <镜像名>

示例: 将宿主机的 /home/user/data 目录挂载到容器的 /app/data 目录:

docker run -d -v /home/user/data:/app/data nginx

挂载本地目录的常见参数

  1. 只读挂载:你可以使用 readonly 参数将宿主机的目录以只读模式挂载到容器,防止容器对目录进行写操作。

    示例

    docker run -d --mount type=bind,source=/home/user/config,target=/app/config,readonly nginx
    
  2. 挂载文件而非目录:你也可以挂载单个文件,而不仅仅是目录。

    示例

    docker run -d --mount type=bind,source=/home/user/config/app.conf,target=/etc/app.conf nginx
    
  3. 临时文件系统(tmpfs)挂载:除了绑定宿主机目录,你还可以使用 tmpfs 将临时文件系统挂载到容器内,所有数据都会保存在内存中。

    示例

    docker run -d --mount type=tmpfs,target=/app/tmp nginx
    

查看挂载的卷和目录

你可以使用 docker inspect 查看容器的详细信息,包括哪些目录被挂载:

docker inspect <容器ID或容器名>

这将返回 JSON 格式的输出,其中包含卷和挂载信息。

匿名卷

在 Docker 中,绑定挂载(Bind Mount)有时会涉及匿名卷的概念,尤其是当你使用 docker run 命令时,默认情况下 Docker 会为某些情况创建匿名卷,这些匿名卷可能会引起混淆。让我们来解释一下匿名卷的情况以及如何避免它们。

匿名卷的产生

匿名卷是在容器启动时,由 Docker 自动创建的未命名的卷。它们通常用于保存容器的持久化数据,但因为没有明确的名称,所以这些卷不易管理和跟踪。

什么时候会创建匿名卷?

匿名卷通常在以下情况下自动创建:

  1. 没有明确指定挂载目标:当 Docker 容器的某个路径(例如 /var/lib/mysql)需要持久化存储时,如果没有为该路径明确指定挂载卷,Docker 会自动创建一个匿名卷。

    示例

    docker run -d mysql:latest
    

    在这个例子中,MySQL 容器会在 /var/lib/mysql 保存数据库数据。因为没有明确为这个路径指定卷,Docker 会自动创建一个匿名卷并将其挂载到容器的 /var/lib/mysql

  2. 使用 VOLUME 指令的镜像:如果镜像的 Dockerfile 中包含了 VOLUME 指令,并且你没有明确指定挂载路径,Docker 也会为这个路径创建匿名卷。

    示例: 在使用 VOLUME /data 指令构建的镜像时,如果你不手动指定挂载卷,Docker 将为 /data 创建一个匿名卷。

如何避免匿名卷

为了避免 Docker 自动创建匿名卷,你可以明确指定数据卷或绑定挂载。这使你能更好地管理卷,避免不必要的匿名卷占用磁盘空间。

1. 使用命名卷

命名卷可以通过 Docker 命令明确指定,并且可以轻松管理和追踪。

示例

docker run -d -v my_named_volume:/var/lib/mysql mysql:latest

在这个例子中,my_named_volume 是我们手动创建的卷,它将挂载到容器的 /var/lib/mysql 目录。这样可以避免 Docker 创建匿名卷。

2. 使用绑定挂载(Bind Mount)

通过绑定宿主机上的目录到容器中的路径,确保你完全控制数据的存储位置。

示例

docker run -d --mount type=bind,source=/home/user/mysql-data,target=/var/lib/mysql mysql:latest

在这个例子中,宿主机上的 /home/user/mysql-data 目录被挂载到容器的 /var/lib/mysql,确保了数据直接存储在宿主机指定的目录中,而不会创建匿名卷。

如何管理匿名卷

如果系统中已经产生了匿名卷,你可以通过以下步骤来查看和清理它们:

1. 查看匿名卷

使用 docker volume ls 可以列出所有卷,包括匿名卷。匿名卷通常没有名称,Docker 会生成一个随机的 ID 作为名称。

docker volume ls

输出示例:

DRIVER    VOLUME NAME
local     my_named_volume
local     1d9ae6879ec2d4d39172a8bb8a0a2b16f291d6eae1a2fdce93613fd74c446f9f  # 匿名卷

2. 删除匿名卷

你可以通过 docker volume prune 删除所有未使用的卷,包括匿名卷:

docker volume prune

Docker 会提示你确认删除所有未使用的卷,输入 y 以继续。

如果你想手动删除某个特定的匿名卷,可以使用 docker volume rm <卷ID> 命令删除它:

docker volume rm 1d9ae6879ec2d4d39172a8bb8a0a2b16f291d6eae1a2fdce93613fd74c446f9f