Docker 常用命令
下面是 Docker 和 Docker Compose 命令概览,包括容器、镜像、网络、卷、清理以及 Docker Compose 相关命令。
镜像管理
好的,我将为您提供一个完整的关于如何使用 docker build
命令来构建 Docker 镜像的介绍,包括它的作用、常用参数及示例:
构建镜像
命令格式:
docker build [OPTIONS] PATH | URL | -
作用:
docker build
命令用于根据 Dockerfile 的指令创建 Docker 镜像。这个过程包括读取 Dockerfile 中的指令,然后按顺序执行这些指令来构建最终的镜像。每一个指令都可能创建一个新的层,这些层一起组成了整个镜像。
常用参数:
-t, --tag
:- 作用: 为构建的镜像指定一个名字和标签,通常的格式为
name:tag
。 - 示例:
docker build -t my-image:1.0 .
- 作用: 为构建的镜像指定一个名字和标签,通常的格式为
--file, -f
:- 作用: 指定一个不在默认位置的 Dockerfile。
- 示例:
docker build -f /path/to/a/Dockerfile .
--build-arg
:- 作用: 允许你传递构建时的变量,这些变量在 Dockerfile 中可以被使用。
- 示例:
docker build --build-arg API_KEY=12345 -t my-image .
--no-cache
:- 作用: 构建镜像时不使用任何缓存,这保证了所有的层都是新构建的。
- 示例:
docker build --no-cache -t my-image .
--rm
:- 作用: 在镜像构建完成后自动删除中间产生的容器。这在大多数情况下会自动开启。
- 示例:
docker build --rm -t my-image .
--pull
:- 作用: 在构建之前尝试拉取更新的基础镜像。
- 示例:
docker build --pull -t my-image .
--quiet, -q
:- 作用: 构建过程中只显示必要信息,减少输出的干扰。
- 示例:
docker build -q -t my-image .
.
- 在 Docker 中,
.
表示当前目录。 .
是构建上下文的路径。构建上下文是指 Docker 构建镜像时所需要的文件和文件夹。.
表示当前目录是构建上下文的路径,这意味着 Docker 将在当前目录中查找 Dockerfile 和所有构建上下文所需的文件。
- 在 Docker 中,
实战指南:
- 构建一个简单的 web 服务器镜像:shell
# 假设当前目录有一个 Dockerfile docker build -t my-webserver:latest .
- 构建一个指定镜像版本的镜像:shell
# 假设当前目录有一个 Dockerfile docker build -t my-webserver:1.1.0 .
- 使用自定义 Dockerfile 构建:shell
docker build -f /path/to/custom/Dockerfile -t custom-image:latest .
搜索镜像:
docker search [IMAGE_NAME]
- 作用: 在 Docker Hub 中搜索具有特定名称的镜像。这个命令非常有用,因为它可以帮助你快速找到需要的镜像,了解不同版本以及它们的受欢迎程度(通过星标数)。
- 实战指南:
- 搜索官方的 Nginx 镜像:
docker search nginx
。这将列出所有与 Nginx 相关的镜像,你可以选择合适的版本进行拉取。
- 搜索官方的 Nginx 镜像:
拉取镜像:
docker pull [IMAGE_NAME]
- 作用: 从远程仓库(默认是 Docker Hub)拉取指定名称的镜像到本地。如果不指定标签(tag),默认会拉取
latest
标签的镜像。 - 实战指南:
- 拉取最新版本的 Ubuntu 镜像:
docker pull ubuntu:latest
。这个命令会从 Docker Hub 下载最新版的 Ubuntu 镜像到本地仓库。
- 拉取最新版本的 Ubuntu 镜像:
查看本地镜像:
docker images
- 作用: 列出本地所有已下载的 Docker 镜像。它显示的信息包括镜像的仓库名、标签、镜像 ID、创建时间和大小等。
- 实战指南:
- 定期查看本地镜像可以帮助你管理本地的镜像存储,了解哪些镜像可用以及它们占用的空间。
删除镜像:
docker rmi [IMAGE_ID/NAME]
- 作用: 删除本地存储的一个或多个 Docker 镜像。如果有容器正在使用该镜像,则需要先删除那些容器,或者使用
-f
参数强制删除。 - 实战指南:
- 在镜像不再需要时,比如版本过时或者测试结束后,应及时删除这些镜像以释放磁盘空间。例如,删除本地的旧版 Ubuntu 镜像:
docker rmi ubuntu:18.04
。
- 在镜像不再需要时,比如版本过时或者测试结束后,应及时删除这些镜像以释放磁盘空间。例如,删除本地的旧版 Ubuntu 镜像:
如何把容器的文件拷贝出来
要从 Docker 容器中拷贝文件到宿主机,你可以使用 docker cp
命令。这个命令的基本语法是:
docker cp [container_id]:[container_path] [host_path]
这里是具体的步骤和参数说明:
- [container_id]:这是你想要从中拷贝文件的容器的 ID 或名称。
- [container_path]:这是容器内的文件或目录的路径,你想要从中拷贝数据。
- [host_path]:这是宿主机上的目标路径,你想要将文件或目录拷贝到这里。
示例
假设你想要从名为 mycontainer
的容器中拷贝一个名为 /etc/config.txt
的文件到宿主机的当前目录中,你可以使用以下命令:
docker cp mycontainer:/etc/config.txt .
这条命令会将 mycontainer
容器中的 /etc/config.txt
文件拷贝到宿主机的当前工作目录中。
如果你想要从容器中拷贝整个目录,只需要指定目录的路径即可。例如,将容器中的 /var/log
目录拷贝到宿主机的 /home/user/logs
目录:
docker cp mycontainer:/var/log /home/user/logs
这样,容器内的 /var/log
目录及其内容就会被拷贝到宿主机的指定路径中。
容器管理
运行容器:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
- 作用: 从指定的镜像启动一个新的容器实例。这是 Docker 中最常用的命令之一,它允许用户从一个镜像中创建并启动一个或多个容器。
- 选项示例:
-d
: 后台运行容器,并返回容器 ID,是--detach
的简写。-p 8080:80
: 端口映射,将宿主机的 8080 端口映射到容器的 80 端口。--name webserver
: 为容器指定一个名称,此处命名为webserver
。
- 实战指南:
- 要运行一个 Nginx web 服务器:
docker run -d -p 8080:80 --name webserver nginx
- 此命令将启动一个 Nginx 服务器,你可以通过访问宿主机的 8080 端口来访问 Nginx。
- 要运行一个 Nginx web 服务器:
列出运行中的容器:
docker ps
- 作用: 显示所有当前运行中的容器实例的简要信息,包括容器 ID、创建时间、使用的镜像等。
- 实战指南:
- 通过
docker ps
快速了解系统中哪些容器正在运行,以及它们的状态和端口映射情况。
- 通过
列出所有容器:
docker ps -a
- 作用: 列出系统中所有的容器,包括运行中的和已停止的。
- 实战指南:
- 当需要了解所有容器的运行历史或查找已停止容器的 ID 以进行进一步操作时使用此命令。
停止容器:
docker stop [CONTAINER_ID/NAME]
- 作用: 优雅地停止一个运行中的容器。Docker 会向容器发送 SIGTERM 信号,请求容器停止,容器应当捕捉此信号进行适当的清理操作后退出。
- 实战指南:
- 如果容器内部的应用需要在停止前保存状态或进行清理工作,优先使用
docker stop
而不是强制终止。
- 如果容器内部的应用需要在停止前保存状态或进行清理工作,优先使用
启动已停止的容器:
docker start [CONTAINER_ID/NAME]
- 作用: 启动一个之前已经创建并停止的容器。
- 实战指南:
- 对于临时性停止的服务容器,如数据库或开发环境,使用
docker start
来恢复服务无需重新配置。
- 对于临时性停止的服务容器,如数据库或开发环境,使用
重启容器:
docker restart [CONTAINER_ID/NAME]
- 作用: 重启一个或多个容器,这对于需要重新加载配置或恢复服务的快速方法很有用。
- 实战指南:
- 当修改了容器配置文件或环境变量后,可以使用此命令快速应用更改。
删除容器:
docker rm [CONTAINER_ID/NAME]
- 作用: 删除一个或多个已停止的容器。如果容器正在运行,需要先停止它(
docker stop
)或使用-f
选项强制删除。 - 实战指南:
- 清理不再需要的容器以释放系统资源。在开发过程中,可能会频繁创建和销毁容器,定期清理是一个好习惯。
查看容器日志:
docker logs [CONTAINER_ID/NAME]
- 作用: 获取容器的日志输出。对于调试容器应
用或监控容器内部发生的事件非常有用。
- 实战指南:
- 当应用出现异常时,首先查看容器日志以快速定位问题。
在运行的容器中执行命令:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
作用: 在已运行的容器内执行指定命令。这使得用户可以进入容器内部进行操作,如安装软件、修改配置文件或进行故障诊断。
实战指南:
- 进入一个正在运行的容器以进行交互式操作:
docker exec -it [container_id] /bin/bash
docker exec
: 这个命令用于在运行中的 Docker 容器内执行一个新的命令。-it
: 这个参数组合有两部分。-i
代表“交互式”,让容器的标准输入保持开启。-t
代表分配一个伪终端,这通常用来使得执行的命令有一个用于输入的终端。[container_id]
: 这部分应该被替换成你想要在其中执行命令的容器的 ID 或者名称。/bin/bash
: 这是你想在容器中执行的命令,这里是启动 bash shell。- 这个命令的意思是在指定的 Docker 容器中开启一个交互式 bash 终端。
- 这使得你可以在容器的环境中手动执行更多命令,就像在一个常规的 Linux 终端中操作一样。
- 进入一个正在运行的容器以进行交互式操作:
暂停容器:
docker pause [CONTAINER]
- 作用: 暂停一个或多个容器中的所有进程。这通过发送 SIGSTOP 信号实现,是一种临时挂起容器的方法。
- 实战指南:
- 当需要临时释放资源给其他更重要的容器或进程时,可以暂停不重要的容器而不是完全停止它们。
恢复容器:
docker unpause [CONTAINER]
- 作用: 恢复被暂停的容器中的所有进程。这通过发送 SIGCONT 信号实现。
- 实战指南:
- 当资源需求降低或暂停的容器需要恢复服务时,使用
docker unpause
快速恢复容器运行。
- 当资源需求降低或暂停的容器需要恢复服务时,使用
当然,让我帮你深入理解这些关于镜像管理的命令,并提供更实际的注释。
网络管理
网络管理是 Docker 的一个核心组成部分。
列出网络:
docker network ls
- 作用: 列出 Docker 主机上的所有网络。Docker 支持不同类型的网络,如 bridge、host 和 none 等,默认情况下会创建一个 bridge 网络。
- 实战指南:
- 常规检查网络配置或调试网络问题时,可以先列出所有网络,了解 Docker 主机的网络环境。
检查网络:
docker network inspect [NETWORK]
- 作用: 显示一个或多个 Docker 网络的详细信息。这些信息包括网络的类型、所连接的容器、IP 分配等,是理解网络配置和排查网络问题的重要工具。
- 实战指南:
- 当需要详细了解某个特定网络的配置或者调试与该网络相关的问题时,使用此命令进行检查。例如,
docker network inspect bridge
可以查看默认 bridge 网络的详细信息。
- 当需要详细了解某个特定网络的配置或者调试与该网络相关的问题时,使用此命令进行检查。例如,
创建网络:
docker network create [OPTIONS] [NAME]
- 作用: 创建一个新的 Docker 网络。你可以指定网络的类型(如 bridge、overlay 等),也可以配置网络的参数(如子网、网关等)。
- 实战指南:
- 在需要隔离容器通信或跨主机容器通信时,创建自定义网络非常有用。例如,创建一个带有特定子网的 bridge 网络:
docker network create --driver bridge --subnet 192.168.1.0/24 custom-bridge
。
- 在需要隔离容器通信或跨主机容器通信时,创建自定义网络非常有用。例如,创建一个带有特定子网的 bridge 网络:
连接容器到网络:
docker network connect [NETWORK] [CONTAINER]
- 作用: 将一个已经运行的容器连接到一个网络。这允许你动态地改变容器的网络配置,无需重启容器。
- 实战指南:
- 当你需要将一个容器添加到额外的网络以实现网络层的通信或隔离时,可以使用此命令。例如,将一个数据库容器连接到后端网络以提高安全性。
断开容器与网络的连接:
docker network disconnect [NETWORK] [CONTAINER]
- 作用: 将一个容器从一个网络中断开。这对于清理网络配置或重新组织容器的网络连接非常有用。
- 实战指南:
- 如果一个容器不再需要连接到某个特定的网络,或者你需要将容器移动到另一个网络,使用此命令断开它们的连接。例如,断开容器与一个临时测试网络的连接,以便它只通过默认 bridge 网络通信。
卷管理
Docker 卷是持久化容器数据的重要工具。
创建卷:
docker volume create [NAME]
- 作用: 创建一个新的卷,用于数据持久化或在多个容器间共享数据。Docker 卷存储在宿主机上,独立于容器的生命周期,即使容器被删除,卷中的数据也不会丢失。
- 实战指南:
- 当你准备启动一个数据库容器并希望数据库文件持久化时,首先创建一个卷:
docker volume create dbdata
。然后在运行容器时,将这个卷挂载到容器的数据目录。
- 当你准备启动一个数据库容器并希望数据库文件持久化时,首先创建一个卷:
列出卷:
docker volume ls
- 作用: 显示所有在 Docker 主机上创建的卷。这个命令允许你快速查看哪些卷是可用的,以及识别未再使用的卷。
- 实战指南:
- 定期运行此命令可以帮助管理存储资源,特别是在删除不再需要的容器后,相关的卷可能需要手动清理。
删除卷:
docker volume rm [VOLUME_NAME]
- 作用: 删除指定的一个或多个卷。如果卷正被某个容器使用,则无法删除,除非使用强制删除选项。
- 实战指南:
- 清理未使用的卷以释放空间:首先确认卷不再被任何容器使用,然后删除它。例如,
docker volume rm dbdata
删除数据库数据卷。在执行删除操作之前,确保备份了重要数据。
- 清理未使用的卷以释放空间:首先确认卷不再被任何容器使用,然后删除它。例如,
清理资源
对于日常的 Docker 使用,可能会产生大量的未使用或临时的容器、镜像、卷和网络。Docker 提供了方便的命令来清理这些资源,帮助维护 Docker 环境的整洁。
删除所有为none
的镜像
在 PowerShell 中
删除 Docker 中标记为 <none>
的镜像,你可以使用以下命令:
docker images | Select-String none | ForEach-Object { docker rmi ($_.ToString() -split '\s+')[2] }
这个命令的步骤是:
docker images
- 列出所有的 Docker 镜像。Select-String none
- 选择包含字符串 "none" 的行,即没有标签的镜像。ForEach-Object { docker rmi ($_.ToString() -split '\s+')[2] }
- 对于每个选择的行,使用空格分隔并选择第三个部分,即镜像的 ID,然后运行docker rmi
命令删除这些镜像。
这应该可以删除所有标记为 <none>
的镜像。确保在 PowerShell 中运行 Docker 命令之前,你已经登录到 Docker,并且有权限执行这些操作。
删除所有停止的容器:
docker container prune
官方文档:https://docs.docker.com/reference/cli/docker/container/prune/
这个命令会移除所有处于停止状态的容器,帮助释放占用的资源。
删除未使用的镜像:
docker image prune
官方文档:https://docs.docker.com/reference/cli/docker/image/prune/
删除所有悬挂的镜像(即没有标签的镜像)。如果你想要删除所有未被容器使用的镜像(不仅仅是悬挂的镜像),可以使用 -a 或 --all 选项。
删除未使用的网络:
docker network prune
官方文档:https://docs.docker.com/reference/cli/docker/network/prune/
移除所有未被容器使用的网络。
删除未使用的卷:
docker volume prune
官方文档:https://docs.docker.com/reference/cli/docker/volume/prune/
这个命令会删除所有未被容器引用的卷,这对于清理临时或遗留的数据卷非常有效。
一键清理未使用的容器、网络、镜像(非悬挂)、卷:
docker system prune
官方文档:https://docs.docker.com/reference/cli/docker/system/prune/
这个命令将清除所有未使用的容器、网络、悬挂的镜像(默认不清理卷)。如果你想要在清理过程中包括卷,可以添加 -a 和 --volumes 选项。
使用这些清理命令可以帮助你维护 Docker 环境的清洁,避免不必要的资源占用。在执行清理操作时,请确保你不会误删重要数据,特别是当使用 docker system prune 或带有 -a 选项的命令时。
Docker Compose 命令
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 文件来配置应用服务,然后只需一个简单的命令,就可以创建并启动所有服务。
构建服务并后台运行:
docker compose up --build -d
这个命令会先构建服务的镜像(如果 docker-compose.yml 文件中的服务定义了构建上下文),然后在后台运行服务。
--build 选项确保了即使之前构建过镜像,也会重新构建镜像,这对于确保使用的是最新代码和依赖非常有用。
-d 选项表示在后台运行容器。
官方文档: https://docs.docker.com/reference/cli/docker/compose/up/
作用: 先构建服务所需的镜像,然后在后台启动服务。这个命令适用于开发环境,当你做了代码更改后,需要重新构建镜像并重启服务。
实战指南:
- 当你更新了应用代码或依赖,并想要快速看到更改效果时使用。
--build
选项确保每次都是使用最新的代码构建镜像,而-d
(--detach
)让服务在后台运行,不占用命令行。
- 当你更新了应用代码或依赖,并想要快速看到更改效果时使用。
停止服务:
docker compose stop
- 官方文档: https://docs.docker.com/reference/cli/docker/compose/stop/
- 作用: 停止由
docker-compose.yml
文件定义的所有服务,但不移除容器。 - 实战指南:
- 当你需要暂停你的应用服务但不想完全移除服务实例时使用。这允许你稍后使用
docker compose start
命令重新启动服务。
- 当你需要暂停你的应用服务但不想完全移除服务实例时使用。这允许你稍后使用
启动服务:
docker compose start
- 官方文档: https://docs.docker.com/reference/cli/docker/compose/start/
- 作用: 启动由
docker-compose.yml
文件定义的所有服务,但前提是这些服务之前已被创建并停止。 - 实战指南:
- 适用于已经通过
docker compose up
创建并后通过docker compose stop
停止的服务,这条命令快速重启服务而不需要重新创建容器。
- 适用于已经通过
重建并启动服务:
docker compose up --build
- 官方文档: https://docs.docker.com/reference/cli/docker/compose/up/
- 作用: 与
docker compose up --build -d
相似,但服务会在前台运行。如果服务已经运行,会先停止并移除现有的容器,然后根据最新的配置和代码构建镜像并启动服务。 - 实战指南:
- 用于开发环境,在进行了代码或配置更改后,确保服务能根据最新的变更启动。
停止并移除容器、网络、卷:
docker compose down
- 官方文档: https://docs.docker.com/reference/cli/docker/compose/down/
- 作用: 停止并移除由
docker-compose.yml
文件定义的所有服务的容器,以及网络和默认管理的卷。这条命令不会移除手动指定的外部卷。 - 实战指南:
- 当项目结束或需要从头开始时使用。这保证了环境的清洁,避免了未来运行时可能出现的配置冲突或资源浪费。
总结
这些命令提供了对 Docker 容器、镜像、网络和卷的基本操作,以及如何使用 Docker Compose 管理多容器应用的基础。根据你的具体需求,可以混合使用这些命令来管理和维护你的 Docker 环境。