详解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的强大和便捷。因此,不妨动手实践一下本文中提到的命令和操作,相信会有更多的收获。

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

相关推荐
❀͜͡傀儡师4 小时前
docker一键部署HFish蜜罐
运维·docker·容器
DO_Community4 小时前
DigitalOcean容器注册表推出多注册表支持功能
服务器·数据库·docker·kubernetes
dnpao5 小时前
linux onlyoffice服务向docker容器中添加中文字体
linux·运维·docker
java_logo6 小时前
Dify 开源 LLM 应用开发平台企业级 Docker Compose 部署手册
docker·容器·开源·dify部署·dify部署文档·dify部署方案·dify部署教程
jarreyer7 小时前
【docker的gpu加速相关问题解决记录】
运维·docker·容器
韭菜钟7 小时前
制作自定义Docker镜像并部署使用
运维·docker·容器
椰汁菠萝7 小时前
docker部署gitlab
docker·容器·gitlab
知识分享小能手7 小时前
Ubuntu入门学习教程,从入门到精通,Ubuntu 22.04 中安装 Docker 容器 —— 知识点详解(26)
学习·ubuntu·docker
Knight_AL8 小时前
使用 Docker 快速安装 GitLab(CentOS)
docker·centos·gitlab
牛奔9 小时前
Docker Compose 解决服务间 DNS 解析失败问题
运维·docker·容器