Featured image of post Docker Commands

Docker Commands

Docker命令

Docker 镜像构建

docker build命令是 Docker 引擎的核心命令之一,用于根据 Dockerfile中的指令自动构建 Docker 镜像。

核心概念与基础语法

  • 构建上下文:这是 docker build命令中指定的路径(通常是当前目录 .)。Docker 客户端会将这个路径下的所有文件(递归地)打包发送给 Docker 守护进程,因此只有上下文中的文件才能被 Dockerfile中的 COPYADD指令使用。为了提高效率,建议使用空目录作为上下文,或通过 .dockerignore文件排除不必要的文件
  • Dockerfile:这是一个文本文件,包含了一系列用于构建镜像的指令(如 FROM, RUN, COPY等)。docker build会逐条执行这些指令,每条指令都会创建一个新的镜像层。

基本语法

1
docker build [OPTIONS] PATH | URL | -

其中 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。 适用于自动化脚本,减少输出信息。

工作原理与流程

  1. 发送上下文:Docker 客户端将整个构建上下文目录打包发送给 Docker 守护进程。因此,避免使用根目录 /作为上下文,以免发送大量无用数据。
  2. 逐行执行:守护进程逐条解析并执行 Dockerfile中的指令。
  3. 层缓存机制:每条指令都会生成一个只读的镜像层。Docker 会缓存未改变的层,后续构建时直接使用缓存,从而大幅加速构建过程。控制台输出中的 CACHED标识即表示使用了缓存。
  4. 输出镜像:所有指令执行完毕后,生成最终的镜像。

示例

1
2
3
4
# -t 指定镜像名称,标签默认是latest 
# . 代表上下文默认为当前目录
# 所以要保证dockerfile以及里面要copy和add的文件在当前目录下
docker build -t gpac_cve-2019-20162 .

Docker 容器启动

启动Docker容器有多种方式,具体取决于使用场景和需求。以下是常见的启动容器方法及详细说明:


基本启动命令

使用docker run命令创建并启动一个新容器:

1
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]  /bin/bash
  • 常用选项
    • -d:后台运行(守护态)。
    • -it:交互式终端(如/bin/bash)。
    • --name:指定容器名称。
    • -rm:容器停止后自动删除容器。
    • -p:端口映射(格式:主机端口:容器端口)。一般容器有通信需求会用
    • -v:挂载数据卷。
    • --restart:设置重启策略(如alwaysunless-stopped)。
    • /bin/bash:交互式终端进入工作目录。

示例

1
2
3
4
5
6
7
# 后台启动Nginx并映射端口
docker run -d --name my-nginx -p 8080:80 nginx 
# 挂载目录映射到容器内/testspace目录下
# 并且运行后会进入交互式终端(工作目录下)
docker run -it --rm --name gpac_cve-2019-20162 \
  -v /mnt/d/A.S.E/benchmark-project/gpac:/testspace \
  gpac_cve-2020-23267  /bin/bash

启动已停止的容器

若容器已存在但处于停止状态,使用docker start

1
docker start <容器ID或名称>
  • 可结合-a参数查看输出日志。

进入运行中的容器

  • docker exec(推荐):

    在运行中的容器内启动新终端,退出时容器不会停止:

    1
    
    docker exec -it <容器ID> /bin/bash
    
  • docker attach: 直接进入容器的主进程终端,退出可能导致容器停止。


使用Docker Compose启动多容器

通过docker-compose.yml文件定义服务,一键启动:

1
docker-compose up -d
  • 适用场景:需编排多个关联容器(如Web+数据库)。

后台运行与资源限制

  • 后台运行:添加-d参数。
  • 资源限制:
    • 内存:-m 200M --memory-swap=300M
    • CPU权重:--cpu-shares 512

注意事项

  1. 端口冲突:确保主机端口未被占用。
  2. 数据持久化:使用-v挂载重要数据,避免容器删除后丢失。
  3. 日志排查:启动失败时,通过docker logs <容器ID>查看错误。

Docker 容器/镜像重命名

在Docker中,重命名容器可以通过以下命令和方法实现:


使用docker rename命令

这是最简便的方法,适用于运行中或已停止的容器:

1
docker rename <旧容器名或ID> <新容器名>
  • 示例:

    1
    
    docker rename my_old_container my_new_container
    
  • 注意:

    • 新名称必须唯一,不能与现有容器冲突。
    • 操作不会影响容器内部进程或数据。

停止并重新创建容器

若需保留原容器的配置,可先停止并删除原容器,再以新名称重新创建:

1
2
3
docker stop old_container
docker rm old_container
docker run -d --name new_container [其他选项] <镜像名>
  • 适用场景:需要调整其他参数(如端口、卷)时。

使用Docker Compose

