详解Docker命令行

引言

工欲善其事,必先利其器;工欲利其器,必先选择和学习自己的工具。

想要用好Docker,它的基本命令和操作是必须学习和掌握的技能。

一、Docker命令行基础

当说到 Docker 的命令基础时,有两个重要的方面需要考虑:初始配置和帮助命令。

  • Docker 的基本配置命令

    1. docker version:此命令用于检查 Docker 引擎的版本信息,包括客户端和服务器的版本号。

    2. docker info:该命令提供有关 Docker 系统的详细信息,例如 Docker 主机的配置、镜像和容器的数量等。

    3. docker login:如果您需要从 Docker Hub 或其他 Docker Registry 拉取或推送镜像,您需要使用此命令进行身份验证。您需要提供用户名、密码和可选的电子邮件地址。

    4. docker logout:用于注销当前登录的 Docker Hub 或其他 Docker Registry 用户。

  • 帮助命令

    1. docker --help:使用此命令可以获取 Docker 的整体帮助信息。它会列出 Docker 的常用命令和选项,并提供简要说明。

    2. docker <command> --help:针对特定的 Docker 命令,您可以使用此命令获取更详细的帮助信息。将 <command> 替换为您要查看帮助的具体命令,例如 docker run --help

二、镜像管理

Docker 提供了一系列命令来管理镜像,这些命令可以用来管理 Docker 镜像,包括拉取、推送、列出、删除和清理镜像等操作。

下面是关于 Docker 镜像管理的常用命令:

  • docker pull:使用此命令可以从 Docker Registry 拉取镜像到本地。您需要指定要拉取的镜像的名称和标签。例如,docker pull nginx:latest 将拉取名为 "nginx" 的最新标签镜像。

  • docker push:将本地的镜像推送到 Docker Registry。您需要指定要推送的镜像的名称和标签。例如,docker push username/repository:tag 将推送名为 "repository" 的镜像到指定的 Docker Registry。

  • docker images:使用此命令可以列出本地主机上的所有镜像。它将显示每个镜像的名称、标签、镜像 ID、大小和创建时间等信息。

  • docker rmi:该命令用于删除本地主机上的一个或多个镜像。您可以通过指定镜像的名称和标签来删除特定的镜像。例如,docker rmi nginx:latest 将删除名为 "nginx" 的最新标签镜像。

  • docker image prune:用于清理未使用的镜像。它将删除本地主机上没有任何容器使用的镜像,以释放磁盘空间。您可以使用 docker image prune -a 命令来删除所有未使用的镜像,包括没有标签的中间镜像。

  • docker system prune:此命令用于清理不再使用的镜像、容器和网络等资源。它将删除未运行的容器、停止的容器、未使用的镜像以及未使用的网络等,以释放磁盘空间和系统资源。

三、容器管理

Docker 提供了一系列命令来管理容器,这些命令可以用来管理容器,包括创建、启动、停止、重启、列出和删除容器,以及进入容器进行操作和调试。

以下是关于容器管理的常用命令:

  • docker run :使用此命令可以创建并启动一个新的容器。您需要指定要使用的镜像名称、容器的名称、端口映射、环境变量等相关配置。例如,docker run -d --name mynginx -p 8080:80 nginx 将以后台模式创建名为 "mynginx" 的容器,将容器内部的 80 端口映射到主机的 8080 端口,并使用 nginx 镜像。

  • docker start / docker stop :这些命令用于启动和停止容器。docker start 可以启动已创建但已停止的容器,docker stop 可以停止正在运行的容器。您需要提供容器的名称或容器 ID。例如,docker start mynginx 将启动名为 "mynginx" 的容器。

  • docker restart :使用此命令可以重启容器。您需要提供容器的名称或容器 ID。例如,docker restart mynginx 将重启名为 "mynginx" 的容器。

  • docker ps:此命令用于列出正在运行的容器。它将显示容器的名称、容器 ID、使用的镜像、状态、端口映射等信息。通过添加 -a 参数,您可以列出所有的容器,包括已停止的容器。

  • docker rm :该命令用于删除容器。您需要提供容器的名称或容器 ID。例如,docker rm mynginx 将删除名为 "mynginx" 的容器。

  • docker exec -it :使用此命令可以进入正在运行的容器的命令行界面。您需要提供容器的名称或容器 ID。例如,docker exec -it mynginx bash 将进入名为 "mynginx" 的容器,并在容器内部运行交互式的 bash shell。

