一、镜像操作

1. 查看现有镜像

首先,你可以使用 docker images 命令查看本地已有的镜像。

docker images

2. 导出镜像

使用 docker save 命令将镜像导出为一个 tar 文件。例如,将 ubuntu 镜像导出为 ubuntu_image.tar

docker save -o ubuntu_image.tar ubuntu:latest

这里,-o 用来指定导出文件的名称,ubuntu 是镜像的名称。

3. 导出多个镜像

如果你需要导出多个镜像,可以在命令中指定多个镜像名。例如:

docker save -o multi_images.tar ubuntu alpine nginx

4. 导出镜像并压缩

如果想直接导出并压缩,可以通过管道将镜像保存到 gzip 文件中。例如:

docker save ubuntu | gzip > ubuntu_image.tar.gz

5. 导出的镜像加载

如果你想将导出的镜像加载到另一台机器上,可以使用 docker load 命令:

docker load -i ubuntu_image.tar

6. 修改镜像名称和标签

使用 docker tag 命令可以修改镜像的标签(tag)或者名称。其语法为:

docker tag <原镜像ID或原镜像名称>:<原标签> <新镜像名称>:<新标签>

例如,如果加载后的镜像名称为 ubuntu,标签为 latest,并且你想把它的标签改为 v1.0,可以使用以下命令:

docker tag ubuntu:latest my_ubuntu:v1.0

如果你不再需要旧的镜像名称或标签,可以使用 docker rmi 命令删除旧的镜像。例如:

docker rmi ubuntu:latest

二、容器操作

1、导出容器

将容器 my_container 导出为 my_container.tar

docker export -o my_container.tar my_container

2、通过导出的文件生成新镜像:

docker import my_container.tar new_image:latest

三、区别

在 Docker 中,docker save 和 docker export 是两个用于导出数据的命令,但它们有不同的用途和特点。以下是两者的区别:


1. 用途不同

  • docker save
    用于导出 镜像(image),包括该镜像的所有层(layers)和元数据(metadata)。可以将镜像移动到其他机器上,再通过 docker load 恢复使用。

  • docker export
    用于导出 容器(container) 的文件系统。不会包含镜像的层信息或元数据,导出后得到的只是一个容器的文件系统快照。

2. 导出内容不同

  • docker save

    • 包含镜像的所有层(Layers)。
    • 包含镜像的元数据,例如标签(tags)和历史信息。
    • 是镜像的完整打包,可以通过 docker load 恢复成一个镜像。
  • docker export

    • 只包含容器运行时的文件系统快照。
    • 不包含镜像的元数据。
    • 导出的内容无法直接恢复成镜像,只能解压使用或通过 docker import 重新生成镜像。

3. 使用场景不同

  • docker save

    • 用于迁移镜像。
    • 通常用来分享镜像或将镜像备份后传输到其他 Docker 主机。
  • docker export

    • 用于备份或提取容器的文件系统。
    • 可以在容器中运行一些配置后,导出容器的文件系统用于进一步的定制或部署。

4. 配套命令不同

  • docker save

    • 导出的文件可以通过 docker load 恢复。
  • docker export

    • 导出的文件可以通过 docker import 转换为镜像,或者直接解压使用。

5. 关键区别总结表格

特性docker savedocker export
作用对象镜像(Image)容器(Container)
包含内容镜像的所有层和元数据容器的文件系统
恢复方式使用 docker load使用 docker import
常见用途镜像备份、迁移容器文件系统快照
是否包含元数据

四、从容器生成新的镜像文件

步骤 1:确认容器正在运行

查看正在运行的容器,确保你已经对目标容器做了需要的修改。

docker ps

假设容器的名称是 my_container

步骤 2:创建新的镜像

使用 docker commit 命令将容器的当前状态保存为一个新的镜像。

docker commit my_container new_image_name:new_tag
  • my_container 是容器名称或 ID。
  • new_image_name:new_tag 是你为新镜像指定的名称和标签。例如:
docker commit my_container my_custom_image:latest

步骤 3:验证新的镜像

运行以下命令查看新生成的镜像:

docker images

在输出中,你应该可以看到名称为 my_custom_image 的新镜像。

步骤 4:保存新镜像(可选)

如果需要导出新镜像为文件,可以使用 docker save 命令:

docker save -o my_custom_image.tar my_custom_image:latest

这个文件可以传输到其他机器,并通过 docker load 恢复。

步骤 5:测试新镜像(可选)

为了确保新镜像正常运行,可以基于新镜像启动一个新的容器:

docker run -it my_custom_image:latest

五、向docker容器中复制文件

1. 使用 docker cp 命令

docker cp 命令可以将主机上的文件或目录复制到容器内部,或者从容器内部复制到主机。

命令语法
docker cp <源路径> <容器名称或ID>:<目标路径>
  • <源路径>:主机上的文件或目录。
  • <容器名称或ID>:目标容器的名称或 ID。
  • <目标路径>:容器内部的目标路径。
示例

