Docker命令
Docker 镜像构建
docker build命令是 Docker 引擎的核心命令之一,用于根据 Dockerfile中的指令自动构建 Docker 镜像。
核心概念与基础语法
- 构建上下文:这是
docker build命令中指定的路径(通常是当前目录.)。Docker 客户端会将这个路径下的所有文件(递归地)打包发送给 Docker 守护进程,因此只有上下文中的文件才能被Dockerfile中的COPY或ADD指令使用。为了提高效率,建议使用空目录作为上下文,或通过.dockerignore文件排除不必要的文件 - Dockerfile:这是一个文本文件,包含了一系列用于构建镜像的指令(如
FROM,RUN,COPY等)。docker build会逐条执行这些指令,每条指令都会创建一个新的镜像层。
基本语法:
|
|
其中 PATH就是构建上下文的路径。
常用选项详解
| 选项 | 说明与示例 | 适用场景 |
|---|---|---|
-t/ --tag |
为构建出的镜像命名和打标签。格式为 name:tag。示例:docker build -t myapp:latest -t myapp:v1.0 . |
镜像版本管理。 |
-f/ --file |
指定要使用的 Dockerfile路径(当 Dockerfile不在上下文根目录或名称非默认时)。示例:docker build -f ./docker/Dockerfile.prod . |
项目中有多个不同用途的 Dockerfile。 |
--build-arg |
设置构建时的变量,这些变量可以在 Dockerfile中通过 ARG指令引用。示例:docker build --build-arg NODE_ENV=production . |
动态传入构建参数,如版本号、环境变量。 |
--no-cache |
强制忽略之前构建的缓存,执行全新构建。示例:docker build --no-cache . |
确保依赖获取最新版本或解决缓存导致的构建问题。 |
--target |
在多阶段构建的 Dockerfile中,只构建到指定的目标阶段。示例:docker build --target builder . |
仅构建用于编译的中间阶段,以缩小最终镜像体积。 |
-q/ --quiet |
安静模式,构建成功后只输出最终的镜像ID。 | 适用于自动化脚本,减少输出信息。 |
工作原理与流程
- 发送上下文:Docker 客户端将整个构建上下文目录打包发送给 Docker 守护进程。因此,避免使用根目录
/作为上下文,以免发送大量无用数据。 - 逐行执行:守护进程逐条解析并执行
Dockerfile中的指令。 - 层缓存机制:每条指令都会生成一个只读的镜像层。Docker 会缓存未改变的层,后续构建时直接使用缓存,从而大幅加速构建过程。控制台输出中的
CACHED标识即表示使用了缓存。 - 输出镜像:所有指令执行完毕后,生成最终的镜像。
示例
|
|
Docker 容器启动
启动Docker容器有多种方式,具体取决于使用场景和需求。以下是常见的启动容器方法及详细说明:
基本启动命令
使用docker run命令创建并启动一个新容器:
|
|
- 常用选项
-d:后台运行(守护态)。-it:交互式终端(如/bin/bash)。--name:指定容器名称。-rm:容器停止后自动删除容器。-p:端口映射(格式:主机端口:容器端口)。一般容器有通信需求会用-v:挂载数据卷。--restart:设置重启策略(如always、unless-stopped)。/bin/bash:交互式终端进入工作目录。
示例:
|
|
启动已停止的容器
若容器已存在但处于停止状态,使用docker start:
|
|
- 可结合
-a参数查看输出日志。
进入运行中的容器
-
docker exec(推荐):在运行中的容器内启动新终端,退出时容器不会停止:
1docker exec -it <容器ID> /bin/bash -
docker attach: 直接进入容器的主进程终端,退出可能导致容器停止。
使用Docker Compose启动多容器
通过docker-compose.yml文件定义服务,一键启动:
|
|
- 适用场景:需编排多个关联容器(如Web+数据库)。
后台运行与资源限制
- 后台运行:添加
-d参数。 - 资源限制:
- 内存:
-m 200M --memory-swap=300M。 - CPU权重:
--cpu-shares 512。
- 内存:
注意事项
- 端口冲突:确保主机端口未被占用。
- 数据持久化:使用
-v挂载重要数据,避免容器删除后丢失。 - 日志排查:启动失败时,通过
docker logs <容器ID>查看错误。
Docker 容器/镜像重命名
在Docker中,重命名容器可以通过以下命令和方法实现:
使用docker rename命令
这是最简便的方法,适用于运行中或已停止的容器:
|
|
-
示例:
1docker rename my_old_container my_new_container -
注意:
- 新名称必须唯一,不能与现有容器冲突。
- 操作不会影响容器内部进程或数据。
停止并重新创建容器
若需保留原容器的配置,可先停止并删除原容器,再以新名称重新创建:
|
|
- 适用场景:需要调整其他参数(如端口、卷)时。
使用Docker Compose
若容器由docker-compose.yml管理,直接修改文件中的服务名称并重启:
|
|
然后运行:
|
|
- 优势:适合多容器编排场景。
常见问题
- 名称冲突:若新名称已存在,Docker会报错
Conflict,需先删除或重名冲突容器。 - 验证结果:通过
docker ps -a确认名称是否更新。
总结
优先使用docker rename快速重命名;复杂需求(如配置变更)可结合停止重建或Compose调整。确保操作前后验证容器状态。
Docker 容器提交为镜像
docker commit命令允许你直接将一个容器的当前状态(包括文件更改、已安装的软件、配置调整等)保存为一个新的 Docker 镜像。它就像给容器拍了一张快照,便于快速保存或分享特定工作状态。
|
|
| 选项 | 缩写 | 功能说明 | 示例 |
|---|---|---|---|
--author |
-a |
指定新镜像的作者信息。 | -a "张三 <zhang@example.com>" |
--message |
-m |
添加提交信息,说明此次更改的内容。 | -m "安装了Nginx服务器" |
--change |
-c |
应用Dockerfile指令(如ENV, EXPOSE, CMD等)。 |
-c "EXPOSE 8080" |
--pause |
-p |
提交时是否暂停容器以确保数据一致性(默认为true)。 | --pause=false |
适用情况:
- 快速保存调试环境:当你在容器内进行复杂的配置或调试,并希望保存当前进度时,使用
docker commit可以快速创建一个镜像,下次可以直接从这一步开始,无需重头再来。 - 紧急热修复:生产环境中的容器出现问题需要立即修复时,你可以进入容器实施修复,然后通过
docker commit快速生成一个包含修复的临时镜像用于部署,为编写正式的 Dockerfile 争取时间。 - 创建自定义开发环境:基于一个标准镜像(如官方 Python 镜像)启动容器,安装团队所需的各种开发工具和依赖后,提交为一个标准的团队开发环境镜像,方便统一开发环境。
- 保存难以Dockerfile化的操作:有些交互式安装过程或图形界面软件的配置很难用 Dockerfile 指令完全自动化,这时可以通过交互操作后提交镜像来保存成果。
注意事项
尽管 docker commit很方便,但也有一些重要的限制和需要注意的地方:
- 可重复性差:通过
docker commit创建的镜像构建过程是黑盒的,缺乏像 Dockerfile 那样的声明性和可重复性。他人很难知晓镜像的准确构建步骤。所以在正式规范的团队开发里,还是尽量通过dockerfile来构建镜像。 - 容易导致镜像臃肿:交互式操作容易引入不必要的临时文件或缓存,如果未及时清理,会使镜像体积迅速膨胀。最佳实践:提交前,尽量清理缓存和临时文件(例如执行
apt-get clean)。 - 可能存在安全风险:无意中提交的镜像可能包含敏感信息,如密码、密钥等。最佳实践:提交前检查更改,使用
docker diff <容器名>查看文件系统差异,避免提交敏感数据。 - 不包含卷(Volume)中的数据:
docker commit不会保存容器内挂载的卷中的数据。
最后一点补充说明一下,如果你想要保存容器内挂载的卷中的数据,可以用cp指令拷贝进容器内目录。
|
|
- 前者为被复制的目录(或文件),后者为要复制到的目录
- -r /-R:递归复制,用于复制目录和其中所有内容
- -f:强制覆盖已存在的目标文件
- -n:不覆盖已经存在的目录
Docker 打包镜像
docker save是一个非常有用的 Docker 命令,它能将你的 Docker 镜像打包成一个独立的归档文件(tar 格式),非常适合用于镜像的备份、迁移或在离线环境中分发。
|
|
- -o:将指定标签的镜像保存为指定名称的
.tar文件 - 多个镜像打包:后面可以接好几个镜像一起打包
- 使用重定向:使用 Shell 重定向操作,效果与
-o相同
Docker 加载镜像
|
|
核心功能是:将 docker save导出的镜像包(如 nginx.tar)恢复至本地镜像库。
加载过程会完整恢复镜像的所有层(Layers)、标签(Tag)、构建历史等元数据,保持镜像完整性。主要应用于离线环境部署、镜像备份恢复和批量镜像迁移。
常见问题
-
镜像标签为
<none>:有时加载后镜像名称和标签会显示为<none>。这通常是因为 tar 文件本身未包含标签信息。解决方法很简单,使用
docker tag命令手动为其打上标签即可:1 2 3 4 5# 先通过 docker images 查看镜像ID docker images # 然后为指定镜像ID打上标签 docker tag <镜像ID> nginx:latest [1,6](@ref) -
加载失败排查:如果加载失败,可以先检查 tar 文件是否完整。可以使用
tar -tf nginx.tar命令查看压缩包内容列表。另外,也要确保 Docker 宿主机有足够的磁盘空间。
Docker 镜像推送
推送镜像是将你本地构建好的镜像上传到远程仓库(一般是dockerhub官网),以便他人或其他机器使用。
-
登录仓库
首先需要使用
docker login命令登录到目标镜像仓库(如 Docker Hub 或你的私有仓库)。1 2 3docker login # 或者指定私有仓库地址 docker login myregistry.example.com执行后会提示输入用户名和密码。如果使用私有仓库,地址需替换为你的仓库地址。
-
标记镜像
在推送之前,必须为本地镜像打上一个符合远程仓库命名规范的标签,格式通常为
[仓库地址]/[用户名或项目名]/[镜像名]:[标签]。当然如果本来就是规范命名就不用改。使用docker tag命令:1 2 3 4# 语法:docker tag 本地镜像名:标签 新标签 docker tag my-app:latest yourusername/my-app:v1.0 # 如果推送到私有仓库,地址可能如下 docker tag my-app:latest myregistry.example.com/yourproject/my-app:prod -
执行推送
使用
docker push命令将标记好的镜像推送到远程仓库。1docker push yourusername/my-app:v1.0推送成功后,就可以在远程仓库的页面上看到这个镜像了。
Docker 拉取镜像
拉取镜像是从远程仓库将镜像下载到本地环境的过程。
-
基本拉取命令
最基础的命令是
docker pull,后面跟上镜像的名称和标签(可选,默认为latest)。1 2 3 4 5 6# 拉取官方Nginx镜像的最新版本 docker pull nginx # 拉取指定标签的镜像 docker pull nginx:1.27.0-perl # 从私有仓库拉取 docker pull myregistry.example.com/yourproject/my-app:prod -
验证拉取结果
拉取完成后,使用
docker images命令可以查看本地已下载的镜像列表,确认镜像是否成功拉取。
Docker镜像拉取失败解决方案
如果docker镜像拉取失败,且报错为连接超时,无法连接,可以采取以下办法。
1.排查DNS
|
|
如果resolv.conf中没有8.8.8.8和8.8.4.4,就添上。
|
|
改完后,ctrl+o保存,再enter确认,最后ctrl+x退出。
此修改在系统重启时会重置,其实也可以永久修改,但是比较麻烦,要拉取的时候修改即可。
2.修改拉取源
|
|
添加国内镜像站:
|
|
改完后,ctrl+o保存,再enter确认,最后ctrl+x退出。
3.重启docker服务
|
|
这个时候再试试拉取,多半成功了。