引言
工欲善其事,必先利其器;工欲利其器,必先选择和学习自己的工具。
想要用好Docker,它的基本命令和操作是必须学习和掌握的技能。
一、Docker命令行基础
当说到 Docker 的命令基础时,有两个重要的方面需要考虑:初始配置和帮助命令。
-
Docker 的基本配置命令
-
docker version
:此命令用于检查 Docker 引擎的版本信息,包括客户端和服务器的版本号。 -
docker info
:该命令提供有关 Docker 系统的详细信息,例如 Docker 主机的配置、镜像和容器的数量等。 -
docker login
:如果您需要从 Docker Hub 或其他 Docker Registry 拉取或推送镜像,您需要使用此命令进行身份验证。您需要提供用户名、密码和可选的电子邮件地址。 -
docker logout
:用于注销当前登录的 Docker Hub 或其他 Docker Registry 用户。
-
-
帮助命令
-
docker --help
:使用此命令可以获取 Docker 的整体帮助信息。它会列出 Docker 的常用命令和选项,并提供简要说明。 -
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。例如,d
ocker 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 指令的详细说明:
- FROM :
FROM
指令用于指定基础镜像。它指定了构建新镜像所基于的镜像。
例如:
shell
# 构建新镜像时将基于最新的 Ubuntu 镜像。
FROM ubuntu:latest
- RUN :
RUN
指令用于在容器内执行命令。它可以用于安装软件包、执行脚本或进行其他系统配置。
例如:
shell
# 更新软件包列表和安装 curl
RUN apt-get update && apt-get install -y curl
- CMD :
CMD
指令用于指定容器启动时要执行的命令。它有多种形式,可以执行单个命令、执行脚本或执行应用程序。
例如:
bash
# 在容器启动时执行名为 `app.py` 的 Python 应用程序。
CMD ["python", "app.py"]
- EXPOSE :
EXPOSE
指令用于声明容器运行时要监听的网络端口。它并不会自动将宿主机的端口映射到容器内部,而只是声明容器打算监听哪些端口。
例如:
yaml
# 容器将监听 8080 端口
EXPOSE 8080
- VOLUME :
VOLUME
指令用于声明容器中的挂载点,并指示 Docker 将持久化存储数据的位置。它可以在容器内部或宿主机上创建一个挂载点。
例如:
bash
# 在容器内创建一个挂载点 `/data`,用于持久化存储数据。
VOLUME /data
- COPY :
COPY
指令用于将文件或目录从构建上下文复制到容器中。
语法:
xml
COPY <源路径> <目标路径>
<源路径>
是相对于构建上下文的路径,可以是单个文件或整个目录。<目标路径>
是容器内的目标路径,用于指定文件或目录要复制到的位置。
例如:
bash
COPY app.py /app/
COPY ./src /app/src
- ADD :
ADD
指令与COPY
类似,它也用于将文件或目录从构建上下文复制到容器中。但相对于COPY
,ADD
还支持更多功能,例如自动解压缩压缩文件、从网址下载文件等。
语法:
xml
ADD <源路径> <目标路径>
与 COPY
相同,<源路径>
是相对于构建上下文的路径,而 <目标路径>
是容器内的目标路径。
例如:
bash
ADD app.tar.gz /app/
ADD http://example.com/file.txt /app/
- WORKDIR :
WORKDIR
指令用于设置容器内部的工作目录,即在容器内执行后续命令的默认目录。它的语法如下:
复制
xml
WORKDIR <工作目录路径>
<工作目录路径>
可以是相对路径或绝对路径。如果指定的目录不存在,WORKDIR
指令会自动创建该目录。
例如:
bash
WORKDIR /app
- ENV :
ENV
指令用于设置环境变量。环境变量可以在容器内的运行过程中被访问和使用。
语法:
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
命令的执行过程如下:
七、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的强大和便捷。因此,不妨动手实践一下本文中提到的命令和操作,相信会有更多的收获。
浅知拙见;如果有任何错误或建议,请随时指正和提出。