若容器由docker-compose.yml管理,直接修改文件中的服务名称并重启:

1
2
3
services:
  new_name:  # 修改此处
    image: nginx

然后运行:

1
docker-compose up -d
  • 优势:适合多容器编排场景。

常见问题

  • 名称冲突:若新名称已存在,Docker会报错Conflict,需先删除或重名冲突容器。
  • 验证结果:通过docker ps -a确认名称是否更新。

总结

优先使用docker rename快速重命名;复杂需求(如配置变更)可结合停止重建或Compose调整。确保操作前后验证容器状态。

Docker 容器提交为镜像

docker commit命令允许你直接将一个容器的当前状态(包括文件更改、已安装的软件、配置调整等)保存为一个新的 Docker 镜像。它就像给容器拍了一张快照,便于快速保存或分享特定工作状态。

1
docker commit [OPTIONS] [容器名称] [镜像名称:tag]
选项 缩写 功能说明 示例
--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指令拷贝进容器内目录。

1
2
cp [OPTIONS] [源目录] [目的目录]
cp -r /testspace/gpac /workspace
  • 前者为被复制的目录(或文件),后者为要复制到的目录
  • -r /-R:递归复制,用于复制目录和其中所有内容
  • -f:强制覆盖已存在的目标文件
  • -n:不覆盖已经存在的目录

Docker 打包镜像

docker save是一个非常有用的 Docker 命令,它能将你的 Docker 镜像打包成一个独立的归档文件(tar 格式),非常适合用于镜像的备份、迁移或在离线环境中分发

1
2
3
docker save -o [压缩包名称].tar [镜像名称]:[tag]
docker save -o my_apps.tar app:v1.0 db:latest
docker save redis:alpine > redis.tar
  • -o:将指定标签的镜像保存为指定名称的 .tar文件
  • 多个镜像打包:后面可以接好几个镜像一起打包
  • 使用重定向:使用 Shell 重定向操作,效果与 -o相同

Docker 加载镜像

1
2
3
docker load -i [压缩包名称].tar
# 预计输出
Loaded image: [镜像名称]:[tag]

核心功能是:将 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官网),以便他人或其他机器使用。

  1. 登录仓库

    首先需要使用 docker login命令登录到目标镜像仓库(如 Docker Hub 或你的私有仓库)。

    1
    2
    3
    
    docker login
    # 或者指定私有仓库地址
    docker login myregistry.example.com
    

    执行后会提示输入用户名和密码。如果使用私有仓库,地址需替换为你的仓库地址。

  2. 标记镜像

    在推送之前,必须为本地镜像打上一个符合远程仓库命名规范的标签,格式通常为 [仓库地址]/[用户名或项目名]/[镜像名]:[标签]。当然如果本来就是规范命名就不用改。使用 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
    
  3. 执行推送

    使用 docker push命令将标记好的镜像推送到远程仓库。

    1
    
    docker push yourusername/my-app:v1.0
    

    推送成功后,就可以在远程仓库的页面上看到这个镜像了。

Docker 拉取镜像

拉取镜像是从远程仓库将镜像下载到本地环境的过程。

  1. 基本拉取命令

    最基础的命令是 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
    
  2. 验证拉取结果

    拉取完成后,使用 docker images命令可以查看本地已下载的镜像列表,确认镜像是否成功拉取。

Docker镜像拉取失败解决方案

如果docker镜像拉取失败,且报错为连接超时,无法连接,可以采取以下办法。

1.排查DNS

1
sudo nano /etc/resolv.conf

如果resolv.conf中没有8.8.8.8和8.8.4.4,就添上。

1
2
nameserver 8.8.8.8
nameserver 8.8.4.4

改完后,ctrl+o保存,再enter确认,最后ctrl+x退出。

此修改在系统重启时会重置,其实也可以永久修改,但是比较麻烦,要拉取的时候修改即可。

2.修改拉取源

1
sudo nano /etc/docker/daemon.json

添加国内镜像站:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{
    "registry-mirrors": [
        "https://docker.m.daocloud.io",
        "https://dockerproxy.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://docker.nju.edu.cn",
        "https://iju9kaj2.mirror.aliyuncs.com",
        "http://hub-mirror.c.163.com",
        "https://cr.console.aliyun.com",
        "https://hub.docker.com",
        "http://mirrors.ustc.edu.cn"
    ]
}

改完后,ctrl+o保存,再enter确认,最后ctrl+x退出。

3.重启docker服务

1
2
3
4
# 重新load daemon.json
sudo systemctl daemon-reload
# 重启docker服务
sudo systemctl restart docker

这个时候再试试拉取,多半成功了。

Licensed under CC BY-NC-SA 4.0
© 2023-2025 Ch0ser. All Rights Reserved.
使用 Hugo 构建
主题 StackJimmy 设计