华子目录
- Docker镜像操作
- Docker容器操作
- 查看docker网络`docker network ls`
Docker镜像操作
创建镜像
容器内容提交docker commit
docker commit
命令用于基于一个已存在的 Docker
容器来创建一个新的 Docker镜像
。当你修改了正在运行的容器(例如,在容器中安装了新的软件包或更改了配置文件),并希望保存这些更改为一个新的镜像时,你可以使用 docker commit
命令。
默认情况
下,容器被删除
后,在容器中的所有操作都会被清理
,包括要保存的文件
- 如果想
永久保存
,那么我们需要把动作提交
,提交后会生成新的镜像
- 当我们在
运行新生成的镜像
后,就会看到我们commit提交的内容
- 不管
容器有没有运行
,commit
都可以提交
命令的基本语法如下:
docker commit [OPTIONS] 旧容器名 [新镜像名[:TAG]]
其中:
-
OPTIONS
是可选参数,用于配置commit
的行为。-a
或--author
:设置新镜像的作者。-c
或--change
:应用Dockerfile
指令来创建镜像。-m
或--message
:设置commit
时的说明信息。-p
或--pause
:在commit
时,将容器暂停。这有助于减少在创建提交过程中遇到数据损坏的可能性。
-
CONTAINER
是你要基于其创建新镜像的容器的名称或 ID
。 -
REPOSITORY[:TAG]
是新镜像的仓库名和标签
。如果不指定标签,Docker
会使用默认的latest
标签。
示例
假设你有一个正在运行的容器,容器名
为test1
,你想将这个容器保存为一个新镜像,并命名为 exp_mysql
,标签为 v1
,同时添加提交人信息为 huazi
和说明信息为 add a new images
,你可以执行以下命令:
docker commit -a "huazi" -m "add a new images" test1 exp_mysql:v1
执行这个命令后,Docker
会基于test1
容器创建一个新的镜像
,名为 exp_mysql
,标签为 v1
,并且带有指定的作者和说明信息。
需要注意的是,使用 docker commit
创建的镜像通常不如使用 Dockerfile
创建的镜像透明和可维护
。Dockerfile
提供了更清晰的镜像构建历史和可重复性
。
[root@docker-node1 ~]# docker run -it --name test1 busybox
/ # touch file1 #创建file1
/ # ls
bin etc home lib64 root tmp var
dev file1 lib proc sys usr
/ # exit
[root@docker-node1 ~]# docker rm test1 #删掉容器后
test1
[root@docker-node1 ~]# docker run -it --name test1 busybox
/ # ls #发现file1文件不见了
bin etc lib proc sys usr
dev home lib64 root tmp var
/ #
[root@docker-node1 ~]# docker run -it --name test1 busybox
/ # ls
bin etc lib proc sys usr
dev home lib64 root tmp var
/ # touch file1
/ # s
sh: s: not found
/ # ls
bin etc home lib64 root tmp var
dev file1 lib proc sys usr
/ # exit #退出容器并停止容器
[root@docker-node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
#-a表示提交的作者,-m表示内容描述
[root@docker-node1 ~]# docker commit -a "huazi" -m "add file1" test1 busybox:v1
sha256:1c12e9bfbbbac10462a00344bf2aa6e8636c1139d01dfb395dd4ff5939466e3a
[root@docker-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox v1 1c12e9bfbbba 6 seconds ago 4.26MB
ubuntu latest edbfe74c41f8 8 weeks ago 78.1MB
busybox latest 65ad0d468eb1 16 months ago 4.26MB
[root@docker-node1 ~]# docker run -it --name test2 busybox:v1
/ # ls #运行commit提交后的镜像可以看到file1
bin etc home lib64 root tmp var
dev file1 lib proc sys usr
/ # exit
[root@docker-node1 ~]# docker history busybox:v1
IMAGE CREATED CREATED BY SIZE COMMENT
1c12e9bfbbba 7 minutes ago sh 25B add file1
65ad0d468eb1 16 months ago BusyBox 1.36.1 (glibc), Debian 12 4.26MB
- 此方法不利于
企业审计
,所以不推荐使用
,在企业中我们多用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
用于指定镜像的名称和标签。PATH
是 Dockerfile 所在的目录路径。Docker 会在该目录下查找名为Dockerfile
(默认的文件名,除非使用-f
参数指定了其他文件名)的文件,并按照其中的指令构建镜像。URL
是 Git 仓库的 URL,如果 Dockerfile 位于远程 Git 仓库中,可以通过这个 URL 直接构建。-
表示从标准输入(stdin)读取Dockerfile
内容,这通常与管道操作符|
结合使用,以便从其他命令的输出中直接构建镜像。
示例1:构建镜像并指定名称和标签
-t指定镜像名
docker build -t myimage:latest .
这条命令会在当前目录(.
表示当前目录
)下查找 Dockerfile
,并按照其中的指令构建一个新的镜像
,镜像的名称为 myimage
,标签为 latest
。
示例2:使用自定义的 Dockerfile
路径构建镜像
-f
指定dockerfile
的位置
docker build -t myimage:custom -f path/to/my/Dockerfile .
在这个例子中,-f
参数用于指定 Dockerfile
的路径为 path/to/my/Dockerfile
,而不是默认的 Dockerfile
。构建出的镜像名称和标签分别为 myimage
和 custom
。
示例3:构建时传递参数给 Dockerfile
--build-arg
指定键值对参数
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
:是否是官方镜像
的标志
。OK
:表示官方提供
[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
查看正在运行的容器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
[root@docker-node1 ~]# docker pull nginx:1.26-alpine
alpine
版本:nginx
镜像的最小安装
发型版本
镜像软连接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.0
的 myimage
镜像推送到你登录的 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 save -o
- 或者使用
docker image save -o
-o
指定导出镜像的位置
- 指定
.tar.gz
docker image save
是一个 Docker CLI 命令
,用于将指定的 Docker
镜像打包成一个 .tar
文件, 并保存到本地计算机上。这样, 你就可以在没有该Docker
环境的机器上导入和运行这个镜像,或者将其备份以供将来使用。
该命令的语法如下:
docker image save [OPTIONS] IMAGE [IMAGE...]
其中,OPTIONS
可以包括:
-o, --output
:指定输出文件名。
例如,要将名为 myimage
的 Docker镜像
保存到名为 myimage.tar.gz
的文件中,你可以运行以下命令:
docker image save -o myimage.tar.gz myimage
你也可以在同一命令中指定多个镜像名称,以将它们一起保存到归档文件中。例如:
docker image save -o multiple-images.tar.gz image1 image2 image3
- 这将把
image1
、image2
和image3
这三个镜像一起打包到multiple-images.tar.gz
文件中。
示例
:同时导出多个镜像
到一个文件
中
[root@docker-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest edbfe74c41f8 8 weeks ago 78.1MB
busybox latest 65ad0d468eb1 16 months ago 4.26MB
[root@docker-node1 ~]# docker save -o huazi.tar.gz ubuntu busybox
[root@docker-node1 ~]# ls
公共 音乐
模板 桌面 视频 图片 文档 下载
huazi.tar.gz
#将镜像删除
[root@docker-node1 ~]# docker rmi -f busybox:latest
[root@docker-node1 ~]# docker rmi -f ubuntu:latest
[root@docker-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
#导入镜像
[root@docker-node1 ~]# docker load -i huazi.tar.gz
f36fd4bb7334: Loading layer 80.56MB/80.56MB
Loaded image: ubuntu:latest
Loaded image: busybox:latest
[root@docker-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest edbfe74c41f8 8 weeks ago 78.1MB
busybox latest 65ad0d468eb1 16 months ago 4.26MB
- 总之,
docker save -o
命令提供了一种方便的方式来备份和传输 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 3月 24 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 3月 24 11:36 nginx.tar.gz
-rw-r--r-- 1 root root 77M 3月 24 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 3月 24 11:37 docker-nginx.gz
-rw------- 1 root root 290M 3月 24 11:36 nginx.tar.gz
-rw-r--r-- 1 root root 77M 3月 24 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 3月 24 11:37 docker-nginx.gz
-rw------- 1 root root 619M 3月 24 12:25 mysql.tar.gz
-rw------- 1 root root 290M 3月 24 11:36 nginx.tar.gz
-rw-r--r-- 1 root root 77M 3月 24 11:33 ubuntu.tar.gz
保存所有镜像
[root@docker-node1 ~]# docker save `docker images | awk 'NR>1{print $1":"$2}'` -o images.tar.gz
[root@docker-node1 ~]# docker images | awk 'NR>1{print $1":"$2}'
ubuntu:latest
busybox:latest
删除镜像docker rmi -f
- 或者:
docker image rm -f
-f
表示强制删除
删除Docker
镜像的方法有多种,以下是一些常见的操作:
-
使用
镜像ID或镜像名
进行删除:docker rmi [镜像ID]
docker rmi [镜像名:标签]
-
强制删除
镜像:docker rmi -f [镜像ID或镜像名]
-
删除所有未使用的镜像:
使用
docker image prune
命令可以清理所有未被容器引用的镜像。
docker image prune
-
删除所有镜像
(包括正在使用的):
这是一个较为危险的操作,因为它会删除所有镜像,包括那些正在被容器使用的镜像。docker rmi $(docker images -q)
-
批量删除
特定时间
前的镜像:
使用过滤器可以删除所有创建时间超过特定时长的镜像。docker image prune -a --filter "until=168h"
上面的命令会删除所有创建时间超过168小时(7天)的镜像。
-
清理
虚悬镜像
:
虚悬镜像通常是构建过程中留下的,没有标签的镜像。可以使用docker image prune
命令进行清理。docker image prune
-
查看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 load -i
- 或者使用
docker image load -i
docker image load
是一个 Docker CLI 命令
,用于将以前使用 docker save
命令保存的镜像加载到 Docker
中。这个命令可以将 .tar.gz
或.tar
文件中存储的一个或多个 Docker镜像
恢复为其原始状态,并将其添加到本地 Docker镜像库
中。
通常,你可能会先使用 docker save
命令将一个或多个镜像保存到一个 .tar
或.tar.gz
文件中,以便在没有直接访问 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 3月 24 11:37 docker-nginx.gz
-rw------- 1 root root 619M 3月 24 12:25 mysql.tar.gz
-rw------- 1 root root 290M 3月 24 11:36 nginx.tar.gz
-rw-r--r-- 1 root root 77M 3月 24 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 3月 24 11:37 docker-nginx.gz
-rw------- 1 root root 619M 3月 24 12:25 mysql.tar.gz
-rw------- 1 root root 290M 3月 24 11:36 nginx.tar.gz
-rw-r--r-- 1 root root 77M 3月 24 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 run
- 进入到容器中,按
ctrl+d
或exit
退出并停止容器,按ctrl+p+q
退出但不停止容器
Docker运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker会从镜像仓库下载该镜像。
方法1
- 使用
docker run
- 或者使用
docker container run
docker run
是 Docker 命令行接口(CLI)中用于创建并启动新容器的命令。使用 docker run
,您可以基于指定的镜像来运行一个新的容器实例,并可以传递各种参数来配置容器的行为。
下面是 docker run
的基本语法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS
:这是可选的,用于配置容器的行为。例如,您可以设置端口映射、环境变量、卷挂载等。IMAGE
:指定要基于哪个镜像来创建并启动容器。COMMAND
:在容器内部要执行的命令。如果镜像定义了默认的命令,那么这个COMMAND
可以省略。ARG
:传递给COMMAND
的参数。
示例
- 运行一个基于
ubuntu
镜像的容器,并启动 bash shell:
docker run -it ubuntu bash
这里 -it
选项用于保持容器的标准输入(stdin)打开,并分配一个伪终端(pseudo-TTY)。
- 在后台运行一个基于
nginx
镜像的容器,并映射端口:
docker run -d -p 8080:80 nginx
这里 -d
选项用于在后台运行容器,-p 8080:80
将容器的 80 端口映射到主机的 8080 端口。
- 设置环境变量并运行容器:
docker run -e MY_VAR=myvalue ubuntu echo $MY_VAR
这里 -e MY_VAR=myvalue
设置了一个环境变量 MY_VAR
,并在容器内执行 echo $MY_VAR
命令。
- 挂载卷并运行容器:
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 rm -f
要删除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)
这将会强制删除所有容器,所以请确保你真的想要这么做。
删除所有停止的容器docker container prune
[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。可以指定多个容器来同时启动它们。
示例
- 启动名为
mycontainer
的容器:
docker start mycontainer
- 启动多个容器:
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 inspect 容器名
- 或使用
docker container 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
命令的选项,用于定制进程的显示方式。
示例
-
查看容器中的进程
使用
docker top
命令查看名为mycontainer
的容器中的进程:docker top mycontainer
这将返回容器内所有正在运行的进程列表,包括进程 ID、进程名称等。
-
查看进程并提取 CPU 和内存信息
你可以结合其他命令(如
awk
)来提取docker top
的输出中的特定信息,比如 CPU 和内存使用情况:docker top mycontainer | awk '{print $2, $3, $9, $10}'
这条命令将输出进程名称、PID、CPU 占用率和内存占用率。
-
使用选项查看特定信息
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 C
STIME TTY TIME CMD
root 38619 38580 0
15:53 pts/0 00:00:00 nginx: master process nginx -g daemon off;
101 38647 38619 0
15:53 pts/0 00:00:00 nginx: worker process
101 38648 38619 0
15: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
命令在容器内运行其他命令,比如 ps
、kill
等。
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:查看容器的日志
显示在容器中使用过的命令
[root@docker-node1 ~]# docker logs test1
/ # touch file1
/ # ls
bin etc home lib64 root tmp var
dev file1 lib proc sys usr
/ #
/ #
/ # ls
bin etc home lib64 root tmp var
dev file1 lib proc sys usr
/ # exit
/ #
/ #
/ # ls
bin etc home lib64 proc sys usr
dev file1 lib passwd root tmp var
/ # exit
示例2:实时查看容器的日志
-f
实时查看
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 或名称,并且可以指定多个容器。
使用示例
- 首先,启动一个 Docker 容器,并给它一个名称,例如
my_container
:
docker run --name my_container -dit ubuntu bash
- 然后,使用
docker wait
命令等待这个容器退出:
docker wait my_container
此时,docker wait
命令会阻塞,直到 my_container
容器停止运行。一旦容器停止,docker wait
会打印出容器的退出代码。
- 你可以在另一个终端窗口中停止
my_container
容器,例如使用docker stop
命令:
docker stop my_container
当容器停止后,之前运行的 docker wait
命令会退出并打印出容器的退出代码。
注意事项
docker wait
命令不会显示容器内部的日志或输出,它只关注容器的运行状态和退出代码。- 如果容器已经在运行并且没有退出,
docker wait
命令会阻塞直到容器退出。 - 退出代码通常用于表示容器执行的结果,例如 0 通常表示成功,非零值表示出错或异常。
通过使用 docker wait
命令,你可以确保在容器完成其任务并退出之前,其他依赖于该容器状态的操作不会继续执行。这对于构建自动化脚本和容器编排非常有用。
进入容器docker exec
- 在使用
-d
参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作 - 这个时候如果需要进入容器进行操作,推荐使用官方的
attach
或exec
命令
docker exec
是一个 Docker 命令,用于在正在运行的容器中执行命令。它允许你在容器的上下文中运行任何命令,就像你在容器的 shell 中手动执行一样。这对于需要在运行中的容器中进行诊断、调试或执行其他任务时非常有用。
基本语法如下:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
其中:
OPTIONS
:是可选的,用于配置docker exec
命令的行为。CONTAINER
:是要在其中执行命令的容器的名称或ID。COMMAND
:是要在容器内执行的命令。ARG...
:是传递给命令的参数。
常用选项
-i
:保持标准输入打开,通常与-t
一起使用,以便与容器进行交互。-t
:分配一个伪终端,这通常用于创建一个交互式的 shell 会话。-d
:在后台运行命令。-u
:以指定的用户身份执行命令。-e
:设置环境变量。
示例
- 在容器中启动交互式 bash shell:
docker exec -it mycontainer /bin/bash
这将在名为 mycontainer
的容器中启动一个交互式的 bash shell,允许你与容器进行交互。
- 在容器中执行单个命令:
docker exec mycontainer ls -l
这将在 mycontainer
容器中执行 ls -l
命令,并显示结果。
- 在容器中执行多个命令:
如果你想在容器中执行多个命令,你需要将它们连接起来并通过 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 attach 容器名
容器
必须处于运行状态
,才能进入
[root@docker-node1 ~]# docker run -it --name test1 busybox
/ # ls
bin etc lib proc sys usr
dev home lib64 root tmp var
/ # [root@docker-node1 ~]# #在容器中按ctrl+p+q,退出容器但不停止容器
[root@docker-node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9417aeb1a704 busybox "sh" 13 seconds ago Up 12 seconds test1
[root@docker-node1 ~]# docker attach test1
/ #
导出容器docker export
docker export
命令用于将 Docker 容器的文件系统导出为一个 tar 归档文件。这对于备份容器状态、迁移容器到其他机器或共享容器的文件系统非常有用。
基本语法如下:
docker export [OPTIONS] CONTAINER
其中 CONTAINER
是要导出文件系统的容器的名称或 ID。
选项
-o
或--output
:用于指定输出的文件名或路径。如果不指定,tar 归档文件将默认输出到标准输出(stdout)。
使用示例
-
导出容器到标准输出
将名为
mycontainer
的容器的文件系统导出到标准输出,并将输出重定向到一个 tar 文件:docker export mycontainer > mycontainer.tar
-
导出容器到指定文件
使用
-o
选项直接将容器导出到指定的 tar 文件:docker export -o mycontainer.tar mycontainer
-
按日期保存为 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.2
root@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 cp
命令用于在 Docker容器
与宿主机
之间复制文件或目录
。这个命令允许你将文件或目录
从容器
内部复制到主机
上,或者将文件或目录
从主机
复制到容器内部
。
命令的基本语法如下:
- 从
容器
复制到宿主机
:docker cp 容器名:文件路径 宿主机文件路径
- 从
宿主机
复制到容器
:docker cp 主机文件路径 容器名:文件路径
此外,docker cp
命令还支持一些可选参数:
-a
:将复制的文件或目录保留其原始属性
,包括所有者、权限
等。-R
或-r
:递归复制整个目录。
容器文件
复制到宿主机
中
[root@docker-node1 ~]# docker run -it --name test1 busybox
/ # touch file1
/ # ls
bin etc home lib64 root tmp var
dev file1 lib proc sys usr
/ # [root@docker-node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
88d84997a34a busybox "sh" 22 seconds ago Up 22 seconds test1
#将file1文件cp到宿主机的/mnt/目录下
[root@docker-node1 ~]# docker cp test1:/file1 /mnt/
Successfully copied 1.54kB to /mnt/
[root@docker-node1 ~]# cd /mnt/
[root@docker-node1 mnt]# ls
file1
宿主机文件
复制到容器
中
[root@docker-node1 ~]# docker attach test1
/ # ls
bin etc home lib64 root tmp var
dev file1 lib proc sys usr
/ # exit
[root@docker-node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@docker-node1 ~]# docker cp /etc/passwd test1:/
Successfully copied 4.1kB to test1:/
[root@docker-node1 ~]# docker start test1
test1
[root@docker-node1 ~]# docker attach test1
/ # ls
bin etc home lib64 proc sys usr
dev file1 lib passwd root tmp var
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
命令的一些常用选项和示例:
- 更新 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
命令进行修改,可能需要考虑重新创建容器并指定正确的配置。
查看docker网络docker network ls
- 默认三种:
bridge,host,none
[root@docker-node1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
a8f12037d66a bridge bridge local
9e9eece569ee host host local
ab1eb22d876a none null local