四、数据卷和持久化

Docker 数据卷和持久化提供了一种方便的方式来存储和共享容器中的数据。

下面是关于数据卷和持久化的详细说明和示例:

  • 数据卷的创建与挂载

    使用 docker volume create 命令可以创建一个新的数据卷。例如,docker volume create myvolume 将创建一个名为 "myvolume" 的数据卷。然后,使用 docker run 命令的 -v 参数可以将数据卷挂载到容器中。例如,docker run -d --name mynginx -v myvolume:/data nginx 将创建一个名为 "mynginx" 的容器,并将 "myvolume" 数据卷挂载到容器的 /data 目录。

  • 数据卷的查看与删除

    使用 docker volume ls 命令可以列出所有的数据卷,包括名称、驱动程序和挂载点等信息。例如,docker volume ls 将列出所有的数据卷。使用 docker volume rm 命令可以删除一个或多个数据卷。例如,docker volume rm myvolume 将删除名为 "myvolume" 的数据卷。

  • 容器数据的持久化与备份

    通过使用数据卷,容器中的数据可以持久化存储,并且不会随着容器的删除而丢失。您可以使用数据卷来存储应用程序的配置文件、数据库文件、日志文件等。通过挂载相同的数据卷到多个容器中,可以实现数据的共享和持久化。此外,您可以使用备份工具(如 docker cp 命令或其他备份工具)将容器中的数据复制到本地主机或远程存储位置,以实现数据的备份和恢复。

    例如:假设有一个使用 MySQL 数据库的容器,并且想要持久化存储数据库文件。可以创建一个名为 "mysql-data" 的数据卷,并将其挂载到容器的 /var/lib/mysql 目录,如下所示:

shell 复制代码
docker volume create mysql-data

docker run -d --name mysql-container -v mysql-data:/var/lib/mysql mysql

## 这样,即使删除或重新创建容器,数据库文件仍然存在于挂载的数据卷中,从而实现了数据的持久化

注意:在实际应用中,需要采取适当的备份和恢复策略,并确保对数据进行定期备份,以防止数据丢失或损坏。

五、网络配置

Docker 提供了一系列命令来配置和管理容器的网络,这些命令可以用来管理 Docker 中的网络配置,包括创建网络、列出网络、查看网络详细信息、连接和断开容器与网络的关联,以及删除网络等操作。

下面是关于 Docker 网络配置的详细说明:

  • docker network create:使用此命令可以创建一个自定义网络。您可以指定网络的名称、驱动程序和其他网络参数。例如,docker network create mynetwork 将创建一个名为 "mynetwork" 的自定义网络。

  • docker network ls:此命令用于列出所有的网络。它将显示网络的名称、驱动程序、作用域和其他信息。例如,docker network ls 将列出所有的网络。

  • docker network inspect:使用此命令可以查看特定网络的详细信息。您需要提供网络的名称或网络 ID。例如,docker network inspect mynetwork 将显示名为 "mynetwork" 的网络的详细信息。

  • docker network connect / docker network disconnect:这些命令用于将容器连接到或断开特定网络。您需要提供容器的名称或容器 ID,以及网络的名称或网络 ID。例如,docker network connect mynetwork mycontainer 将将名为 "mycontainer" 的容器连接到名为 "mynetwork" 的网络。

  • docker network rm:该命令用于删除一个或多个网络。您需要提供网络的名称或网络 ID。例如,docker network rm mynetwork 将删除名为 "mynetwork" 的网络。

  • docker network prune:使用此命令可以清理未使用的网络。它将删除没有任何容器连接的网络,以释放资源。例如,docker network prune 将删除所有未使用的网络。

注意:docker network connect 命令还可以通过 --alias 参数为容器指定别名,以便容器可以使用别名来与其他容器通信。

六、Dockerfile

6.1 Dockerfile的作用

Dockerfile 是用于定义 Docker 镜像构建过程的文本文件。它包含一系列指令和配置,用于指导 Docker 引擎在构建镜像时执行的操作。

Dockerfile 的作用是提供了一种可重复、可自动化的方式来构建镜像,并且可以通过版本控制系统进行管理和共享。

6.2 常用指令说明

当编写 Dockerfile 时,可以使用多种指令来定义镜像的构建过程;这些指令在 Dockerfile 中提供了灵活的配置选项。

下面是一些常用的 Dockerfile 指令的详细说明:

  • FROMFROM 指令用于指定基础镜像。它指定了构建新镜像所基于的镜像。

