当前位置: 首页 > news >正文

一篇复现Docker镜像操作与容器操作

华子目录

  • Docker镜像操作
    • 创建镜像
      • 方式1docker commit
        • 示例
      • 方式2docker import
        • 示例1:从本地文件系统导入
        • 示例2:从远程URL导入
        • 注意事项
      • 方式3docker build
        • 示例1:构建镜像并指定名称和标签
        • 示例2:使用自定义的 Dockerfile 路径构建镜像
        • 示例3:构建时传递参数给 Dockerfile
        • 注意事项
    • 搜索仓库镜像docker search
    • 查看正在运行的容器docker ps
    • 获取镜像docker pull
      • docker tag
      • docker history
    • 上传镜像docker push
      • 示例
      • 注意事项
    • 镜像体积SIZE
    • 虚悬镜像
    • 导出镜像docker image save
    • 删除镜像docker image rm
      • 注意
    • 导入镜像docker image load
    • 查看镜像的详细信息docker image inspect
  • Docker容器操作
    • 启动容器
      • 方法1
        • 示例
        • 常用选项
        • 注意
      • 方式2(不推荐)
        • 注意
    • 删除容器
      • 删除单个容器
      • 删除多个容器
      • 删除所有容器(包括正在运行的)
      • 清除所有处于关闭状态的容器
      • 注意事项
      • 查看容器列表
    • 查看容器运行状态
    • 停止运行的容器docker stop/kill
    • 激活关闭的容器docker start/restart
      • 示例
      • 注意事项
    • 查看容器
      • 查看容器的详细信息docker container inspect
      • 查看容器内的进程docker top
        • 示例
        • 注意事项
      • docker stats
    • 在window上访问Linux中运行的nginx容器
    • 查询容器内部日志docker logs
      • 示例
        • 示例1:查看容器的日志
        • 示例2:实时查看容器的日志
        • 示例3:查看容器的日志并限制输出行数
        • 示例4:查看容器的日志并显示时间戳
      • 注意事项
    • docker wait
      • 使用示例
      • 注意事项
    • 进入容器docker exec
      • 常用选项
      • 示例
    • 导出容器docker export
      • 选项
      • 使用示例
      • 注意事项
    • 导入容器docker import
      • 示例
        • 示例1:从本地文件系统导入
        • 示例2:从远程URL导入
      • 注意事项
    • 查看容器的IP地址
    • 查看容器中的环境变量
    • 其他容器命令
      • docker rename
      • docker cp
      • docker diff
      • docker port
      • docker update

Docker镜像操作

创建镜像

方式1docker commit

docker commit 命令用于基于一个已存在的 Docker 容器来创建一个新的 Docker 镜像。当你修改了正在运行的容器(例如,在容器中安装了新的软件包或更改了配置文件),并希望保存这些更改为一个新的镜像时,你可以使用 docker commit 命令。

命令的基本语法如下:

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

其中:

  • OPTIONS 是可选参数,用于配置 commit 的行为。

    • -a--author:设置新镜像的作者。
    • -c--change:应用 Dockerfile 指令来创建镜像。
    • -m--message:设置 commit 时的说明信息。
    • -p--pause:在 commit 时,将容器暂停。这有助于减少在创建提交过程中遇到数据损坏的可能性。
  • CONTAINER 是你要基于其创建新镜像的容器的名称或 ID。

  • REPOSITORY[:TAG] 是新镜像的仓库名和标签。如果不指定标签,Docker 会使用默认的 latest 标签。

示例

假设你有一个正在运行的容器,ID 为 c162we1ycy2k,你想将这个容器保存为一个新的镜像,并命名为 exp_mysql,标签为 v1,同时添加提交人信息为 test_exp 和说明信息为 test apache,你可以执行以下命令:

docker commit -a "test_exp" -m "test apache" c162we1ycy2k exp_mysql:v1

执行这个命令后,Docker 会基于 c162we1ycy2k 容器创建一个新的镜像,名为 exp_mysql,标签为 v1,并且带有指定的作者和说明信息。

需要注意的是,使用 docker commit 创建的镜像通常不如使用 Dockerfile 创建的镜像透明和可维护。Dockerfile 提供了更清晰的镜像构建历史和可重复性。然而,在某些情况下,如容器被入侵后需要保存现场,docker commit 可能是一个有用的工具。在常规的应用开发和部署过程中,推荐使用 Dockerfile 来构建和管理镜像。

方式2docker import

docker import 命令用于将本地文件系统上的文件或目录,或者从远程URL导入为Docker镜像。

其基本语法如下:

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

参数说明:

  • OPTIONS:可选参数,用于配置导入操作的一些选项。
  • file|URL|-必需参数,指定要导入的文件路径或URL。可以是一个文件路径,也可以是一个URL,或者使用-表示从标准输入中读取tar归档文件。
  • REPOSITORY:可选参数,指定要创建的新镜像的名称。
  • TAG:可选参数,指定要创建的新镜像的标签。
示例1:从本地文件系统导入

假设我们有一个名为example.tar的tar归档文件,它包含了我们想要导入的文件系统。我们可以使用docker import命令来创建一个新的镜像:

docker import example.tar myimage:1.0

这将会将example.tar中的文件系统导入到myimage:1.0镜像中。之后,我们可以使用docker run命令来运行这个新建的容器。

示例2:从远程URL导入

如果我们想要从一个远程URL导入文件系统,我们可以直接将URL作为参数传递给docker import命令:

docker import http://example.com/path/to/image.tar myimage:1.0

这将会将远程URL中的文件系统导入到myimage:1.0镜像中。

注意事项

如果在使用docker import命令时遇到无法启动容器的问题,可能的原因包括导入的文件或URL中缺少依赖项或配置文件,或者与宿主机环境不兼容等。这时,需要检查导入的文件或URL是否包含所需的依赖项和配置文件,以及宿主机环境是否与导入的镜像兼容。如果以上方法都无法解决问题,可以尝试重新导入镜像。

请注意,docker import命令创建的镜像可能不如使用Dockerfile创建的镜像透明和可维护。在可能的情况下,推荐使用Dockerfile来构建和管理镜像。

方式3docker build

docker build 命令用于使用 Dockerfile 来创建 Docker 镜像。Dockerfile 是一个文本文件,其中包含了一系列指令,这些指令描述了如何构建一个 Docker 镜像。通过执行 docker build 命令并指定 Dockerfile 所在的目录,Docker 会按照 Dockerfile 中的指令逐步构建出一个新的镜像。

基本语法如下:

docker build [OPTIONS] PATH | URL | -

其中:

  • OPTIONS 是可选参数,用于配置构建过程的行为。例如,--tag-t 用于指定镜像的名称和标签。
  • PATHDockerfile 所在的目录路径Docker 会在该目录下查找名为 Dockerfile(默认的文件名,除非使用 -f 参数指定了其他文件名)的文件,并按照其中的指令构建镜像。
  • URL 是 Git 仓库的 URL如果 Dockerfile 位于远程 Git 仓库中,可以通过这个 URL 直接构建。
  • - 表示从标准输入(stdin)读取 Dockerfile 内容,这通常与管道操作符 | 结合使用,以便从其他命令的输出中直接构建镜像。
示例1:构建镜像并指定名称和标签
docker build -t myimage:latest .

这条命令会在当前目录(. 表示当前目录)下查找 Dockerfile,并按照其中的指令构建一个新的镜像,镜像的名称为 myimage,标签为 latest

示例2:使用自定义的 Dockerfile 路径构建镜像
docker build -t myimage:custom -f path/to/my/Dockerfile .

在这个例子中,-f 参数用于指定 Dockerfile 的路径为 path/to/my/Dockerfile,而不是默认的 Dockerfile。构建出的镜像名称和标签分别为 myimagecustom

示例3:构建时传递参数给 Dockerfile
docker build --build-arg USER=johndoe --build-arg UID=1000 -t myimage:withargs .

在这个例子中,--build-arg 参数用于传递构建参数给 Dockerfile 中的指令。在 Dockerfile 中,可以使用 ${USER}${UID} 的方式来引用这些参数。

注意事项
  • Dockerfile 中的指令必须按照正确的顺序和语法编写,否则构建过程可能会失败。
  • 在构建过程中,Docker 会根据 Dockerfile 中的指令创建临时的容器,执行相应的命令,并生成镜像分层。最终,所有命令执行完毕后,会生成一个新的镜像。
  • 优化 Dockerfile 可以减少最终生成的镜像大小,提高构建效率。例如,尽量合并多个命令到一个命令中,避免不必要的中间层。

总之,docker build 命令是 Docker 中用于构建镜像的重要工具,通过合理使用 Dockerfile 和构建参数,可以高效地创建符合需求的 Docker 镜像。

搜索仓库镜像docker search

  • docker search nginx 是一个 Docker 命令,用于在 Docker Hub 或其他配置的 Docker 镜像仓库中搜索名为 “nginx” 的镜像。当你执行这个命令时,Docker 会向配置的仓库发送搜索请求并返回与 “nginx” 相关的镜像列表。

  • 搜索结果通常包括:

    • NAME:镜像的名称。
    • DESCRIPTION:镜像的描述信息。
    • STARS:镜像的星标数量,反映了镜像的受欢迎程度。
    • OFFICIAL:是否是官方镜像的标志。