将主机上的 example.txt 文件复制到容器的 /app 目录:

docker cp /path/to/example.txt <容器名称或ID>:/app

2. 复制整个目录

如果要复制一个目录到容器内部,可以指定目录路径。

示例

将主机上的 /local/directory 复制到容器的 /container/directory

docker cp /local/directory <容器名称或ID>:/container/directory
  • 如果容器的目标路径不存在,Docker 会自动创建它。
  • 如果目标路径已存在且是目录,文件将被复制到该目录下。

3. 从容器内部复制文件到主机

可以将容器内部的文件或目录复制到主机上。

命令示例

将容器中的 /app/example.txt 复制到主机的 /path/to/ 目录:

docker cp <容器名称或ID>:/app/example.txt /path/to/

4. 在容器内使用文件

如果文件已经复制到容器中,可以进入容器并检查文件:

docker exec -it <容器名称或ID> bash

进入容器后,导航到目标目录并检查文件:

cd /app
ls

5. 注意事项

  1. 容器状态:

    • docker cp 不要求容器处于运行状态,即使容器停止,也可以将文件复制进去或取出来。
  2. 权限问题:

    • 如果复制到容器内部的文件需要特定权限,可以使用以下命令在容器内部调整权限:
chmod 755 /app/example.txt

6. 其他方法:通过 docker exec 和 curl/wget

如果文件较大,或者需要在容器内部直接下载文件,可以使用 docker exec 进入容器并下载文件。

进入容器后使用 wget 或 curl
docker exec -it <容器名称或ID> bash
wget http://example.com/file.txt -O /app/file.txt

六、docker run参数

基础选项

参数作用
--name为容器指定一个名称,便于管理和识别。
--rm容器退出后自动删除,适合短期任务的容器。
-d后台运行容器(即守护模式)。
-it交互式模式启动容器,并附加一个伪终端(适合运行需要交互的程序)。
-a指定容器的标准输入输出内容,选项有 stdinstdoutstderr
--restart设置容器的重启策略(如 noalwayson-failureunless-stopped)。

网络相关选项

参数作用
--network指定容器使用的网络模式(如 bridgehostnone 或自定义网络)。
-p将容器端口映射到主机端口,格式为 主机端口:容器端口
-P自动将容器的所有暴露端口映射到主机的随机端口。
--ip为容器分配指定的 IP 地址(适用于自定义网络)。
--dns设置容器的 DNS 服务器。
--mac-address为容器指定 MAC 地址。
--hostname设置容器的主机名(Hostname)。
--add-host添加自定义主机到容器的 /etc/hosts 文件,例如 myhost:127.0.0.1

存储相关选项

参数作用
-v 或 --volume挂载主机目录或数据卷到容器中,格式为 主机目录:容器目录
--mount更高级的挂载选项,支持多种存储后端和权限设置。
--tmpfs将目录挂载为临时文件系统(仅在容器内存中存在)。
--read-only以只读模式运行容器。
--volume-driver指定容器使用的卷驱动程序。

资源限制选项

参数作用
--cpu-shares为容器分配相对 CPU 份额(权重值)。
--cpus限制容器使用的 CPU 数量(如 1.5 表示 1.5 个核心)。
--memory限制容器的内存使用量(如 512m 或 1g)。
--memory-swap限制内存和交换空间总和的最大值。
--oom-kill-disable禁止在内存不足时杀死容器进程。
--shm-size设置 /dev/shm 的大小(默认 64MB)。
--cpuset-cpus指定容器运行在哪些 CPU 核心上(如 0,1 表示核心 0 和 1)。

环境变量相关选项

参数作用
-e 或 --env设置容器内的环境变量,格式为 KEY=VALUE
--env-file从文件中读取环境变量(每行一个 KEY=VALUE)。
--label为容器添加标签(可用于管理和筛选容器)。

文件系统相关选项

参数作用
--workdir指定容器的工作目录(类似 Linux 的 cd)。
--entrypoint覆盖镜像的默认 ENTRYPOINT

设备与权限相关选项

参数作用
--privileged以特权模式运行容器,允许访问主机的所有设备。
--device将主机设备挂载到容器中,例如 GPU 或 USB。
--cap-add添加容器的特定能力(Capabilities)。
--cap-drop删除容器的特定能力(Capabilities)。
--security-opt配置容器的安全选项。

日志相关选项

参数作用
--log-driver设置容器的日志驱动程序(如 json-filesyslog)。
--log-opt配置日志驱动的选项,例如日志大小限制等。

调试与诊断选项

参数作用
--detach-keys设置退出容器时的键组合(默认是 Ctrl+P Ctrl+Q)。
--init在容器中使用一个初始化程序(如 tini)来处理子进程。
--tty 或 -t为容器分配一个伪终端(TTY)。

其他选项

参数作用
--help显示 docker run 的帮助信息。
--user 或 -u以指定的用户或 UID 运行容器。
--pid设置容器的 PID 隔离模式(如 host)。

Logo

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