例如:

shell 复制代码
# 构建新镜像时将基于最新的 Ubuntu 镜像。
FROM ubuntu:latest
  • RUNRUN 指令用于在容器内执行命令。它可以用于安装软件包、执行脚本或进行其他系统配置。

例如:

shell 复制代码
# 更新软件包列表和安装 curl
RUN apt-get update && apt-get install -y curl
  • CMDCMD 指令用于指定容器启动时要执行的命令。它有多种形式,可以执行单个命令、执行脚本或执行应用程序。

例如:

bash 复制代码
# 在容器启动时执行名为 `app.py` 的 Python 应用程序。
CMD ["python", "app.py"]
  • EXPOSEEXPOSE 指令用于声明容器运行时要监听的网络端口。它并不会自动将宿主机的端口映射到容器内部,而只是声明容器打算监听哪些端口。

例如:

yaml 复制代码
# 容器将监听 8080 端口
EXPOSE 8080
  • VOLUMEVOLUME 指令用于声明容器中的挂载点,并指示 Docker 将持久化存储数据的位置。它可以在容器内部或宿主机上创建一个挂载点。

例如:

bash 复制代码
# 在容器内创建一个挂载点 `/data`,用于持久化存储数据。
VOLUME /data
  • COPYCOPY 指令用于将文件或目录从构建上下文复制到容器中。

语法:

xml 复制代码
COPY <源路径> <目标路径>

<源路径> 是相对于构建上下文的路径,可以是单个文件或整个目录。<目标路径> 是容器内的目标路径,用于指定文件或目录要复制到的位置。

例如:

bash 复制代码
COPY app.py /app/
COPY ./src /app/src
  • ADDADD 指令与 COPY 类似,它也用于将文件或目录从构建上下文复制到容器中。但相对于 COPYADD 还支持更多功能,例如自动解压缩压缩文件、从网址下载文件等。

语法:

xml 复制代码
ADD <源路径> <目标路径>

COPY 相同,<源路径> 是相对于构建上下文的路径,而 <目标路径> 是容器内的目标路径。

例如:

bash 复制代码
ADD app.tar.gz /app/
ADD http://example.com/file.txt /app/
  • WORKDIRWORKDIR 指令用于设置容器内部的工作目录,即在容器内执行后续命令的默认目录。它的语法如下:

复制

xml 复制代码
WORKDIR <工作目录路径>

<工作目录路径> 可以是相对路径或绝对路径。如果指定的目录不存在,WORKDIR 指令会自动创建该目录。

例如:

bash 复制代码
WORKDIR /app
  • ENVENV 指令用于设置环境变量。环境变量可以在容器内的运行过程中被访问和使用。

语法:

xml 复制代码
ENV <变量名>=<值>

可以指定一个或多个环境变量,每个环境变量都由 <变量名><值> 组成。

例如:

ini 复制代码
ENV APP_VERSION=1.0
ENV DB_HOST=localhost DB_PORT=3306

6.3 构建镜像:docker build

6.3.1 语法

在 Docker 中,使用 Dockerfile 构建镜像是通过执行 docker build 命令来完成的。以下是关于 docker build 的详细说明:

css 复制代码
docker build [选项] <上下文路径>
  • [选项]:用于指定构建镜像的各种选项,例如镜像标签、构建缓存等。常用选项包括:

    • -t--tag:指定镜像的标签。例如,-t myimage:latest 表示将构建的镜像标记为 myimage,标签为 latest

    • --no-cache:禁用构建缓存,每一条指令都将强制重新执行。

    • 其他选项可以使用 docker build --help 命令查看。

  • <上下文路径>:指定 Docker 上下文的路径。Docker 在构建镜像时会将指定路径下的文件和目录作为构建上下文。Docker 引擎将递归地复制上下文中的内容,并将其发送到 Docker 服务器,用于构建过程中的各种操作。

6.3.2 执行过程

docker build 命令的执行过程如下:

graph TB A(切换到包含 Dockerfile 的目录) --> B(执行 docker build 命令) B --> C(指定选项和上下文路径) C --> D{Dockerfile 中的指令} D -->|按顺序执行| E(生成新的镜像层) E --> F{是否有缓存} F -->|有缓存| G(使用缓存执行) G --> E F -->|无缓存| H(重新执行) H --> E D --> I(输出执行结果和构建日志) I --> J{所有指令执行完毕} J -->|完成| K(生成最终镜像并打标签)