[root@server ~]# docker search nginx
NAME                               DESCRIPTION                                      STARS     OFFICIAL
nginx                              Official build of Nginx.                         19721     [OK]
unit                               Official build of NGINX Unit: Universal Web …   25        [OK]
nginx/nginx-ingress                NGINX and  NGINX Plus Ingress Controllers fo…   89
nginxinc/nginx-unprivileged        Unprivileged NGINX Dockerfiles                   144
nginx/nginx-prometheus-exporter    NGINX Prometheus Exporter for NGINX and NGIN…   39
nginxinc/nginx-s3-gateway          Authenticating and caching gateway based on …   6
nginx/unit                         This repository is retired, use the Docker o…   64
nginx/nginx-ingress-operator       NGINX Ingress Operator for NGINX and NGINX P…   2
nginxinc/amplify-agent             NGINX Amplify Agent docker repository            1
nginx/nginx-quic-qns               NGINX QUIC interop                               1
nginxinc/ingress-demo              Ingress Demo                                     4
nginxproxy/nginx-proxy             Automated nginx proxy for Docker containers …   132
nginxproxy/acme-companion          Automated ACME SSL certificate generation fo…   131
bitnami/nginx                      Bitnami nginx Docker Image                       184
bitnami/nginx-ingress-controller   Bitnami Docker Image for NGINX Ingress Contr…   32
nginxinc/nginmesh_proxy_debug                                                       0
ubuntu/nginx                       Nginx, a high-performance reverse proxy & we…   112
nginxproxy/docker-gen              Generate files from docker container meta-da…   16
nginxinc/mra-fakes3                                                                 0
kasmweb/nginx                      An Nginx image based off nginx:alpine and in…   7
nginxinc/mra_python_base                                                            0
nginxinc/ngx-rust-tool                                                              0
nginxinc/nginmesh_proxy_init                                                        0
rancher/nginx-ingress-controller                                                    12

查看正在运行的容器docker ps

[root@server ~]# docker ps #列出正在运行的容器[root@server ~]# docker ps -a  #列出正在运行和未运行的容器

获取镜像docker pull

  • Docker Hub上有大量的高质量的镜像可以用,从Docker镜像仓库获取镜像的命令是docker pull,其命令格式为:
