在Linux中使用docker【上】(docker、nvidia-docker安装)
在Linux中使用docker【中】(常见命令上)
在Linux中使用docker【下】(常见命令下)
Docker是一个强大的工具神器,它使得应用程序的打包、部署和管理变得更加简单、高效和安全。无论是在开发、测试还是生产环境中,都发挥着重要的作用。
Docker是开源的应用容器引擎,它基于Go语言实现,并依赖于操作系统的机制和特性。Docker的主要目的是让开发者能够打包他们的应用及其依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,实现轻量级虚拟化。这种容器化的应用程序被称为Docker容器,它们通过Docker镜像创建,而这些镜像文件可以存放在私有仓库或共有仓库中。
Docker采用了“写时复制”(copy-on-write)模型,使得修改应用程序变得非常迅速。此外,Docker还支持面向服务的体系结构和微服务架构,提高应用程序的模块化和可维护性。
Docker由PaaS提供商dotCloud开发,作为开源项目发布。它的源代码托管在Github上,并遵从Apache2.0协议。
nvidia-docker命令,就是将docker更换为nvidia-docker
docker logs
用于查看容器的日志输出。通过查看日志,你可以了解应用程序的运行状态、错误消息以及其他重要信息。某些日志可能包含敏感信息,如密码或私钥,因此在共享或存储日志时要格外小心。
使用 docker logs
命令的基本语法如下:
sudo docker logs [容器ID或名称] [选项]
其中,[容器ID或名称]
是你想要查看日志的容器的标识符。[选项]
是可选的,用于定制日志的输出格式和行为。
下面是一些常用的 docker logs
选项:
-f
或 --follow
: 实时追踪日志输出,即随着新日志的产生而持续显示。--since
: 显示自某个时间戳之后的日志。--until
: 显示直到某个时间戳之前的日志。--tail
: 仅显示最后几条日志(默认为最后几行)。--timestamps
: 显示每条日志的时间戳。例如,要实时查看名为 my-container
的容器的日志输出,你可以运行:
sudo docker logs -f my-container
如果你只想查看最后10行的日志,你可以使用:
sudo docker logs --tail 10 my-container
请注意,如果容器没有运行,docker logs
命令将无法输出日志。
docker inspect
用于查看容器的详细信息。docker inspect
命令返回格式为JSON对象。
注意,docker inspect
返回的信息非常详细,并且通常是用于调试或了解容器内部情况的,可能需要保密。
下面是查看指定容器信息的命令格式:
sudo docker inspect [容器ID或名称]
例如,如果你有一个名为 my-container
的容器,并且你想查看它的详细信息,你可以运行:
sudo docker inspect my-container
如果你只有容器的ID,比如 abcd1234
, 你也可以这样使用:
sudo docker inspect abcd1234
docker inspect
命令的参数说明如下:
--format
, -f
:指定返回值的模板文件。你可以使用 Go 模板语言来格式化输出。例如,docker inspect --format='{{.NetworkSettings.IPAddress}}'
会返回容器的 IP 地址。
--size
, -s
:当检查容器时,显示文件总的大小。这会显示容器占用的磁盘空间大小。
--type
:为指定类型返回 JSON。例如,docker inspect --type container
会以 JSON 格式返回容器的信息。
ID
或 NAME
:这是你想要检查的容器、镜像、卷、网络或插件的标识符。
此外,docker inspect
还可以接受多个标识符,用于一次性检查多个对象。
使用 docker inspect
参数的例子:
获取容器的 IP 地址:
sudo docker inspect --format='{{.NetworkSettings.IPAddress}}' <container>
获取容器的大小:
sudo docker inspect --size <container>
获取 信息:
sudo docker inspect --type container <container>
获取多个容器的详细信息:
sudo docker inspect <container1> <container2>
当对一个容器做了修改或者配置之后,想要保存这些更改作为一个新的镜像以便将来使用时,就可以使用 docker commit
。
docker commit
会保存原始容器的文件系统、配置、历史记录以及你在容器中所做的任何更改,而不会保存容器的运行状态(如网络、进程等)。【类似于批处理脚本】
命令的基本格式如下:
sudo docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
其中,[OPTIONS]
是可选的参数,CONTAINER
是要提交为镜像的容器的名称或 ID,[REPOSITORY[:TAG]]
是新镜像的名称和标签(可选)。
例如,假设有一个正在运行的容器,它的 ID 是 abcd1234
,想要将这个容器的当前状态保存为一个新的镜像,并命名为 my-new-image
,可以运行:
sudo docker commit abcd1234 my-new-image
如果还想为这个新镜像指定一个标签,比如 v1.0
,你可以这样运行:
sudo docker commit abcd1234 my-new-image:v1.0
要将 Docker 容器导出为一个文件,可以使用 docker export
命令。export
命令不会保存容器的配置和历史记录。
这个命令可以导出一个已经创建的容器到一个文件,无论容器当前处于什么状态。【类似于快照】
命令的基本格式如下:
sudo docker export [OPTIONS] CONTAINER
其中,[OPTIONS]
是可选的参数,CONTAINER
是你想要导出的容器的名称或 ID。
下面是一些常用的选项:
-o
, --output
:指定导出的文件名。如果你不提供这个选项,Docker 会将导出的内容输出到标准输出(stdout)。例如,要将名为 my-container
的容器导出到一个名为 exportedContainer.tar
的文件中,可以运行:
sudo docker export -o ExportedContainer.tar my-container
或者,如果想要将导出的内容直接保存到标准输出,并将其重定向到一个文件,可以运行:
sudo docker export my-container > ExportedContainer.tar
导出的文件将是一个 tar 归档文件,其中包含了容器文件系统的内容。
注意,docker export
命令导出的文件不包含容器的运行时状态,如网络配置、环境变量等。
docker import
命令用于从文件系统的归档文件(如 tar 文件)或标准输入中创建 Docker 镜像。
这通常在将一个容器导出后的文件,再次导入为一个新的 Docker 镜像时使用。
以下是 docker import
命令的基本用法和步骤:
基本语法
sudo docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
参数说明
[OPTIONS]
:可选参数,如 -c
或 --change
用于在导入时应用更改。file|URL|-
:导入的源文件或 URL,或者是标准输入(-
)。[REPOSITORY[:TAG]]
:目标镜像的仓库名称和标签。如果不指定,默认为 :
。使用示例
如果你有一个通过 docker export
命令导出的 tar 文件,你可以使用以下命令将其导入为一个新的 Docker 镜像:
sudo docker import my_container_export.tar my_new_image:1.1.0
这将创建一个名为 my_new_image
的新镜像,tag
为1.1.0,其内容来自 my_container_export.tar
文件。
你也可以从标准输入中导入内容,例如从另一个命令的输出中导入:
sudo cat my_container_export.tar | docker import - my_new_image
使用 -c
或 --change
参数,你可以在导入时指定对镜像文件系统进行更改。例如,你可以在导入时设置环境变量:
sudo docker import -c 'ENV DEBUG=true' my_container_export.tar my_new_image
注意事项
REPOSITORY[:TAG]
来添加标签。docker save
命令提供了一种将 Docker 镜像以 tar 归档文件的形式保存到本地文件系统中的方法,这对于备份、迁移或在不同环境间共享镜像非常有用。
基本语法
sudo docker save [OPTIONS] IMAGE [IMAGE...]
参数说明
[OPTIONS]
:可选参数。
-o, --output
:指定输出文件的名称和路径。IMAGE [IMAGE...]
:一个或多个要保存的 Docker 镜像的名称或 ID。使用示例
保存名为 my_image
的镜像到当前目录,输出文件名为 my_image.tar
:
sudo docker save my_image
或者,使用 -o
参数指定输出文件名:
sudo docker save -o my_image.tar my_image
保存多个镜像 image1
和 image2
到当前目录,输出文件名分别为 image1.tar
和 image2.tar
:
sudo docker save -o image1.tar image1 -o image2.tar image2
或者,你也可以一次性保存多个镜像到一个 tar 文件中:
sudo docker save image1 image2 > images.tar
注意事项
-o
参数,docker save
会将镜像保存到当前目录下,并且默认的文件名是 .tar
。docker load
命令导入,从而恢复为 Docker 镜像。docker load
是一个 Docker 命令,用于将一个本地的 Docker 镜像文件加载(或导入)到 Docker 引擎中。
这个命令通常用于恢复从 docker save
命令导出的 Docker 镜像,或者用于加载从其他环境迁移过来的镜像文件。
基本语法
sudo docker load [OPTIONS]
参数说明
[OPTIONS]
:可选参数。
-i, --input
:指定输入文件的名称和路径。如果省略此选项,命令将从标准输入(stdin)读取数据。--quiet, -q
:不显示加载过程的输出信息。使用示例
加载名为 my_image.tar
的镜像文件:
sudo docker load < my_image.tar
或者,使用 -i
参数指定输入文件:
sudo docker load -i my_image.tar
如果你正在使用管道或重定向来提供镜像文件的内容,你可以省略 -i
参数:
sudo cat my_image.tar | docker load
注意事项
docker load
会加载镜像文件中的所有图层,并构建成一个完整的 Docker 镜像。docker tag
命令为镜像添加标记(tag)以便于管理和识别。docker load
会导致冲突。为了避免这种情况,你可以先删除现有的镜像,或者为加载的镜像指定一个不同的名称或标签。docker rm
命令用于删除一个或多个已经停止的 Docker 容器。使用此命令时,需要指定要删除的容器的 ID 或名称。
如果尝试删除一个正在运行的容器,docker rm
默认会拒绝执行,并显示一个错误消息。
基本语法
sudo docker rm [OPTIONS] CONTAINER [CONTAINER...]
选项(OPTIONS)
-f, --force
:强制删除一个正在运行的容器(谨慎使用,这可能会导致数据丢失)。-v, --volumes
:删除容器时,同时删除容器挂载的卷。使用示例
如果已经知道了容器的 ID 或名称,可以直接使用 docker rm
命令删除它。
sudo docker rm my_container
可以一次性删除多个容器,只需在命令后面跟上多个容器 ID 或名称。
sudo docker rm container1 container2 container3
如果确定要删除一个正在运行的容器,并愿意接受可能的数据丢失风险,可以使用 --force
或 -f
选项。
sudo docker rm -f running_container
如果想在删除容器的同时删除容器挂载的卷,可以使用 --volumes
或 -v
选项。
sudo docker rm -v my_container
注意事项
--volumes
选项会删除容器挂载的所有卷,这可能会导致数据丢失,所以在使用此选项时要特别小心。如果只想删除已停止的容器,可以结合使用 docker ps -a -q
命令来获取所有已停止容器的 ID,并将这些 ID 作为 docker rm
命令的输入。
# 删除所有已停止的容器
sudo docker rm $(docker ps -a -q)
# 删除所有容器(含正在运行的容器)
sudo docker rm -f $(docker ps -a)
docker rmi
是 Docker 的一个命令,用于删除本地的一个或多个 Docker 镜像。
其基本语法为 docker rmi [OPTIONS] IMAGE [IMAGE...]
。其中,[OPTIONS]
表示可选项,而 IMAGE [IMAGE...]
表示要删除的镜像的名称或ID。
以下是关于 docker rmi
命令的一些详细解释和示例:
可选项(OPTIONS):
-f
或 --force
:强制删除镜像,即使它正在被使用或有关联的容器。--no-prune
:不移除该镜像的过程镜像(即不被标记的父镜像)。默认情况下,这些镜像会被移除。示例:
强制删除名为 runoob/ubuntu:v4
的本地镜像:
sudo docker rmi -f runoob/ubuntu:v4
删除多个本地镜像,例如 centos:centos7
和 ubuntu:latest
:
sudo docker rmi centos:centos7 ubuntu:latest
may the odds be ever in your favor ~