概述
Docker 是一个开源的应用容器引擎,让开发者可以以统一的方式打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何安装了 Docker 引擎的服务器上,容器是完全使用沙箱机制,相互之间不会有任何接口。
优势
快速、一致的交付
Docker 允许开发人员使用提供应用程序和服务的本地容器在标准化环境中工作,从而简化了开发生命周期。容器非常适合持续集成和持续交付(CI / CD)工作流程。
响应式部署和扩展
Docker 基于容器的平台支持高度可移植的工作负载,可以在各种混合环境中运行。在可移植性和轻量级特性加持下可以快速的扩展或删除应用及服务。
在相同硬件上运行更多工作负载
Docker 轻量且快速,因此可以利用更多服务器容量来运行其他服务。
对比虚拟机
特性 | 容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
资源占用 | 一般为 MB | 一般为 GB |
运行性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
隔离性 | 进程级别 | 系统级别 |
基本概念
镜像
Docker 镜像是一个分层存储的特殊文件系统,分层存储的特征使得镜像的复用、定制更为容易。镜像必须包含运行应用程序所需的所有内容 - 所有依赖项、配置、脚本、二进制文件等。镜像还包含容器的其他配置,例如环境变量、默认命令运行,以及其他元数据。
容器
容器本质上是在主机上运行的沙盒进程,利用 namespace 和 cgroup 使得容器与该主机上运行的所有其他进程隔离,总而言之:
- 容器是镜像的可运行的实例,可以通过 Docker API 或 CLI 创建、启动、停止、移动和删除容器。
- 可以在本地机、虚拟机上运行,也可以部署到云端。
- 是可移植的(并且可以在任何操作系统上运行)。
- 与其他容器隔离,独立运行自己的软件、二进制文件、配置等。
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
提示
按照 Docker 最佳实践要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。
所有的文件写入操作,都应该使用数据卷(Volume)、或者是绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此, 使用数据卷后,容器删除再重新运行,数据不会丢失。
仓库
仓库顾名思义就是集中存放镜像的地方,镜像构建完成后,如果需要在其他节点上使用这个镜像,就需要一个集中存储、分发镜像的服务,Docker Registry 就是这样的服务。
Docker 官方提供 Docker Hub 来托管镜像,Docker 默认在 Docker Hub 上查找镜像,当然也可以搭建属于自己的私有托管平台。
Docker Hub(公共):https://hub.docker.com/
命令使用
提示
Docker 安装教程参考:CentOS 7 安装 Docker,常用命令整理基于 Docker Version:24.0.5
,可能因 Docker 版本不同存在差异,如下示例仅供参考。
更多参数及用法:
docker [COMMAND] --help
run 命令
通过镜像启动容器。
- 选项参数
Options | 描述 |
---|---|
-d ,--detach | 在后台运行容器,打印容器 ID |
-e ,--env | 设置变量参数 |
-p ,--publish | 将容器的端口映射到主机,格式(HOST:CONTAINER) |
-P ,--publish-all | 将所有公开的端口映射到随机端口 |
-q ,--quiet | 静默运行,不打印输出 |
-v ,--volume | 挂载卷 |
-u , --user | 用户名或UID |
--link | 添加到另一个容器的链接 |
--mount | 将文件系统挂在到容器上 |
--name | 为容器指定一个名称 |
--privileged | 为容器提供扩展权限 |
--read-only | 将容器的根文件系统挂载为只读 |
--restart | 当容器退出时应用重启策略:no :当容器退出时,不自动重启容器。默认值。on-failure[:max-retries] :仅当容器以非零状态退出时才重启。可以限制守护进程尝试重启次数。 unless-stopped :容器被显式停止或 Docker 服务停止才重启。always :在容器停止时始终重启容器。 |
--network | 将容器连接到网络 |
- 用法
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
- 示例
# 以 Nginx + Php 启动为例
docker run -d \
-p 80:80 \
-p 443:443 \
--name nginx \
--link php:php \
--restart=always \
--privileged=true \
-v /home/nginx/conf:/etc/nginx \
-v /home/nginx/logs:/var/log/nginx \
-v /home/nginx/conf/ssl:/etc/nginx/ssl \
-v /home/nginx/data:/usr/share/nginx/html \
-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf nginx
start 命令
启动一个或多个停止的容器。
- 选项参数
Options | 描述 |
---|---|
-a ,--attach | 附加输出信息、异常信息和转发信号 |
-i ,--interactive | 附加容器的标准输入 |
--detach-keys | 覆盖用于分离容器的键序列 |
- 用法
docker start [OPTIONS] CONTAINER [CONTAINER...]
- 示例
# 示例(通过容器名称或容器ID启动)
docker start redis
stop 命令
停止一个或多个正在运行的容器。
- 选项参数
Options | 描述 |
---|---|
-s , --signal | 发送到容器的信号 |
-t ,--time | 在杀死容器之前需要等待几秒钟 |
- 用法
docker stop [OPTIONS] CONTAINER [CONTAINER...]
- 示例
# 示例(通过容器名称或容器ID停止正在运行的容器)
docker stop redis
restart 命令
重新启动一个或多个容器。
- 选项参数
Options | 描述 |
---|---|
-s , --signal | 发送到容器的信号 |
-t ,--time | 在杀死容器之前需要等待几秒钟 |
- 用法
docker restart [OPTIONS] CONTAINER [CONTAINER...]
- 示例
# 示例(通过容器名称或容器ID重新启动)
docker restart redis
stats 命令
显示容器资源使用情况。
- 选项参数
Options | 描述 |
---|---|
-a ,--all | 显示所有容器(默认显示正在运行) |
--format | 使用自定义模板格式化输出: table :以带有列标头的表格格式打印输出(默认) table TEMPLATE :使用给定的 Go 模板以表格格式打印输出 json :以 JSON 格式打印 TEMPLATE :使用给定的 Go 模板打印输出 有关格式化的更多信息,请参阅 https://docs.docker.com/go/formatting/ |
--no-stream | 禁用流统计,只提取第一个结果 |
--no-trunc | 不要截断输出 |
- 用法
docker stats [OPTIONS] [CONTAINER...]
- 示例
# 示例(查看所有的容器资源使用情况)
docker stats -a
logs 命令
获取容器的日志。
- 选项参数
Options | 描述 |
---|---|
-f ,--follow | 跟踪日志输出 |
-n ,--tail | 从日志末尾开始显示的行数( 默认为 "all" ) |
-t ,--timestamps | 显示时间戳 |
--details | 显示详细信息日志 |
--since | 显示指定时间之后的日志 |
--until | 显示指定时间之前的日志 |
- 用法
docker logs [OPTIONS] CONTAINER
- 示例
# 示例(跟踪 redis 容器日志详情)
docker logs -f --details redis
kill 命令
杀死一个或多个正在运行的容器。
- 选项参数
Options | 描述 |
---|---|
-s ,--signal | 发送到容器的信号 |
- 用法
docker kill [OPTIONS] CONTAINER [CONTAINER...]
- 示例
# 示例(根据容器名称或容器 ID 杀死进程)
docker kill redis
exec 命令
在运行的容器中执行命令。
- 选项参数
Options | 描述 |
---|---|
-d , --detach | 分离模式:在后台运行命令 |
-e ,--env | 设置变量参数 |
-i ,--interactive | 保持标准输入打开 |
-t ,--tty | 分配一个伪 TTY |
-u ,--user | 用户名或 UID |
-w ,--workdir | 容器内的工作目录 |
--privileged | 为命令授予扩展权限 |
- 用法
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
- 示例
# 示例(使用 exec 命令与容器内部建立连接,可通过 sh 命令进行交互)
docker exec -it mysql /bin/bash
ps 命令
查看容器列表。
- 选项参数
Options | 描述 |
---|---|
-a ,--all | 显示所有容器(默认显示正在运行) |
-f ,--filter | 根据提供的条件过滤输出 |
-n ,--last | 显示最近创建的容器(包括所有状态)(默认为-1) |
-l ,--latest | 显示最新创建的容器(包括所有状态) |
-q ,--quiet | 安静模式,只显示容器 ID |
-s ,--size | 显示总文件大小 |
--format | 使用自定义模板格式化输出:table :以带有列标头的表格格式打印输出(默认)table TEMPLATE :使用给定的 Go 模板以表格格式打印输出json :以 JSON 格式打印TEMPLATE :使用给定的 Go 模板打印输出有关格式化的更多信息,请参阅 https://docs.docker.com/go/formatting/ |
--no-trunc | 不要截断输出 |
- 用法
docker ps [OPTIONS]
- 示例
# 示例(查看所有运行中的容器状态)
docker ps
# 示例(查看所有容器状态)
docker ps -a
build 命令
构建镜像命令。构建时需要用到 Dockerfile 文件。
- 选项参数
Options | 描述 |
---|---|
-t ,--tag | 名称和可选的标签( 格式:"name:tag" ) |
-f ,--file | Dockerfile 的文件名( 默认:"PATH/Dockerfile" ) |
-q ,--quiet | 安静模式,成功后只输出镜像ID |
-o ,--output | 输出目标配置 |
--build-arg | 设置构建过程中的参数 |
--network | 设置构建过程中使用的网络模式 |
--no-cache | 禁用缓存,每次都重新构建整个镜像 |
--pull | 在构建过程中尝试更新基础镜像 |
- 用法
docker buildx build [OPTIONS] PATH | URL | -
- 示例
# 示例(使用当前目录的 Dockerfile 进行构建,并指定镜像名称为 myimages,版本号为 latest)
docker build -t myimage:latest . # 使用当前目录的 Dockerfile 构建镜像
pull 命令
从远程仓库拉取镜像。默认仓库为 https://hub.docker.com/
- 选项参数
Options | 描述 |
---|---|
-a ,--all-tags | 下载存储库中的所有标记图像 |
-q ,--quiet | 安静模式,禁止详细输出 |
--disable-content-trust | 跳过图像验证( 默认为 true ) |
--platform | 设置平台 |
- 用法
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
- 示例
# 示例(默认拉取 nginx 镜像 latest 版本)
docker pull nginx
# 示例(拉取 nginx 镜像指定版本)
docker pull nginx:latest
# 示例(拉取指定仓库 host:port 下 image 镜像的 tag 版本)
docker pull [host]:[port]/[image]:[tag]
push 命令
推送镜像到远程仓库。
- 选项参数
Options | 描述 |
---|---|
-a ,--all-tags | 下载存储库中的所有标记图像 |
-q ,--quiet | 安静模式,禁止详细输出 |
--disable-content-trust | 跳过图像验证( 默认为 true ) |
- 用法
docker push [OPTIONS] NAME[:TAG]
- 示例
# 示例(推送镜像 example 并指定 tagname 到 dockerhub 下 xxx 仓库下)
docker push xxx/example:tagname
images 命令
查看已拉取镜像列表。
- 选项参数
Options | 描述 |
---|---|
-a ,--all | 显示所有镜像(默认显示正在运行) |
-f ,--filter | 根据提供的条件过滤输出 |
-q ,--quiet | 安静模式,只显示镜像 ID |
--format | 使用自定义模板格式化输出:table :以带有列标头的表格格式打印输出(默认)table TEMPLATE :使用给定的 Go 模板以表格格式打印输出json :以 JSON 格式打印TEMPLATE :使用给定的 Go 模板打印输出有关格式化的更多信息,请参阅 https://docs.docker.com/go/formatting/ |
--digests | 显示摘要 |
--no-trunc | 不要截断输出 |
- 用法
docker images [OPTIONS] [REPOSITORY[:TAG]]
- 示例
# 示例(查询本地所有已拉取的镜像列表)
docker images
rm 命令
移除一个或多个容器。
- 选项参数
Options | 描述 |
---|---|
-f ,--force | 强制移除正在运行的容器(使用SIGKILL) |
-l ,--link | 删除与容器关联的容器 |
-v ,--volumes | 删除与容器关联的匿名卷 |
- 用法
docker rm [OPTIONS] CONTAINER [CONTAINER...]
- 示例
# 示例(强制移除 nginx 容器,即使容器在运行中)
docker rm nginx -f
# 示例(移除 redis 容器,并删除关联卷)
docker rm redis -v
rmi 命令
删除一个或多个镜像。
- 选项参数
Options | 描述 |
---|---|
-f ,--force | 强制删除镜像 |
--no-prune | 不删除未标记的父项 |
- 用法
docker rmi [OPTIONS] IMAGE [IMAGE...]
- 示例
# 示例(强制删除 nginx 镜像,即使镜像在使用中)
docker rmi -f nginx
# 示例(删除 latest 版本 nginx 镜像)
docker rmi nginx:latest
search 命令
从 Docker Hub 搜索镜像。
- 选项参数:
Options | 描述 |
---|---|
-f ,--filter | 根据提供的条件过滤输出 |
--format | 使用自定义模板格式化输出:table :以带有列标头的表格格式打印输出(默认)table TEMPLATE :使用给定的 Go 模板以表格格式打印输出json :以 JSON 格式打印TEMPLATE :使用给定的 Go 模板打印输出有关格式化的更多信息,请参阅 https://docs.docker.com/go/formatting/ |
--limit | 搜索结果数量 |
--no-trunc | 不要截断输出 |
- 用法
docker search [OPTIONS] TERM
- 示例
# 语法(搜索 nginx 镜像)
docker search nginx
# 示例(搜索 nginx 镜像,且 stars 大于 200 的记录)
docker search -f stars=200 nginx
version 命令
查看 Docker 版本,命令选项参数如下:
- 选项参数
Options | 描述 |
---|---|
--format | 使用自定义模板格式化输出:table :以带有列标头的表格格式打印输出(默认)json :以 JSON 格式打印有关格式化的更多信息,请参阅 https://docs.docker.com/go/formatting/ |
- 用法
docker version [OPTIONS]
- 示例
# 示例(查看 Docker 版本信息)
docker version
# 示例(以 json 格式输出 Docker 版本信息)
docker version --format json
info 命令
显示系统范围的信息。
- 选项参数
Options | 描述 |
---|---|
--format | 使用自定义模板格式化输出:table :以带有列标头的表格格式打印输出(默认)json :以 JSON 格式打印有关格式化的更多信息,请参阅 https://docs.docker.com/go/formatting/ |
- 用法
docker info [OPTIONS]
- 示例
# 示例(查看系统范围信息)
docker info
# 示例(以 json 格式输出系统范围信息)
docker info --format json
管理命令
管理命令及其他命令本文不展开说明,详细使用参考:https://docs.docker.com/engine/reference/commandline/cli/
命令 | 说明 |
---|---|
builder | 管理构建 |
buildx | 使用 BuildKit 扩展构建功能 |
compose | 用 Docker 定义和运行多容器应用程序 |
container | 管理容器 |
context | 管理上下文 |
image | 管理镜像 |
manifest | 管理 Docker 镜像清单和清单列表 |
network | 管理网络 |
plugin | 管理插件 |
system | 管理 Docker |
trust | 管理对 Docker 镜像的信任 |
volume | 管理数据卷 |
swarm | 管理 Swarm 集群 |
其他命令
命令 | 说明 |
---|---|
commit | 根据容器的更改创建新图像 |
login | 登录远程仓库,如果没有指定服务器,默认值由 daemon 配置定义 |
logout | 注销远程仓库登录,如果没有指定服务器,默认值由 daemon 配置定义 |
attach | 将本地标准输入、输出和错误流附加到正在运行的容器 |
commit | 根据容器的更改创建新图像 |
cp | 在容器和本地文件系统之间复制文件/文件夹 |
create | 创建新容器 |
diff | 检查对容器文件系统上的文件或目录的更改 |
events | 从服务器获取实时事件 |
export | 将容器的文件系统导出为 tar 存档 |
history | 显示镜像像的历史记录 |
import | 从 tarball 导入内容以创建文件系统映像 |
inspect | 返回 Docker 对象的低级信息 |
load | 从 tar 存档或 STDIN 加载图像 |
pause | 暂停一个或多个容器中的所有进程 |
port | 列出容器的端口映射或特定映射 |
rename | 重命名容器 |
save | 将一个或多个图像保存到tar存档( 默认情况下流式传输到 STDOUT ) |
tag | 创建一个引用SOURCE_IMAGE的标记TARGET_IMAGE |
top | 显示容器的运行进程 |
unpause | 取消暂停一个或多个容器中的所有进程 |
update | 更新一个或多个容器的配置 |
wait | 阻止,直到一个或多个容器停止,然后打印它们的退出代码 |