七、Docker命令行的高级操作

Docker还有一些命令不在上面这些模块里面,我分了一个高级操作,哈哈;下面是 Docker 命令行的一些高级操作的详细说明:

7.1 日志管理

  • docker logs 命令用于查看容器的日志输出。可以使用容器的 ID 或名称作为参数来指定要查看日志的容器。例如:docker logs mycontainer 将显示名为 "mycontainer" 的容器的日志输出。

  • 可以使用 --follow-f 选项来实时跟踪日志输出,类似于 tail -f 命令。

  • --since--until 选项可以指定一个时间范围,只显示在指定时间范围内生成的日志。

7.2 容器资源限制

  • docker run 命令用于创建和运行容器。通过使用 --memory--cpus 参数,可以限制容器可使用的内存和 CPU 资源。

  • --memory 参数用于限制容器使用的内存量。可以指定具体的大小,例如 --memory=1g 表示限制为 1GB 内存。也可以使用相对值,例如 --memory=50% 表示限制为宿主机内存的 50%。

  • --cpus 参数用于限制容器可以使用的 CPU 核心数。可以指定一个小数值,例如 --cpus=0.5 表示限制为半个 CPU 核心。也可以使用整数值,例如 --cpus=2 表示限制为 2 个 CPU 核心。

7.3 容器的复制和重命名

  • docker commit 命令用于将容器的当前状态保存为新的镜像。可以指定容器的 ID 或名称以及要创建的新镜像的名称和标签。例如:docker commit mycontainer myimage:tag 将基于名为 "mycontainer" 的容器创建一个名为 "myimage",标签为 "tag" 的新镜像。

  • docker tag 命令用于为现有的镜像创建新的标签。可以指定现有镜像的名称和标签,以及要创建的新标签。例如:docker tag myimage:tag myimage:latest 将为名为 "myimage",标签为 "tag" 的镜像创建一个名为 "myimage",标签为 "latest" 的新标签。

  • docker rename 命令用于为容器重命名。可以指定容器的当前名称和新名称。例如:docker rename mycontainer newcontainer 将名为 "mycontainer" 的容器重命名为 "newcontainer"。

八、总结

Docker命令行的重要性不容忽视,它是与Docker生态系统交互的核心工具。通过命令行,用户能够精确控制Docker的各个方面,从而最大化Docker的效益。

通过本文的阅读,我们深入了解了Docker命令行的基本操作和一些高级功能。从Docker的安装和配置开始,到镜像和容器的管理,再到数据卷的使用、网络配置、Dockerfile的编写以及高级命令的应用,每一步都是构建和维护Docker化应用不可或缺的技能。

正如歇后语所言:"瓜熟蒂落------水到渠成",掌握了这些基础和高级的Docker命令,就像是瓜熟自然蒂落,使得在使用Docker时能够水到渠成,得心应手。无论是开发、测试还是部署应用,Docker都能提供强大的支持,让整个过程变得更加高效和简单。

记住,实践是检验真理的唯一标准。理论知识固然重要,但将其应用于实际操作中,才能真正体会到Docker的强大和便捷。因此,不妨动手实践一下本文中提到的命令和操作,相信会有更多的收获。

浅知拙见;如果有任何错误或建议,请随时指正和提出。

相关推荐
yimenren2 小时前
docker desktop使用ollama在GPU上运行deepseek r1大模型
运维·docker·容器
阿猿收手吧!4 小时前
【Docker】Docker入门了解
linux·运维·服务器·docker·云原生·容器·eureka
James50618 小时前
WordPress使用(1)
docker·博客·wordpress
清欢渡hb2 天前
使用 Docker + Nginx + Certbot 实现自动化管理 SSL 证书
nginx·docker·自动化
仇辉攻防2 天前
【云安全】云原生-K8S-搭建/安装/部署
web安全·网络安全·docker·云原生·容器·kubernetes·k8s
山猪打不过家猪2 天前
Docker/K8S
docker·容器·kubernetes
huaweichenai2 天前
容器内判断当前的运行环境是docker还是podman
docker·容器·podman
前端 贾公子2 天前
速通Docker === Dockerfile
运维·docker·容器
handsomestWei3 天前
centos搭建docker registry镜像仓库
linux·docker·centos
仇辉攻防3 天前
【云安全】云原生-K8S-简介
web安全·网络安全·docker·云原生·容器·kubernetes·k8s