[root@server ~]# docker pull [options] [域名[:端口号]/]仓库名[:TAG标签]options:   #拉取时,options一般不写-a   下载存储库中的所有标记图像-q    抑制冗长输出#如果不指定TAG标签, 则默认会选择latest标签,这样会下载仓库中最新版本的镜像。
[root@server ~]# docker pull nginx
Using default tag: latest   #默认拉取最新版本
latest: Pulling from library/nginx
8a1e25ce7c4f: Pull complete
e78b137be355: Pull complete
39fc875bd2b2: Pull complete
035788421403: Pull complete
87c3fb37cbf2: Pull complete
c5cdd1ce752d: Pull complete
33952c599532: Pull complete
Digest: sha256:6db391d1c0cfb30588ba0bf72ea999404f2764febf0f1f196acd5867ac7efa7e
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest[root@server ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    92b11f67642b   5 weeks ago   187MB[root@server ~]# docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    92b11f67642b   5 weeks ago   187MB
[root@server ~]# docker pull nginx:1.14
1.14: Pulling from library/nginx  #拉取1.14版本
27833a3ba0a5: Pull complete
0f23e58bd0b7: Pull complete
8ca774778e85: Pull complete
Digest: sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d
Status: Downloaded newer image for nginx:1.14
docker.io/library/nginx:1.14
[root@server ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    92b11f67642b   5 weeks ago   187MB
nginx        1.14      295c7be07902   4 years ago   109MB

docker tag

docker tag 命令添加的标签实际上起到了类似于软链接的作用

[root@server ~]# docker tag nginx:1.14 test/nginx:v1
[root@server ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    92b11f67642b   5 weeks ago   187MB
nginx        1.14      295c7be07902   4 years ago   109MB
test/nginx   v1        295c7be07902   4 years ago   109MB
#这里我们可以看到nginx:1.14和test/nginx:v1的镜像ID号是一致的[root@server ~]# docker image ls nginx
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    92b11f67642b   5 weeks ago   187MB
nginx        1.14      295c7be07902   4 years ago   109MB
  • docker tag nginx:1.14 test/nginx:v1 命令用于给已有的 Docker 镜像添加一个新的标签。在这个例子中,你正在给 nginx:1.14 镜像添加一个新的标签 test/nginx:v1。

  • 具体来说:

    • nginx:1.14 是源镜像的名称和标签。这通常意味着你有一个名为 nginx,标签为 1.14 的镜像在本地。
    • test/nginx:v1 是目标镜像的名称和标签。其中 test 是新的镜像仓库名,nginx 是镜像名,v1 是新的标签。
  • 执行这个命令后,nginx:1.14 镜像仍然存在于本地,并且你还会有一个新的标签 test/nginx:v1 指向相同的镜像。这意味着你可以通过这两个标签中的任何一个来运行或推送镜像。

  • 这个命令通常在你想要重新组织本地镜像库,或者准备将镜像推送到一个自定义的 Docker 仓库时使用。例如,如果你有一个私有的 Docker 仓库,并且你想要将本地的 nginx:1.14 镜像推送到这个仓库,你可能需要先给它加上一个符合你私有仓库命名规范的标签。

  • 在执行 docker tag 命令之后,你可以使用 docker images 来查看本地所有的镜像及其标签,确保新的标签已经被添加。

  • 如果之后你想要将这个新标签的镜像推送到远程仓库,你可以使用 docker push 命令,如下所示:

[root@server ~]# docker push test/nginx:v1

在执行这个命令之前,你需要确保已经登录到了对应的远程 Docker 仓库(使用 docker login 命令),并且你有权限向该仓库推送镜像。

docker history

列出镜像的各分层

[root@server ~]# docker history nginx:1.14  #查看该镜像的层数
IMAGE          CREATED       CREATED BY                                       SIZE      COMMENT
295c7be07902   4 years ago   /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon…   0B
<missing>      4 years ago   /bin/sh -c #(nop)  STOPSIGNAL SIGTERM            0B
<missing>      4 years ago   /bin/sh -c #(nop)  EXPOSE 80                     0B
<missing>      4 years ago   /bin/sh -c ln -sf /dev/stdout /var/log/nginx…   22B
<missing>      4 years ago   /bin/sh -c set -x  && apt-get update  && apt…   53.8MB
<missing>      4 years ago   /bin/sh -c #(nop)  ENV NJS_VERSION=1.14.2.0.…   0B
<missing>      4 years ago   /bin/sh -c #(nop)  ENV NGINX_VERSION=1.14.2-…   0B
<missing>      4 years ago   /bin/sh -c #(nop)  LABEL maintainer=NGINX Do…   0B
<missing>      4 years ago   /bin/sh -c #(nop)  CMD ["bash"]                  0B
<missing>      4 years ago   /bin/sh -c #(nop) ADD file:4fc310c0cb879c876…   55.3MB

docker history nginx:1.14 命令用于显示 Docker 镜像 nginx:1.14 的构建历史。执行这个命令后,你会看到一个包含镜像各层的列表每一层都记录了创建时的命令以及该层的大小。

输出可能类似于以下内容:

IMAGE           CREATED             CREATED BY                                      SIZE                COMMENT
...             ...                 ...                                           ...                 ...
<missing>       months ago          /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon o...   0B                
<missing>       months ago          /bin/sh -c #(nop)  STOPSIGNAL SIGTERM         0B                
<missing>       months ago          /bin/sh -c #(nop)  EXPOSE 80/tcp              0B                
<missing>       months ago          /bin/sh -c ln -sf /dev/stdout /var/log/nginx...   22B               
<missing>       months ago          /bin/sh -c set -x     && addgroup --system --...   57.2MB            
<missing>       months ago          /bin/sh -c #(nop)  ENV NGINX_VERSION=1.14.2    0B                
<missing>       months ago          /bin/sh -c #(nop)  LABEL maintainer=NGINX Do...   0B                
<missing>       months ago          /bin/sh -c #(nop)  CMD ["bash"]                0B                
<missing>       months ago          /bin/sh -c #(nop) ADD file:15139a917863c048...   69.1MB            

在输出中:

  • IMAGE 列显示的是每一层的 ID。
  • CREATED 列显示了该层创建的时间。
  • CREATED BY 列显示了创建该层时执行的 Dockerfile 指令。
  • SIZE 列显示了该层的大小。
  • COMMENT 列通常用于记录额外的信息,但在这个例子中没有使用。

注意,有些层的 CREATED 列可能显示为 <missing>,这通常意味着这些层是在构建基础镜像时创建的,而不是在构建 nginx:1.14 镜像时直接添加的。

上传镜像docker push

docker push 命令用于将本地的 Docker 镜像推送到 Docker 镜像仓库中,可以是 Docker Hub 这样的公共仓库,也可以是自托管的私有仓库。在推送镜像之前,你需要先使用 docker login 命令登录到目标仓库。

基本语法如下:

docker push [OPTIONS] NAME[:TAG]

其中:

  • [OPTIONS] 是可选参数,用于配置推送操作的一些选项。
  • NAME 是要推送的镜像的名称。
  • TAG 是可选的镜像标签,用于指定要推送的镜像版本。如果省略标签,Docker 会默认使用 latest 标签。

推送镜像时,Docker 会将镜像拆分成多个层(layer),并逐一上传到仓库中。在上传过程中,Docker 会显示进度条以及每层的大小信息。请注意,进度条显示的是未压缩的层大小,实际的上传数据在发送前会被压缩,因此上传的大小可能不会与进度条完全匹配。

示例

假设你已经登录到了一个 Docker 仓库,并且有一个名为 myimage 的本地镜像,你可以使用以下命令将其推送到仓库中:

docker push myimage:v1.0

这条命令会将标签为 v1.0myimage 镜像推送到你登录的 Docker 仓库中。

注意事项

  • 在推送镜像之前,请确保你已经登录到了目标 Docker 仓库,并且拥有足够的权限来推送镜像。
  • 如果遇到推送失败的情况,可能是由于网络连接问题、仓库权限问题、镜像名称或标签格式不正确等原因。你可以根据错误信息来排查问题。
  • 在推送镜像时,最好加上明确的标签,以便在后续使用时能够区分不同的镜像版本。

总之,docker push 命令是 Docker 中用于将本地镜像推送到远程仓库的重要工具,通过它可以实现镜像的共享和分发。

镜像体积SIZE

[root@server ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    92b11f67642b   5 weeks ago   187MB
nginx        1.14      295c7be07902   4 years ago   109MB
test/nginx   v1        295c7be07902   4 years ago   109MB
  • 这里标识的所占用空间和在Docker Hub上看到的镜像大小不同Docker Hub中显示的体积是压缩后的体积。在镜像下载和上传过程中镜像是保持着压缩状态的,因此 Docker Hub 所显示的大小是网络传输中更关心的流量大小。而docker images显示的是镜像下载到本地后展开的大小,准确说,是展开后的各层所占空间的总和,因为镜像到本地后,查看空间的时候, 更关心的是本地磁盘空间占用的大小。
  • 另外一个需要注意的问题是docker images
    列表中的镜像体积总和并非是所有镜像实际硬盘消耗由于 Docker 镜像是多层存储结构,并且可以继承、复用,因此不同镜像可能会因为使用相同的基础镜像,从而拥有共同的层由于 Docker 使用 UnionFs,相同的层只需要保存一份即可因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多。

虚悬镜像

如果docker images查看镜像的显示结果中出现了没有仓库名,也没有标签,均为<none>的镜像,旧的镜像上的这个名称则被取消,从而成为了<none>。除了 docker pull 可能导致这种情况, docker build 也同样可以导致这种现象。 由于新旧镜像同名旧镜像名称被取消,从而出现仓库名、标签均为<one>的镜像这类无标签镜像也被称为虛悬镜像(danglingimage),可以用下面的命令专门显示这类镜像:

#查看虚悬镜像
[root@server ~]# docker images -f dangling=true 
  • 一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的,可以用下面的命令删除:
#清空虚悬镜像
[root@server ~]# docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
#显示包括中间层镜像在内的所有镜像
[root@server ~]# docker images -a
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    92b11f67642b   5 weeks ago   187MB
nginx        1.14      295c7be07902   4 years ago   109MB
test/nginx   v1        295c7be07902   4 years ago   109MB

在这里插入图片描述

导出镜像docker image save

  • 或者使用docker save

docker image save 是一个 Docker CLI 命令,用于将指定的 Docker 镜像打包成一个 .tar 文件, 并保存到本地计算机上。这样, 你就可以在没有该Docker 环境的机器上导入和运行这个镜像,或者将其备份以供将来使用。

该命令的语法如下:

docker image save [OPTIONS] IMAGE [IMAGE...]

其中,OPTIONS 可以包括:

  • -o, --output:指定输出文件名。
  • --quiet, -q:仅显示镜像ID。

例如,要将名为 myimage 的 Docker 镜像保存到名为 myimage.tar 的文件中,你可以运行以下命令:

docker image save -o myimage.tar myimage

你也可以在同一命令中指定多个镜像名称以将它们一起保存到归档文件中。例如:

docker image save -o multiple-images.tar image1 image2 image3

这将把 image1image2image3 这三个镜像一起打包到 multiple-images.tar 文件中。

总之,docker image save 命令提供了一种方便的方式来备份和传输 Docker 镜像,是 Docker 管理中的重要工具之一。

[root@server ~]# docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       latest    ca2b0f26964c   3 weeks ago   77.9MB
nginx        latest    92b11f67642b   5 weeks ago   187MB
nginx        1.14      295c7be07902   4 years ago   109MB
test/nginx   v1        295c7be07902   4 years ago   109MB[root@server ~]# docker image save ubuntu.tar.gz ubuntu  #执行错误原因:没有-o或重定向
cowardly refusing to save to a terminal. Use the -o flag or redirect[root@server ~]# docker image save ubuntu > ubuntu.tar.gz  #使用重定向
[root@server ~]# ll
-rw-r--r--  1 root root 80425472  324 11:33 ubuntu.tar.gz[root@server ~]# docker image save -o nginx.tar.gz nginx #使用-o
[root@server ~]# ll -h  #由文件大小,我们可以看到,他把上面两个名为nginx的镜像都打包了
总用量 367M
-rw-------  1 root root 290M  324 11:36 nginx.tar.gz
-rw-r--r--  1 root root  77M  324 11:33 ubuntu.tar.gz[root@server ~]# docker image save -o docker-nginx.gz nginx:1.14 #打包1.14版本的nginx
[root@server ~]# ll -h
总用量 475M
-rw-------  1 root root 108M  324 11:37 docker-nginx.gz
-rw-------  1 root root 290M  324 11:36 nginx.tar.gz
-rw-r--r--  1 root root  77M  324 11:33 ubuntu.tar.gz
#使用docker save
[root@server ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
ubuntu       latest    ca2b0f26964c   3 weeks ago    77.9MB
nginx        latest    92b11f67642b   5 weeks ago    187MB
mysql        latest    019814493c7a   2 months ago   632MB
[root@server ~]# docker save -o mysql.tar.gz mysql
[root@server ~]# ll -h
总用量 1.1G
-rw-------  1 root root 108M  324 11:37 docker-nginx.gz
-rw-------  1 root root 619M  324 12:25 mysql.tar.gz
-rw-------  1 root root 290M  324 11:36 nginx.tar.gz
-rw-r--r--  1 root root  77M  324 11:33 ubuntu.tar.gz

删除镜像docker image rm

删除Docker镜像的方法有多种,以下是一些常见的操作:

  1. 使用镜像ID或镜像名进行删除:

    • docker rmi [镜像ID]
    • docker rmi [镜像名:标签]

    请注意,如果镜像正在被容器使用,你需要先删除容器才能删除镜像。

  2. 强制删除镜像:
    当Docker因为某种原因无法删除某个镜像时,可以使用-f选项来强制删除。

    • docker rmi -f [镜像ID或镜像名]
  3. 删除所有未使用的镜像:
    使用docker image prune命令可以清理所有未被容器引用的镜像。

    • docker image prune
  4. 删除所有镜像(包括正在使用的):
    这是一个较为危险的操作,因为它会删除所有镜像,包括那些正在被容器使用的镜像。

    • docker rmi $(docker images -q)
  5. 批量删除特定时间前的镜像:
    使用过滤器可以删除所有创建时间超过特定时长的镜像。

    • docker image prune -a --filter "until=168h"
      上面的命令会删除所有创建时间超过168小时(7天)的镜像。
  6. 清理虚悬镜像:
    虚悬镜像通常是构建过程中留下的,没有标签的镜像。可以使用docker image prune命令进行清理。

    • docker image prune
  7. 查看Docker镜像、容器和卷:
    在删除之前,建议首先查看当前系统中存在的Docker镜像、容器和卷,以避免误删。

    • 使用docker images查看镜像列表。
    • 使用docker ps查看正在运行的容器。
    • 使用docker volume ls查看卷列表。

在删除镜像之前,请确保已经备份了重要的数据,并且确认要删除的镜像确实不再需要,以避免数据丢失或服务中断。

[root@server ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       latest    ca2b0f26964c   3 weeks ago   77.9MB
nginx        latest    92b11f67642b   5 weeks ago   187MB
nginx        1.14      295c7be07902   4 years ago   109MB
test/nginx   v1        295c7be07902   4 years ago   109MB#第一种删除方式docker image rm 镜像名
[root@server ~]# docker image rm nginx:1.14
Untagged: nginx:1.14
Untagged: nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d
[root@server ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       latest    ca2b0f26964c   3 weeks ago   77.9MB
nginx        latest    92b11f67642b   5 weeks ago   187MB
test/nginx   v1        295c7be07902   4 years ago   109MB#第二种删除方式docker rmi 镜像名
[root@server ~]# docker rmi nginx
Untagged: nginx:latest
Untagged: nginx@sha256:6db391d1c0cfb30588ba0bf72ea999404f2764febf0f1f196acd5867ac7efa7e
Deleted: sha256:92b11f67642b62bbb98e7e49169c346b30e20cd3c1c034d31087e46924b9312e
Deleted: sha256:d9e826dbb4b3c5770fe92638baa8c6614f210d782a5d021a123fe9fa1f92c23d
Deleted: sha256:2a75285e888884bed4d630896c86ecd71739c6e82669e21ad7a050f33c9ac48d
Deleted: sha256:32bfe3f040358ab8f9872a63d4ddefdc68f35d991ca10a812cbac5912ae9f97b
Deleted: sha256:1330486eb62ea7e96f384961b77b0fc85f5d4422e761114ef3a72e7cb89751a4
Deleted: sha256:a375372209a0f2b2c697a52cce46bc41b495bf86184ae83dd5146e20c22078eb
Deleted: sha256:450787ca55caa59d0288de9cf36fc6b77d1b208a77eb837ec3d25b385f99cafb
Deleted: sha256:a483da8ab3e941547542718cacd3258c6c705a63e94183c837c9bc44eb608999
[root@server ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       latest    ca2b0f26964c   3 weeks ago   77.9MB
test/nginx   v1        295c7be07902   4 years ago   109MB[root@server ~]# docker pull nginx  #再拉取一个nginx镜像
Using default tag: latest
latest: Pulling from library/nginx
8a1e25ce7c4f: Pull complete
e78b137be355: Pull complete
39fc875bd2b2: Pull complete
035788421403: Pull complete
87c3fb37cbf2: Pull complete
c5cdd1ce752d: Pull complete
33952c599532: Pull complete
Digest: sha256:6db391d1c0cfb30588ba0bf72ea999404f2764febf0f1f196acd5867ac7efa7e
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[root@server ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       latest    ca2b0f26964c   3 weeks ago   77.9MB
nginx        latest    92b11f67642b   5 weeks ago   187MB
test/nginx   v1        295c7be07902   4 years ago   109MB#通过镜像ID强制删除镜像(-f表示强制性删除)
[root@server ~]# docker rmi -f 295 
Untagged: test/nginx:v1
Deleted: sha256:295c7be079025306c4f1d65997fcf7adb411c88f139ad1d34b537164aa060369
Deleted: sha256:19606512dfe192788a55d7c1efb9ec02041b4e318587632f755c5112f927e0e3
Deleted: sha256:0b83495b3ad3db8663870c3babeba503a35740537a5e25acdf61ce6a8bdad06f
Deleted: sha256:5dacd731af1b0386ead06c8b1feff9f65d9e0bdfec032d2cd0bc03690698feda
[root@server ~]# docker images -a  #列出所有镜像
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       latest    ca2b0f26964c   3 weeks ago   77.9MB
nginx        latest    92b11f67642b   5 weeks ago   187MB

注意

  • 如果观察上面这几个命令的运行输出信息的话,你会注意到删除行为分为两类一类是Untagged另一类是Deleted镜像的唯一标
    识是其 ID 和摘要
    而一个镜像可以有多个标签。
  • 当我们使用上面命令删除镜像的时候, 实际上是在要求删除某个标签的镜像。所以首先需要做的是将满足我们要求的所有镜像标签都取
    ,这就是我们看到的 Untagged 的信息。
  • 因为一个镜像可以对应多个标签,因此当我们删除了所指定的标签后可能还有别的标签指向了这个镜像,如果是这种情况, 那么Delete 行为就不会发生所以并非所有的 docker image rm 都会产生删除镜像的行为,有可能仅仅是取消了某个标签而已。
  • 当该镜像所有的标签都被取消了,该镜像很可能会失去了存在的意义,因此会触发delete删除行为。镜像是多层存储结构, 因此在删除的时候也是从上层向基础层方向依次进行判断删除,镜像的多层结构让镜像复用变动非常容易,因此很有可能某个其它镜像正依赖于当前镜像的某一层这种情况,依旧不会触发删除该层的行为直到没有任何层依赖当前层时,才会真实的删除当前层。
  • 除了镜像依赖以外,还需要注意的是容器对镜像的依赖。如果有用这个镜像启动的容器存在(即使容器没有运行), 那么同样不可以删除这个镜像。

导入镜像docker image load

  • 或者使用docker load

docker image load 是一个 Docker CLI 命令,用于将以前使用 docker save 命令保存的镜像加载到 Docker 中。这个命令可以将 .tar 文件中存储的一个或多个 Docker 镜像恢复为其原始状态,并将其添加到本地 Docker 镜像库中。

通常,你可能会先使用 docker save 命令将一个或多个镜像保存到一个 .tar 文件中,以便在没有直接访问 Docker 仓库的情况下,能够将这些镜像传输到其他机器或备份起来。然后,当需要加载这些镜像时,可以使用 docker image load 命令将它们从 .tar 文件中恢复到 Docker 中。

下面是 docker image load 命令的基本使用方式:

docker image load < 镜像文件名.tar

或者,你可以使用 -i 选项指定输入文件的路径:

docker image load -i /path/to/镜像文件名.tar

例如,如果你有一个名为 myimage.tar 的文件,你可以使用以下命令将其加载到 Docker 中:

docker image load < myimage.tar

加载完成后,你可以使用 docker images 命令来查看新加载的镜像是否出现在本地镜像列表中。

需要注意的是,docker image load 命令不会创建容器,只是将镜像加载到本地 Docker 环境中。要基于这些镜像创建容器,你需要使用 docker run 命令。

[root@server ~]# docker images -a
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
ubuntu       latest    ca2b0f26964c   3 weeks ago    77.9MB
nginx        latest    92b11f67642b   5 weeks ago    187MB
mysql        latest    019814493c7a   2 months ago   632MB
[root@server ~]# docker images -aq
ca2b0f26964c
92b11f67642b
019814493c7a
[root@server ~]# ll -h
总用量 1.1G
-rw-------  1 root root 108M  324 11:37 docker-nginx.gz
-rw-------  1 root root 619M  324 12:25 mysql.tar.gz
-rw-------  1 root root 290M  324 11:36 nginx.tar.gz
-rw-r--r--  1 root root  77M  324 11:33 ubuntu.tar.gz[root@server ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       latest    ca2b0f26964c   3 weeks ago   77.9MB
nginx        latest    92b11f67642b   5 weeks ago   187MB[root@server ~]# docker image load -i mysql.tar.gz
18a3ada103a9: Loading layer [==================================================>]  118.8MB/118.8MB
96549124ed74: Loading layer [==================================================>]  11.26kB/11.26kB
331304b328ea: Loading layer [==================================================>]  2.359MB/2.359MB
7d05fbfb31ee: Loading layer [==================================================>]  13.85MB/13.85MB
d8fb47b60f94: Loading layer [==================================================>]  6.656kB/6.656kB
a5d9662dde43: Loading layer [==================================================>]  3.072kB/3.072kB
7fafcf5c6ac1: Loading layer [==================================================>]    201MB/201MB
ec9a59df23f2: Loading layer [==================================================>]  3.072kB/3.072kB
5458227f9e0f: Loading layer [==================================================>]  312.7MB/312.7MB
14544546851f: Loading layer [==================================================>]   16.9kB/16.9kB
Loaded image: mysql:latest
[root@server ~]# docker images -a
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
ubuntu       latest    ca2b0f26964c   3 weeks ago    77.9MB
nginx        latest    92b11f67642b   5 weeks ago    187MB
mysql        latest    019814493c7a   2 months ago   632MB
[root@server ~]# docker images -a
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    92b11f67642b   5 weeks ago    187MB
mysql        latest    019814493c7a   2 months ago   632MB[root@server ~]# ll -h
总用量 1.1G
-rw-------  1 root root 108M  324 11:37 docker-nginx.gz
-rw-------  1 root root 619M  324 12:25 mysql.tar.gz
-rw-------  1 root root 290M  324 11:36 nginx.tar.gz
-rw-r--r--  1 root root  77M  324 11:33 ubuntu.tar.gz[root@server ~]# docker load < ubuntu.tar.gz
5498e8c22f69: Loading layer [==================================================>]  80.41MB/80.41MB
Loaded image: ubuntu:latest
[root@server ~]# docker images -a
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
ubuntu       latest    ca2b0f26964c   3 weeks ago    77.9MB
nginx        latest    92b11f67642b   5 weeks ago    187MB
mysql        latest    019814493c7a   2 months ago   632MB

查看镜像的详细信息docker image inspect

docker image inspect 是一个 Docker CLI 命令,用于获取一个或多个 Docker 镜像的详细信息。这个命令返回有关镜像的 JSON 格式的结构化数据,包括镜像的 ID、创建时间、父镜像、大小、配置、层等。

基本语法如下:

docker image inspect [OPTIONS] IMAGE [IMAGE...]

其中,IMAGE 是你想要检查的镜像的名称或 ID。可以指定多个镜像来同时获取它们的信息。

OPTIONS 是可选参数,可以用来定制输出的格式。比如,可以使用 --format 参数来指定一个 Go 模板,以自定义输出的格式。

例如,如果你想要获取名为 myimage 的镜像的详细信息,你可以运行:

docker image inspect myimage

这将返回一个 JSON 对象,其中包含了 myimage 镜像的详细信息。

如果你只想获取某些特定的信息,比如镜像的创建时间,你可以使用 --format 参数来定制输出。例如:

docker image inspect --format='{{.Created}}' myimage

这将只返回镜像的创建时间。

[root@server ~]# docker images -a
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
ubuntu       latest    ca2b0f26964c   3 weeks ago    77.9MB
nginx        latest    92b11f67642b   5 weeks ago    187MB
mysql        latest    019814493c7a   2 months ago   632MB
[root@server ~]# docker image inspect mysql
[{"Id": "sha256:019814493c7ab16a057af0399b1288a1208b75ba852b915541840095c0fedfd0","RepoTags": ["mysql:latest"],"RepoDigests": [],"Parent": "","Comment": "buildkit.dockerfile.v0","Created": "2024-01-18T17:37:32Z","DockerVersion": "","Author": "","Config": {"Hostname": "","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"ExposedPorts": {"3306/tcp": {},"33060/tcp": {}},"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","GOSU_VERSION=1.16","MYSQL_MAJOR=innovation","MYSQL_VERSION=8.3.0-1.el8","MYSQL_SHELL_VERSION=8.3.0-1.el8"],"Cmd": ["mysqld"],"ArgsEscaped": true,"Image": "","Volumes": {"/var/lib/mysql": {}},"WorkingDir": "","Entrypoint": ["docker-entrypoint.sh"],"OnBuild": null,"Labels": null},"Architecture": "amd64","Os": "linux","Size": 632338890,"GraphDriver": {"Data": {"LowerDir": "/var/lib/docker/overlay2/71019f4f52c5c447bc6c339e4a33d35d43060053f80199afe55f0a74c97f950b/diff:/var/lib/docker/overlay2/98071bd50aaace91cafcbbd6d6f1f61667b863b844a14c55500d9b5dff5496ea/diff:/var/lib/docker/overlay2/51bbf41162dfd698ab0d05d934272ac6d407ee840dd23ad148b689ec08ff6ad0/diff:/var/lib/docker/overlay2/ea36002cf9f7fab18e7f80f6a73876de5ab2a9600091a5c3abf299eec79f8fc2/diff:/var/lib/docker/overlay2/59e2297f480e1a4fbe0b2664bab19ac5875598ab5b8096dfbcd4a3ad7f1a3bc3/diff:/var/lib/docker/overlay2/73c545c7c9c2075a9027c75f35d26d571395f0d2e2ec5c347c553b26a005ea8f/diff:/var/lib/docker/overlay2/5fa774e73b382b03832fde505e94e3d1583edb1ea81c331646ece1480a2361c8/diff:/var/lib/docker/overlay2/8a43e4bce01c3577aa197076d2afe2f35866386e6d999a211c72b7aa53f0cfa4/diff:/var/lib/docker/overlay2/031b942ad12868d5b2f563779b592447f7c7f1439d6d402b7587e9a6be920e25/diff","MergedDir": "/var/lib/docker/overlay2/9f2e70c39118a4a92510f835d5e2fc704fb5a88d4c6b5dbf1c1c8cb0b15b0794/merged","UpperDir": "/var/lib/docker/overlay2/9f2e70c39118a4a92510f835d5e2fc704fb5a88d4c6b5dbf1c1c8cb0b15b0794/diff","WorkDir": "/var/lib/docker/overlay2/9f2e70c39118a4a92510f835d5e2fc704fb5a88d4c6b5dbf1c1c8cb0b15b0794/work"},"Name": "overlay2"},"RootFS": {"Type": "layers","Layers": ["sha256:18a3ada103a9229bc00b549b66ae7caa0bc0eb47e785859d8b1346a254a871d1","sha256:96549124ed74012f28231a5c9584343eccb1352a3cdfc17234fa0d22d59c0667","sha256:331304b328ea1ee4e6f879ee5ea83a84dfeee92e8f6eed430dc0ec91daf6325e","sha256:7d05fbfb31eee6df20a572fafc7b50f9518838d3c13de89b88e9fae44585306e","sha256:d8fb47b60f94e1033c12c982cc669024cafa77b33d9ad7d1cd7f2605740417b5","sha256:a5d9662dde43371156b5a4dd21052b47f40606a780d039d37ed112e03049baf9","sha256:7fafcf5c6ac1cd816b47ef599217575cdde05e4a05e12e4e96afbe3e6236896e","sha256:ec9a59df23f223ccd0d7d4490f904c95b1d1d1c6ad83d11c4cb7ebc1b1672d74","sha256:5458227f9e0f698c36186c085570240db025e101186f88fce300958cda13651f","sha256:14544546851f4a2de63ac98a464da491096c36cdfc94b10cd26dc8da572a5eb5"]},"Metadata": {"LastTagTime": "0001-01-01T00:00:00Z"}}
]

Docker容器操作

启动容器

Docker运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker会从镜像仓库下载该镜像。

方法1

  • 使用docker run
  • 或者使用docker container run

docker runDocker 命令行接口(CLI)中用于创建并启动新容器的命令。使用 docker run,您可以基于指定的镜像来运行一个新的容器实例,并可以传递各种参数来配置容器的行为。

下面是 docker run 的基本语法:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  • OPTIONS:这是可选的,用于配置容器的行为。例如,您可以设置端口映射环境变量卷挂载等。
  • IMAGE:指定要基于哪个镜像来创建并启动容器。
  • COMMAND:在容器内部要执行的命令。如果镜像定义了默认的命令,那么这个 COMMAND 可以省略。
  • ARG:传递给 COMMAND 的参数。
示例
  1. 运行一个基于 ubuntu 镜像的容器,并启动 bash shell
docker run -it ubuntu bash

这里 -it 选项用于保持容器的标准输入(stdin)打开,并分配一个伪终端(pseudo-TTY)。

  1. 在后台运行一个基于 nginx 镜像的容器,并映射端口
docker run -d -p 8080:80 nginx

这里 -d 选项用于在后台运行容器,-p 8080:80 将容器的 80 端口映射到主机的 8080 端口。

  1. 设置环境变量并运行容器
docker run -e MY_VAR=myvalue ubuntu echo $MY_VAR

这里 -e MY_VAR=myvalue 设置了一个环境变量 MY_VAR,并在容器内执行 echo $MY_VAR 命令。

  1. 挂载卷并运行容器
docker run -v /host/directory:/container/directory ubuntu ls /container/directory

这里 -v /host/directory:/container/directory 将主机上的 /host/directory 目录挂载到容器内的 /container/directory 目录。

常用选项
  • -d, --detach:在后台运行容器并打印容器 ID。
  • -i, --interactive:保持 stdin 打开,即交互式访问
  • -t, --tty分配一个伪终端或保持 stdin 打开。
  • -p, --publish list:发布容器端口到主机。格式为主机端口:容器端口
  • -P:随机端口映射,容器内部端口随机映射到主机的端口
  • -e, --env list:设置环境变量。
  • -v, --volume list:挂载卷。
  • --rm容器一停,自动删除
  • --name string:为容器指定一个名称。
  • --restart string:设置容器的重启策略。
  • --network string:指定容器要使用的网络。
注意

如果在没有对应镜像的情况下使用docker run,则docker run就等价于docker pull,docker create,docker start

[root@server ~]# docker run -it ubuntu bash
root@58349642f2b2:/# ls
bin   dev  home  lib32  libx32  mnt  proc  run   srv  tmp  var
boot  etc  lib   lib64  media   opt  root  sbin  sys  usr
root@58349642f2b2:/# exit
exit
[root@server ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS                      PORTS     NAMES
58349642f2b2   ubuntu    "bash"    26 seconds ago   Exited (0) 21 seconds ago             quizzical_meninsky
#Exited表示容器已关闭[root@server ~]# docker run -it --rm ubuntu bash
root@24d9e0f33ed4:/# ls
bin   dev  home  lib32  libx32  mnt  proc  run   srv  tmp  var
boot  etc  lib   lib64  media   opt  root  sbin  sys  usr
root@24d9e0f33ed4:/# exit
exit
[root@server ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@server ~]# docker run -it -d -P nginx bash
8cf6390252dfdd5025ebcb9329cd4fd45fedc6a9174bf564cf1b5e6d7597e725
[root@server ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS          PORTS                                      NAMES
8cf6390252df   nginx     "/docker-entrypoint.…"   11 seconds ago   Up 10 seconds   0.0.0.0:32768->80/tcp, :::32768->80/tcp   wonderful_austin
#Up表示容器正在运行
[root@server ~]# docker run --name web1 -it -d -p 8888:80 nginx #加-d后台运行
d7688268707e97555ee4745bfdf0e7f334f8e2d690325b74309f1012656fdcad
[root@server ~]# docker port web1 #查看web1的docker端口映射
80/tcp -> 0.0.0.0:8888
80/tcp -> [::]:8888
[root@server ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS          PORTS                                 NAMES
d7688268707e   nginx     "/docker-entrypoint.…"   22 seconds ago   Up 21 seconds   0.0.0.0:8888->80/tcp, :::8888->80/tcp   web1
[root@server ~]# docker run --name web1 -it -p 8888:80 nginx /bin/bash #不加-d进入交互模式
root@1f1e37ecc503:/# ls
bin   dev                  docker-entrypoint.sh  home  lib64  mnt  proc  run   srv  tmp  var
boot  docker-entrypoint.d  etc                   lib   media  opt  root  sbin  sys  usr
root@1f1e37ecc503:/# exit
exit
[root@server ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS                     PORTS     NAMES
1f1e37ecc503   nginx     "/docker-entrypoint.…"   27 seconds ago   Exited (0) 6 seconds ago             web1

方式2(不推荐)

  • 先使用docker create创建一个容器
  • 在使用docker start启动容器
注意

如果在没有对应镜像的情况下使用docker create,则docker create就等价于docker pull,docker create

删除容器

要删除Docker容器,你可以使用docker rm命令。以下是关于删除容器的一些常见操作和注意事项:

删除单个容器

要删除一个正在运行的容器,你需要首先停止它,然后再删除。或者,你可以使用-f选项来强制删除正在运行的容器。

# 停止容器
docker stop [容器ID或名称]# 删除容器
docker rm [容器ID或名称]

或者,你可以一步完成,直接强制删除正在运行的容器:

docker rm -f [容器ID或名称]

删除多个容器

你可以使用空格分隔的容器ID或名称列表来删除多个容器:

docker rm [容器ID1] [容器ID2] ...

或者,结合docker ps命令和xargs来删除所有停止的容器:

docker rm $(docker ps -aq)

这里的-a选项表示显示所有容器(包括已停止的),-q选项表示只输出容器ID。

删除所有容器(包括正在运行的)

要删除所有容器,包括正在运行的容器,可以使用以下命令:

docker rm -f $(docker ps -aq)

这将会强制删除所有容器,所以请确保你真的想要这么做。

清除所有处于关闭状态的容器

[root@server ~]# docker container prune

注意事项

  • 在删除容器之前,请确保容器内的数据已经备份或不再需要,因为删除容器会同时删除容器内的文件系统。
  • 如果容器正在运行重要的服务或进程,请确保在删除之前已经进行了适当的停机处理。
  • 使用-f选项强制删除容器时,请格外小心,因为这可能会中断正在运行的进程或导致数据丢失。

查看容器列表

在删除容器之前,你可以使用docker ps命令查看正在运行的容器,或者使用docker ps -a查看所有容器(包括已停止的)。这可以帮助你确定要删除的容器。

# 查看正在运行的容器
docker ps# 查看所有容器(包括已停止的)
docker ps -a

通过结合这些命令和选项,你可以有效地管理Docker容器,确保只删除不再需要的容器。

[root@server ~]# docker run -it -d -P nginx bash
8cf6390252dfdd5025ebcb9329cd4fd45fedc6a9174bf564cf1b5e6d7597e725
[root@server ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS          PORTS                                        NAMES
8cf6390252df   nginx     "/docker-entrypoint.…"   11 seconds ago   Up 10 seconds   0.0.0.0:32768->80/tcp, :::32768->80/tcp   wonderful_austin
[root@server ~]# docker rm 8cf6390252df  #由于容器正在运行,所以无法普通删除
Error response from daemon: cannot remove container "/wonderful_austin": container is running: stop the container before removing or force remove
[root@server ~]# docker rm -f 8cf6390252df #通过-f强制删除
8cf6390252df
[root@server ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@server ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS                      PORTS     NAMES
c15039e3ae2a   ubuntu    "bash"                    21 seconds ago   Exited (0) 16 seconds ago             affectionate_edison
83fd92a37ddf   ubuntu    "bash"                    16 minutes ago   Created                               fervent_knuth
341263befffb   nginx     "/docker-entrypoint.…"   18 minutes ago   Created                               cool_jennings
[root@server ~]# docker ps -aq  #-q只显示容器ID
c15039e3ae2a
83fd92a37ddf
341263befffb
[root@server ~]# docker rm `docker ps -aq`  #通过反引号包裹
c15039e3ae2a
83fd92a37ddf
341263befffb
[root@server ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

查看容器运行状态

[root@server ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS          PORTS                                 NAMES
e5475d3f8a4f   nginx     "/docker-entrypoint.…"   54 seconds ago   Up 53 seconds   0.0.0.0:8888->80/tcp, :::8888->80/tcp   web1
[root@server ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED              STATUS              PORTS                                 NAMES
e5475d3f8a4f   nginx     "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:8888->80/tcp, :::8888->80/tcp   web1
[root@server ~]# docker container ls -a
CONTAINER ID   IMAGE     COMMAND                   CREATED              STATUS              PORTS                                 NAMES
e5475d3f8a4f   nginx     "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:8888->80/tcp, :::8888->80/tcp   web1
[root@server ~]# docker container ls
CONTAINER ID   IMAGE     COMMAND                   CREATED              STATUS              PORTS                                 NAMES
e5475d3f8a4f   nginx     "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:8888->80/tcp, :::8888->80/tcp   web1

停止运行的容器docker stop/kill

[root@server ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED             STATUS             PORTS                                 NAMES
e5475d3f8a4f   nginx     "/docker-entrypoint.…"   About an hour ago   Up About an hour   0.0.0.0:8888->80/tcp, :::8888->80/tcp   web1
[root@server ~]# docker stop web1
web1
[root@server ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@server ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@server ~]# docker start web1
web1
[root@server ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED       STATUS          PORTS                                 NAMES
e5475d3f8a4f   nginx     "/docker-entrypoint.…"   2 hours ago   Up 52 seconds   0.0.0.0:8888->80/tcp, :::8888->80/tcp   web1
[root@server ~]# docker kill -s 9 web1  #-s 9表示强制终止
web1
[root@server ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

激活关闭的容器docker start/restart

docker start 是一个 Docker 命令行接口(CLI)命令,用于启动一个或多个已经存在的、但是当前处于停止状态的容器。当你使用 docker run 命令创建并启动容器后,你可以使用 docker stop 命令来停止容器。之后,如果你想再次启动这个容器,就可以使用 docker start 命令。

基本语法如下:

docker start [OPTIONS] CONTAINER [CONTAINER...]
  • OPTIONS:可选参数,用于配置启动容器的行为。虽然 docker start 通常不需要额外的选项,但 Docker 提供了其他选项用于高级用途。
  • CONTAINER:要启动的容器的名称或ID。可以指定多个容器来同时启动它们。

示例

  1. 启动名为 mycontainer 的容器
docker start mycontainer
  1. 启动多个容器
docker start container1 container2 container3

注意事项

  • 在启动容器之前,确保容器已经创建并存在于 Docker 系统中。
  • 当你使用 docker start 命令时,容器将从其上次停止时的状态恢复,这意味着任何在容器内部运行的进程将恢复执行。
  • 如果容器之前因为某种错误而退出,并且你想要重新启动它,使用 docker start 通常是合适的。但是,如果容器因为配置错误或其他问题而不断失败,你可能需要进入容器内部进行调试,或者重新创建容器。
[root@server ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@server ~]# docker restart web1
web1
[root@server ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED       STATUS         PORTS                                   NAMES
e5475d3f8a4f   nginx     "/docker-entrypoint.…"   2 hours ago   Up 4 seconds   0.0.0.0:8888->80/tcp, :::8888->80/tcp   web1
[root@server ~]# docker stop e5475d3f8a4f
e5475d3f8a4f
[root@server ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED       STATUS                      PORTS     NAMES
e5475d3f8a4f   nginx     "/docker-entrypoint.…"   2 hours ago   Exited (0) 30 seconds ago             web1
[root@server ~]# docker start e5475d3f8a4f
e5475d3f8a4f
[root@server ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED       STATUS         PORTS                                   NAMES
e5475d3f8a4f   nginx     "/docker-entrypoint.…"   2 hours ago   Up 4 seconds   0.0.0.0:8888->80/tcp, :::8888->80/tcp   web1

查看容器

查看容器的详细信息docker container inspect

  • 或使用docker inspect
[root@server ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED       STATUS         PORTS                                   NAMES
e5475d3f8a4f   nginx     "/docker-entrypoint.…"   2 hours ago   Up 6 minutes   0.0.0.0:8888->80/tcp, :::8888->80/tcp   web1
[root@server ~]# docker inspect web1
[{"Id": "e5475d3f8a4f6818eb701a7b68a1f54417260510a0e3c688442139e0cf3c8eff","Created": "2024-03-24T06:03:17.50320209Z","Path": "/docker-entrypoint.sh","Args": ["nginx","-g","daemon off;"],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 38619,"ExitCode": 0,"Error": "","StartedAt": "2024-03-24T07:53:58.881752968Z","FinishedAt": "2024-03-24T07:53:42.230209857Z"},"Image": "sha256:92b11f67642b62bbb98e7e49169c346b30e20cd3c1c034d31087e46924b9312e","ResolvConfPath": "/var/lib/docker/containers/e5475d3f8a4f6818eb701a7b68a1f54417260510a0e3c688442139e0cf3c8eff/resolv.conf","HostnamePath": "/var/lib/docker/containers/e5475d3f8a4f6818eb701a7b68a1f54417260510a0e3c688442139e0cf3c8eff/hostname","HostsPath": "/var/lib/docker/containers/e5475d3f8a4f6818eb701a7b68a1f54417260510a0e3c688442139e0cf3c8eff/hosts","LogPath": "/var/lib/docker/containers/e5475d3f8a4f6818eb701a7b68a1f54417260510a0e3c688442139e0cf3c8eff/e5475d3f8a4f6818eb701a7b68a1f54417260510a0e3c688442139e0cf3c8eff-json.log","Name": "/web1","RestartCount": 0,"Driver": "overlay2","Platform": "linux","MountLabel": "","ProcessLabel": "","AppArmorProfile": "","ExecIDs": null,"HostConfig": {"Binds": null,"ContainerIDFile": "","LogConfig": {"Type": "json-file","Config": {}},"NetworkMode": "default","PortBindings": {"80/tcp": [{"HostIp": "","HostPort": "8888"}]}
[root@server ~]# docker inspect web1 | grep -i address"LinkLocalIPv6Address": "","SecondaryIPAddresses": null,"SecondaryIPv6Addresses": null,"GlobalIPv6Address": "","IPAddress": "172.17.0.2","MacAddress": "02:42:ac:11:00:02","MacAddress": "02:42:ac:11:00:02","IPAddress": "172.17.0.2","GlobalIPv6Address": "",
[root@server ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED       STATUS       PORTS                                   NAMES
e5475d3f8a4f   nginx     "/docker-entrypoint.…"   4 hours ago   Up 2 hours   0.0.0.0:8888->80/tcp, :::8888->80/tcp   web1
[root@server ~]# docker container inspect web1
[{"Id": "e5475d3f8a4f6818eb701a7b68a1f54417260510a0e3c688442139e0cf3c8eff","Created": "2024-03-24T06:03:17.50320209Z","Path": "/docker-entrypoint.sh","Args": ["nginx","-g","daemon off;"],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 38619,"ExitCode": 0,"Error": "","StartedAt": "2024-03-24T07:53:58.881752968Z","FinishedAt": "2024-03-24T07:53:42.230209857Z"},"Image": "sha256:92b11f67642b62bbb98e7e49169c346b30e20cd3c1c034d31087e46924b9312e","ResolvConfPath": "/var/lib/docker/containers/e5475d3f8a4f6818eb701a7b68a1f54417260510a0e3c688442139e0cf3c8eff/resolv.conf","HostnamePath": "/var/lib/docker/containers/e5475d3f8a4f6818eb701a7b68a1f54417260510a0e3c688442139e0cf3c8eff/hostname","HostsPath": "/var/lib/docker/containers/e5475d3f8a4f6818eb701a7b68a1f54417260510a0e3c688442139e0cf3c8eff/hosts","LogPath": "/var/lib/docker/containers/e5475d3f8a4f6818eb701a7b68a1f54417260510a0e3c688442139e0cf3c8eff/e5475d3f8a4f6818eb701a7b68a1f54417260510a0e3c688442139e0cf3c8eff-json.log","Name": "/web1","RestartCount": 0,"Driver": "overlay2","Platform": "linux","MountLabel": "","ProcessLabel": "","AppArmorProfile": "","ExecIDs": null,"HostConfig": {"Binds": null,"ContainerIDFile": "","LogConfig": {"Type": "json-file","Config": {}},"NetworkMode": "default","PortBindings": {"80/tcp": [{"HostIp": "","HostPort": "8888"}]

查看容器内的进程docker top

docker top 命令用于查看 Docker 容器中正在运行的进程。通过这个命令,你可以列出容器中所有进程的信息,包括进程 ID、进程名称、CPU 占用率、内存占用率等。使用 docker top 命令需要指定容器的 ID 或名称。

基本语法如下:

docker top [OPTIONS] CONTAINER [ps OPTIONS]

其中:

  • [OPTIONS]docker top 命令的可选参数。
  • CONTAINER 是要查看的容器的名称或 ID。
  • [ps OPTIONS] 是传递给 ps 命令的选项,用于定制进程的显示方式。
示例
  1. 查看容器中的进程

    使用 docker top 命令查看名为 mycontainer 的容器中的进程:

    docker top mycontainer
    

    这将返回容器内所有正在运行的进程列表,包括进程 ID、进程名称等。

  2. 查看进程并提取 CPU 和内存信息

    你可以结合其他命令(如 awk)来提取 docker top 的输出中的特定信息,比如 CPU 和内存使用情况:

    docker top mycontainer | awk '{print $2, $3, $9, $10}'
    

    这条命令将输出进程名称、PID、CPU 占用率和内存占用率。

  3. 使用选项查看特定信息

    docker top 命令也支持一些选项来定制输出。例如,使用 -u 选项可以以用户为主的格式显示进程信息:

    docker top -u mycontainer
    
注意事项
  • 在执行 docker top 命令时,确保容器正在运行,否则你将无法看到任何进程信息。
  • 如果容器中有多个进程,docker top 将显示所有这些进程的信息。
  • docker top 命令返回的是容器运行时的实时进程信息,如果容器中的进程状态发生变化,你需要重新执行 docker top 命令来查看最新的进程信息。

总之,docker top 命令是 Docker 提供的用于查看容器内部进程状态的有力工具,它可以帮助你更好地理解和监控容器的运行情况。

[root@server ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED       STATUS       PORTS                                   NAMES
e5475d3f8a4f   nginx     "/docker-entrypoint.…"   4 hours ago   Up 2 hours   0.0.0.0:8888->80/tcp, :::8888->80/tcp   web1[root@server ~]# docker top web1
UID                 PID                 PPID                CSTIME               TTY                 TIME                CMD
root                38619               38580               015:53               pts/0               00:00:00            nginx: master process nginx -g daemon off;
101                 38647               38619               015:53               pts/0               00:00:00            nginx: worker process
101                 38648               38619               015:53               pts/0               00:00:00            nginx: worker process

您已经成功地使用了 docker top 命令来查看名为 web1 的容器中的进程信息。从您提供的输出中,我们可以看到容器 web1 中正在运行两个 nginx 进程:一个主进程(master process)和两个工作进程(worker process)。

这里是每个列的解释:

  • UID:用户ID,运行该进程的用户在容器内的唯一标识。
  • PID:进程ID,这是每个进程在容器内的唯一标识。
  • PPID:父进程ID,即创建该进程的进程的ID。
  • C:CPU利用率,这个值通常表示该进程最近的CPU使用率。
  • STIME:进程启动时间。
  • TTY:进程关联的终端类型,如果是 pts/0,则通常表示这个进程是在伪终端上运行的。
  • TIME:该进程自启动以来消耗的CPU时间。
  • CMD:启动进程的命令。

从输出中我们可以看到:

  • 主进程(PID 38619)以 nginx: master process nginx -g daemon off; 的形式运行,这意味着它是 nginx 的主进程,并且 nginx 是以守护进程模式关闭(即在前台运行)启动的。
  • 两个工作进程(PID 38647 和 38648)以 nginx: worker process 的形式运行,它们是处理实际HTTP请求的 nginx 工作进程。

这个输出可以帮助您确认 nginx 在容器 web1 中正在运行,并且有两个工作进程正在处理请求。如果您需要进一步诊断或管理这些进程,您可以使用 docker exec 命令在容器内运行其他命令,比如 pskill 等。

docker stats

docker stats 命令用于动态显示 Docker 容器的资源消耗情况它可以提供关于容器使用 CPU、内存、网络 I/O 和块 I/O 等资源的实时统计信息。

使用 docker stats 命令时,可以指定要查看的容器名称或 ID,也可以不指定任何参数以查看所有运行中的容器的统计信息。命令的输出将包括每个容器的 ID、名称、CPU 使用率、内存使用量、网络 I/O、块 I/O 以及进程数等。

此外,docker stats 命令还支持一些可选参数,如 --all 用于列出所有容器的信息(包括已停止的容器,但已停止的容器不会返回任何信息),--no-stream 用于只查看容器的静态信息,以及 --format 用于指定返回值的模板文件等。

在终端或命令行界面中运行 docker stats 命令后,将实时显示容器的资源使用情况。可以通过按 Ctrl+C 组合键来停止输出。

在window上访问Linux中运行的nginx容器

访问的IP地址为Linux主机的IP地址,端口是启动nginx容器时映射的端口
在这里插入图片描述

查询容器内部日志docker logs

docker logs 命令用于检索容器的日志输出当你运行一个容器时,该容器可能会产生各种日志信息,比如应用程序的运行状态、错误信息等。使用 docker logs 命令,你可以查看这些日志,以了解容器内部的运行情况。

基本语法如下:

docker logs [OPTIONS] CONTAINER

其中:

  • OPTIONS 是可选参数,用于配置日志检索的行为。
  • CONTAINER 是你要查看日志的容器的名称或 ID。

示例

示例1:查看容器的日志
docker logs mycontainer

这条命令会显示名为 mycontainer 的容器的日志输出。

示例2:实时查看容器的日志
docker logs -f mycontainer

使用 -f--follow 选项,可以实时跟踪容器的日志输出即当新的日志产生时,它们会立即显示在终端上。这对于观察容器的实时运行状态非常有用

示例3:查看容器的日志并限制输出行数
docker logs --tail 10 mycontainer

使用 --tail 选项,你可以限制显示的日志行数。在这个例子中,只显示 mycontainer 容器的最后 10 行日志。

示例4:查看容器的日志并显示时间戳
docker logs --timestamps mycontainer

使用 --timestamps 选项,可以在每条日志前面显示时间戳,这有助于你了解日志的产生时间。

注意事项

  • 如果容器已经停止,你仍然可以查看它的日志,但实时跟踪(使用 -f 选项)将不起作用。
  • 默认情况下,docker logs 显示的是容器的标准输出(stdout)和标准错误(stderr)。如果你需要查看其他类型的日志,可能需要调整你的应用程序或服务的日志配置。
  • 如果容器的日志量非常大,使用 docker logs 可能会产生大量的输出。在这种情况下,使用 --tail 选项来限制输出行数可能是个好主意。
[root@server ~]# docker logs 容器名或容器ID

docker wait

docker wait 命令用于阻塞一个或多个 Docker 容器直到这些容器停止运行并在容器退出时打印出它们的退出代码。这个命令对于需要等待容器完成其任务并获取其退出状态的情况非常有用。

命令的基本语法如下:

docker wait [OPTIONS] CONTAINER [CONTAINER...]

其中 CONTAINER 可以是容器的 ID 或名称,并且可以指定多个容器。

使用示例

  1. 首先,启动一个 Docker 容器,并给它一个名称,例如 my_container
docker run --name my_container -dit ubuntu bash
  1. 然后,使用 docker wait 命令等待这个容器退出:
docker wait my_container

此时,docker wait 命令会阻塞,直到 my_container 容器停止运行。一旦容器停止,docker wait 会打印出容器的退出代码。

  1. 你可以在另一个终端窗口中停止 my_container 容器,例如使用 docker stop 命令:
docker stop my_container

当容器停止后,之前运行的 docker wait 命令会退出并打印出容器的退出代码。

注意事项

  • docker wait 命令不会显示容器内部的日志或输出,它只关注容器的运行状态和退出代码。
  • 如果容器已经在运行并且没有退出,docker wait 命令会阻塞直到容器退出。
  • 退出代码通常用于表示容器执行的结果,例如 0 通常表示成功,非零值表示出错或异常。

通过使用 docker wait 命令,你可以确保在容器完成其任务并退出之前,其他依赖于该容器状态的操作不会继续执行。这对于构建自动化脚本和容器编排非常有用。

进入容器docker exec

  • 在使用 -d 参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作
  • 这个时候如果需要进入容器进行操作,推荐使用官方的 attachexec 命令

docker exec 是一个 Docker 命令用于在正在运行的容器中执行命令。它允许你在容器的上下文中运行任何命令,就像你在容器的 shell 中手动执行一样。这对于需要在运行中的容器中进行诊断、调试或执行其他任务时非常有用。

基本语法如下:

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

其中:

  • OPTIONS:是可选的,用于配置 docker exec 命令的行为。
  • CONTAINER:是要在其中执行命令的容器的名称或ID。
  • COMMAND:是要在容器内执行的命令。
  • ARG...:是传递给命令的参数。

常用选项

  • -i:保持标准输入打开,通常与 -t 一起使用,以便与容器进行交互。
  • -t:分配一个伪终端,这通常用于创建一个交互式的 shell 会话。
  • -d:在后台运行命令。
  • -u:以指定的用户身份执行命令。
  • -e:设置环境变量。

示例

  1. 在容器中启动交互式 bash shell
docker exec -it mycontainer /bin/bash

这将在名为 mycontainer 的容器中启动一个交互式的 bash shell,允许你与容器进行交互。

  1. 在容器中执行单个命令
docker exec mycontainer ls -l

这将在 mycontainer 容器中执行 ls -l 命令,并显示结果。

  1. 在容器中执行多个命令

如果你想在容器中执行多个命令,你需要将它们连接起来并通过 shell 执行。例如:

docker exec mycontainer bash -c "cd /some/directory && ls -l"

在这个例子中,我们首先切换到 /some/directory 目录,然后列出该目录的内容。

请注意,要使用 docker exec 命令,容器必须已经启动并且至少有一个进程正在运行。如果容器没有运行,你需要先使用 docker start 命令启动它。

对于 docker exec 的更多详细信息和可用选项,你可以查阅 Docker 官方文档或使用 docker exec --help 命令来获取帮助。

[root@server ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED       STATUS          PORTS                                   NAMES
e5475d3f8a4f   nginx     "/docker-entrypoint.…"   2 hours ago   Up 22 minutes   0.0.0.0:8888->80/tcp, :::8888->80/tcp   web1
[root@server ~]# docker exec -it e5475d3f8a4f /bin/bash
root@e5475d3f8a4f:/# ls
bin   docker-entrypoint.d   home   media  proc  sbin  tmp
boot  docker-entrypoint.sh  lib    mnt    root  srv   usr
dev   etc                   lib64  opt    run   sys   var
root@e5475d3f8a4f:/#

导出容器docker export

docker export 命令用于将 Docker 容器的文件系统导出为一个 tar 归档文件。这对于备份容器状态、迁移容器到其他机器或共享容器的文件系统非常有用。

基本语法如下:

docker export [OPTIONS] CONTAINER

其中 CONTAINER 是要导出文件系统的容器的名称或 ID。

选项

  • -o--output:用于指定输出的文件名或路径。如果不指定,tar 归档文件将默认输出到标准输出(stdout)。

使用示例

  1. 导出容器到标准输出

    将名为 mycontainer 的容器的文件系统导出到标准输出,并将输出重定向到一个 tar 文件:

    docker export mycontainer > mycontainer.tar
    
  2. 导出容器到指定文件

    使用 -o 选项直接将容器导出到指定的 tar 文件:

    docker export -o mycontainer.tar mycontainer
    
  3. 按日期保存为 tar 文件

    你可以结合 shell 命令来按日期保存 tar 文件:

    docker export -o mysql-`date +%Y%m%d`.tar b5t2r1x794o3
    

    这将会导出 ID 为 b5t2r1x794o3 的容器的文件系统,并以当前日期命名 tar 文件。

注意事项

  • 导出的 tar 文件仅包含容器的文件系统,并不包含容器的配置信息(如环境变量、网络配置等)。
  • 如果需要迁移或备份整个容器状态,除了文件系统外,还需要考虑其他配置和元数据。
  • 导出的 tar 文件可以在其他 Docker 环境中使用 docker import 命令导入,以创建一个新的镜像。

docker export 命令是 Docker 工具链中用于管理容器文件系统的重要命令之一,尤其在需要迁移、备份或共享容器状态时非常有用。

导入容器docker import

docker import 命令用于将本地文件系统上的文件或目录,或者从远程URL导入为Docker镜像。

其基本语法如下:

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

参数说明:

  • OPTIONS:可选参数,用于配置导入操作的一些选项。
  • file|URL|-:必需参数,指定要导入的文件路径或URL。可以是一个文件路径,也可以是一个URL,或者使用-表示从标准输入中读取tar归档文件。
  • REPOSITORY:可选参数,指定要创建的新镜像的名称。
  • TAG:可选参数,指定要创建的新镜像的标签。

示例

示例1:从本地文件系统导入

假设我们有一个名为example.tar的tar归档文件,它包含了我们想要导入的文件系统。我们可以使用docker import命令来创建一个新的镜像:

docker import example.tar myimage:1.0

这将会将example.tar中的文件系统导入到myimage:1.0镜像中。之后,我们可以使用docker run命令来运行这个新建的容器。

示例2:从远程URL导入

如果我们想要从一个远程URL导入文件系统,我们可以直接将URL作为参数传递给docker import命令:

docker import http://example.com/path/to/image.tar myimage:1.0

这将会将远程URL中的文件系统导入到myimage:1.0镜像中。

注意事项

如果在使用docker import命令时遇到无法启动容器的问题,可能的原因包括导入的文件或URL中缺少依赖项或配置文件,或者与宿主机环境不兼容等。这时,需要检查导入的文件或URL是否包含所需的依赖项和配置文件,以及宿主机环境是否与导入的镜像兼容。如果以上方法都无法解决问题,可以尝试重新导入镜像。

请注意,docker import命令创建的镜像可能不如使用Dockerfile创建的镜像透明和可维护。在可能的情况下,推荐使用Dockerfile来构建和管理镜像。

查看容器的IP地址

root@e5475d3f8a4f:/# hostname -I
172.17.0.2root@e5475d3f8a4f:/# hostname -i
172.17.0.2

查看容器中的环境变量

[root@server ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED       STATUS          PORTS                                   NAMES
e5475d3f8a4f   nginx     "/docker-entrypoint.…"   2 hours ago   Up 31 minutes   0.0.0.0:8888->80/tcp, :::8888->80/tcp   web1
[root@server ~]# docker exec -it web1 echo $PATH
/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin

其他容器命令

docker rename

修改容器名

  • 或使用docker container rename
[root@server _data]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS         PORTS                                     NAMES
630a7fa66f4c   nginx:latest   "/docker-entrypoint.…"   4 minutes ago   Up 4 minutes   0.0.0.0:32770->80/tcp, :::32770->80/tcp   web1
[root@server _data]# docker container rename web1 nginx-web1
[root@server _data]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS         PORTS                                     NAMES
630a7fa66f4c   nginx:latest   "/docker-entrypoint.…"   5 minutes ago   Up 5 minutes   0.0.0.0:32770->80/tcp, :::32770->80/tcp   nginx-web1
[root@server _data]# docker rename nginx-web1 web1
[root@server _data]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS         PORTS                                     NAMES
630a7fa66f4c   nginx:latest   "/docker-entrypoint.…"   5 minutes ago   Up 5 minutes   0.0.0.0:32770->80/tcp, :::32770->80/tcp   web1

docker cp

docker cp 命令用于在 Docker 容器本地文件系统 之间复制文件或目录这个命令允许你将文件或目录从容器内部复制到主机上或者将文件或目录从主机复制到容器内部。这对于备份容器内的数据、在容器和主机之间传输文件以及在容器内设置初始文件等场景非常有用。

命令的基本语法如下:

  • 从容器复制到宿主机:docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
  • 从宿主机复制到容器:docker cp [OPTIONS] SRC_PATH DEST_PATH CONTAINER:DEST_PATH

其中:

  • CONTAINER 可以是容器的 ID 或名称,无论是正在运行还是已停止的容器都可以使用。
  • SRC_PATH 是源文件或目录在容器内的路径。
  • DEST_PATH 是目标路径在主机上的位置,或者是目标路径在容器内的位置(当从主机复制到容器时)。

注意,docker cp 命令会假定容器路径相对于容器的根(/)目录,而主机路径则是相对于执行 docker cp 命令的当前目录。

此外,docker cp 命令还支持一些可选参数:

  • -a:将复制的文件或目录保留其原始属性,包括所有者、权限等。
  • -L:如果 SRC_PATH 是一个符号链接,则复制链接指向的文件或目录。
  • -p:保留源文件或目录的时间戳。
  • -R-r:递归复制整个目录。

使用 docker cp 命令时,请确保目标路径是可写的,并且具有足够的权限来执行复制操作。

docker diff

docker diff 命令用于检查 Docker 容器内文件系统的更改当运行了一个容器后,你可能想知道容器内修改了哪些文件,这时就可以使用 docker diff 命令。

该命令的语法为:docker diff <container_name or container_id>,其中 <container_name or container_id> 是容器的名称或 ID。

执行 docker diff 命令后,将输出类似于下面的内容:

  • C /path/to/changed/file:表示文件被修改。
  • D /path/to/deleted/file:表示文件被删除。
  • A /path/to/added/file:表示文件被添加。

例如,如果你想查看名为 mycontainer 的容器内的文件变化,可以执行 docker diff mycontainer。这将列出所有在容器内被添加、删除或修改的文件路径。

此外,当在容器中删除文件时,如果你想在主机上同步删除这些文件,可以使用 docker diff 命令查看容器中的文件变化,并使用正则表达式匹配出被删除的文件路径,然后在主机上执行删除操作。

docker port

docker port 命令用于查看容器的端口映射信息在 Docker 中,容器的端口默认是私有的,也就是说,容器内部运行的服务只能在容器内部访问为了使得这些服务能够被外部访问我们需要使用端口映射功能,将容器内的端口映射到宿主机的某个端口上docker port 命令就是用来查看这种映射关系的。

使用 docker port 命令时,需要指定容器的名称或 ID,以及容器内部的端口号。命令的基本语法如下:

docker port <container_name or container_id> <container_port>

其中,<container_name or container_id> 是你想要查看端口映射信息的容器的名称或 ID,<container_port> 是容器内部的端口号。

例如,假设你有一个名为 mycontainer 的容器,容器内部运行着一个服务,监听在端口 8080 上。你可以使用以下命令来查看这个端口在宿主机上的映射情况:

docker port mycontainer 8080

如果端口已经被映射到了宿主机的某个端口上,docker port 命令会输出宿主机的 IP 地址和端口号。例如:

0.0.0.0:32768

这表示容器内部的 8080 端口被映射到了宿主机的 32768 端口上,并且宿主机的任何 IP 地址都可以访问这个端口。

需要注意的是,如果容器内部的端口没有被映射到宿主机上,docker port 命令将不会返回任何输出。此外,如果容器没有运行,该命令也无法获取到端口映射信息。

[root@server ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED       STATUS       PORTS                                   NAMES
e5475d3f8a4f   nginx     "/docker-entrypoint.…"   4 hours ago   Up 2 hours   0.0.0.0:8888->80/tcp, :::8888->80/tcp   web1[root@server ~]# docker port web1
80/tcp -> 0.0.0.0:8888
80/tcp -> [::]:8888

docker update

docker update 命令用于更新一个或多个正在运行的容器的配置它可以用来改变容器的资源限制,如 CPU 和内存,或者调整容器的重启策略等。

以下是 docker update 命令的一些常用选项和示例:

  1. 更新 CPU 使用量限制
    使用 --cpus 选项来设置容器可使用的 CPU 核心数。
docker update --cpus=2 my_container

这会将 my_container 容器的 CPU 使用量限制设置为 2 个核心。
2. 更新内存使用限制
使用 --memory 选项来设置容器可使用的内存限制。你可以使用单位(如 MB、GB)来指定内存大小。

docker update --memory=512m my_container

这将把 my_container 容器的内存使用限制设置为 512MB。
3. 设置容器的重启策略
使用 --restart 选项来设置容器的重启策略。可能的值包括 no(不重启)、on-failure[:<max-retries>](出错时重启,最多重试次数)和 always(总是重启)。

docker update --restart=on-failure:3 my_container

这会将 my_container 容器的重启策略设置为在出错时重试 3 次。
4. 更新容器的网络设置
虽然 docker update 命令主要用于更新容器的资源限制和重启策略,但也可以用来更改容器的网络配置,例如添加或删除网络接口、更改 IP 地址等。具体的网络设置更新方法会根据你的网络配置和需求而有所不同。

需要注意的是,更新容器的配置可能会影响到容器内运行的应用程序和服务的性能和行为。因此,在执行 docker update 命令之前,最好先了解各个选项的作用,并测试其对容器和应用程序的影响。

另外,一些配置(如网络设置)可能需要在创建容器时就指定,而不是在容器运行后再进行更新。如果你发现某些配置无法通过 docker update 命令进行修改,可能需要考虑重新创建容器并指定正确的配置。

相关文章:

  • 机器学习:处理jira工单的分类问题
  • 复盘一下我用过的设计模式
  • 如何忽略Chrome最小字号的限制
  • 机器学习神经网络由哪些构成?
  • 计算机网络:现代通信的基石
  • 阿里云倚天云服务器怎么样?如何收费?
  • WPF---1.入门学习
  • 生产计划数据模型,实现能源企业数字化高效管理
  • FastAPI+React全栈开发05 React前端框架概述
  • 时序预测 | Matlab实现SSA-BP麻雀算法优化BP神经网络时间序列预测
  • SQLite3 数据库的基本操作
  • docker-面试题
  • 探讨大数据、云计算与物联网的融合与发展
  • 小程序配置服务器域名
  • 【微服务】Eureka(服务注册,服务发现)
  • __proto__ 和 prototype的关系
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 08.Android之View事件问题
  •  D - 粉碎叛乱F - 其他起义
  • es6要点
  • Hibernate【inverse和cascade属性】知识要点
  • Java 23种设计模式 之单例模式 7种实现方式
  • Mysql优化
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • 动态魔术使用DBMS_SQL
  • 基于遗传算法的优化问题求解
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • Spring第一个helloWorld
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​​​​​​​​​​​​​​Γ函数
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • # C++之functional库用法整理
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #单片机(TB6600驱动42步进电机)
  • #微信小程序:微信小程序常见的配置传值
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (libusb) usb口自动刷新
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (接口自动化)Python3操作MySQL数据库
  • (力扣)1314.矩阵区域和
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (南京观海微电子)——I3C协议介绍
  • (十一)c52学习之旅-动态数码管
  • (转)http协议
  • (转)Linq学习笔记
  • (转)甲方乙方——赵民谈找工作
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .NET CORE Aws S3 使用
  • .NET MVC第三章、三种传值方式
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET 中让 Task 支持带超时的异步等待
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法