知识点4---Docker命令使用

在学习使用Docker命令之前,要明白一点,Docker或者说软件虚拟化,它本质上只是宿主机的一个隔离进程,比不上完全独立出来的虚拟机,当然这里说的完全也是相对的,如果你网安技术非常牛,硬件辅助虚拟化也是可以被越狱的。对于常规开发者而言,docker操作的容器更偏向于即插即用的一种程序,用来专门运行某一个服务,也就是说容器自身并没有自己独立的系统内核,它们与宿主机共享同一个操作系统内核,因此某些功能或者说是系统模块在容器中并不具备,比如linux的系统管理命令systemctl在容器中并不允许运行,会报错给你相关提示

有别于kvm、vmware这种自身命令核心能力非常直白,甚至有图形化界面,且使用多数聚焦在虚拟化结果物上的硬件虚拟化软件。docker作为一款软件虚拟化,自身操作的使用占比在工作中就明显有一定的分量,它的命令格式为docker [command],总体上分几大类操作。

1、容器运行时命令,容器生命周期管理(运行/停止/暂停/恢复),docker run、docker stop、docker pause、docker unpause

2、容器文件操作,主机与容器间文件复制,docker cp [主机路径] [容器ID:容器路径]

3、容器状态监控,查看容器日志、资源占用、元数据,docker logs、docker inspect、docker stats

4、容器镜像管理,镜像构建(提交运行中容器或Dockerfile)、标签管理、仓库上传/下载,docker commit、docker build、docker tag、docker push/pull

5、镜像仓库操作,登录/登出仓库、镜像搜索,docker login/logout、docker search

6、离线镜像处理,镜像导出为TAR包或从TAR包导入,docker save、docker load

7、Docker Daemon操作,查看版本、事件监控、服务参数,docker version、docker events、docker info

8、这里要单独讲一个进入容器的命令,docker attach (以附加的方式进入容器),需谨慎使用,它有很大的风险,当附加到无交互式Shell环境的容器时,极端情况会导致容器卡死。通俗的讲无交互式容器指被做成专门启动某个服务的镜像所实例化的容器,且这些镜像通常采用前台方式启动该服务,比如tomcat、nginx等都是这样,就导致它运行状态下没有合适的交互shell预备环境,此时当你以附加的方式进入,相当于截断了该容器本来的进程,把它嫁接到你打开的会话进程上,在嫁接过程中容器会卡顿一下,此时只要出现一点意外就极容易坏事。因此本文在此也提醒大家,在后续使用封装自己镜像时,一定要预留可操作的抗风险空间,能用后台启动的命令,就不要用前台启动


下面开始正式介绍这些命令如何使用

1、docker的基石是镜像,没有镜像一切都白搭,从远程仓库中拉取一个镜像使用 pull 命令

bash 复制代码
[root@hdp3 ~] docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete 
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

pull命令可携带的参数:
--all-tags 基本不用,在没有明确镜像版本时默认下载最新版,当携带这个参数则意味着下载目标镜像的所有版本,如果你显示携带版本的同时带了这个参数,会报错提示你命令语境互斥
--disable-content-trust  跳过镜像签名认证检查,默认是不跳过的,基本不用
--platform string  默认docker会拉取符合你当前系统的镜像,通过这个参数可以改变这一动作,基本不用,比如在x86部署机上拉取arm64的 docker pull --platform linux/arm64 ubuntu:22.04

要注意,拉取时,镜像名称的完整格式是[仓库地址/][命名空间/]镜像名称[:标签],有3中可用写法

bash 复制代码
nginx  默认 Docker Hub 官方镜像,或你配置文件中配置的镜像加速器,无命名空间,直接就是镜像名称
rancher/hello-world	 同上默认 Docker Hub或你的加速器,但此时rancher会被先尝试是否是个镜像源地址,随后尝试是否是个命名空间
docker-0.unsee.tech/rancher/hello-world  正常识别仓库地址、命名空间、镜像名称,但要注意这种方式会同时搜索出没有命名空间的目标名称镜像

2、如果你不清楚你的镜像有那些版本,或者镜像全称是什么,可以搜索

bash 复制代码
docker search [OPTIONS] 名称(常用书写格式同pull)
支持的参数:
--filter filter  给搜索添加条件,支持的配置值可以网上搜,让用的是 is-official=true 官方镜像 stars=3000 收藏大于3000,注意只有大于的作用但是命令里要写等于号
--limit int  只显示多少个
--format string 结果列格式化,其实就是结果中的那几列怎么输出,这个基本不用,它有几个可用的枚举值可以网上搜一下

注意,搜索命令在国内使用有个小问题,它不受你配置文件中写的加速器影响,而是直接连接docker hub官方仓库查询,因此你直接写一个例如 hello-world 这样的镜像名称,会发现一直403,这是它和pull中书写镜像名称的一个重要区别

有两种解决方法,第一种是使用上面提到的格式,现实携带国内支持检索的镜像源地址为前缀

bash 复制代码
[root@node1 ~]# docker search docker-0.unsee.tech/hello-world
NAME                                DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
hello-world                         Hello World! (an example of minimal Dockeriz...   2542      [OK]       
rancher/hello-world                 This container image is no longer maintained...   6                    
okteto/hello-world                                                                  0                    
atlassian/hello-world                                                               3                    
goharbor/hello-world                                                                0                    
tutum/hello-world                   Image to test docker deployments. Has Apache...   91                   [OK]
dockercloud/hello-world             Hello World!                                    20                   [OK]
crccheck/hello-world                Hello World web server in under 2.5 MB          25                   [OK]
koudaiii/hello-world                                                                0                    
ppc64le/hello-world                 Hello World! (an example of minimal Dockeriz...   2                    
prajwalendra/hello-world                                                            0                    
tsepotesting123/hello-world                                                         0                    
kevindockercompany/hello-world                                                      0                    
infrastructureascode/hello-world    A tiny "Hello World" web server with a healt...   1                    [OK]
arm32v7/hello-world                 Hello World! (an example of minimal Dockeriz...   3                    
cloudflare/hello-world              A simple example application which can be ru...   0                    
datawire/hello-world                Hello World! Simple Hello World implementati...   1                    [OK]
arm64v8/hello-world                 Hello World! (an example of minimal Dockeriz...   3                    
twistlocktest/hello-world                                                           0                    
uniplaces/hello-world                                                               0                    
wjimenez5271/hello-world                                                            0                    
danfengliu/hello-world                                                              0                    
lbadger/hello-world                                                                 0                    
ansibleplaybookbundle/hello-world   Simple containerized application that tests ...   0                    
swarna3005/hello-world  

第二种方法,是你开启你的翻墙软件,登录docker hub官方镜像仓库https://hub.docker.com/去查询镜像
3、查看当前有那些镜像

bash 复制代码
#等价于 docker image list 效果是一样的
[root@hdp3 ~] docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
centos       latest    5d0da3dc9764   14 months ago   231MB

--all  基本不用,默认docker只显示顶层镜像,也就是你拉取到的那个最终镜像,携带它会展示一下镜像的中间层,这个中间层的概念后面我介绍docker file的时候会提到,现在知道有这个东西就行
--digests  现实镜像摘要,这个参数通常只有你需要看镜像的完整ID时才用
--no-trunc  不截断输出,同上也是看完整ID用的
--filter filter 过滤条件
--format string 格式化
--quiet 只显示镜像id

其实通过结果就会发现,docker的镜像文件比VMware的虚拟机需要小多了,当然这主要是镜像并不能算是具备一个完整的内核

4、删除镜像,使用镜像ID的缩写即可

bash 复制代码
[root@node1 ~]# docker rmi cab3bc026f39
Untagged: docker-0.unsee.tech/rancher/hello-world:latest
Untagged: docker-0.unsee.tech/rancher/hello-world@sha256:4b1559cb4b57ca36fa2b313a3c7dde774801aa3a2047930d94e11a45168bc053
Deleted: sha256:cab3bc026f39f4070347ea317ad92a50ffac666454de81dc838b7d5e0cf8173d
Deleted: sha256:d54520a842e41bcfc46b12db7a40602289561d94b409d9f63cc6a624810222bc
Deleted: sha256:66956ff334b1c456832889bbbc6eb62a7d8c9846efe8ce9b5b4efb1fdfeecbf2
Deleted: sha256:2e8132cb699c311411af09d07587542a0b099aaf1fa07423c36afe26c683daaa
Deleted: sha256:cd7100a72410606589a54b932cabd804a17f9ae5b42a1882bd56d263e02b6215

可用参数:
--no-prune     不删除未标记的父镜像,基本不用
--force   强制删除,最常用,因为当一个镜像有容器实例时,默认不允许删除镜像

5、新建容器并启动运行,run命令有很多参数,具体打大家自己 help 去看,这里只列举常用的那么几个

bash 复制代码
[root@hdp3 ~] docker run -it --name mycentos centos
[root@64fb7232d515 /] 
[root@64fb7232d515 /] ls
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
[root@64fb7232d515 /]# exit
exit

注意,退出镜像其实和退出shell进程一样用exit即可,且可以携带退出码,会被记录到,容器本身就是个被隔离的进程。但是exit退出的同时会停止容器
还有不要只带 -t 不带 -i,那会导致虽然有伪终端,启动时进入容器,但是容器不响应你的操作

常用参数:
--name:为容器指定名称
--hostname :容器的主机名
-it:分配伪终端并保持STDIN打开(交互式运行),说白了容器创建后会直接进入容器,并在后续使用中也可以正常再次进入,-i 本身意思是以交互式的方式进入 ,-t 是分配一个伪终端,但是你就记住一句话,它俩要使用一起用,不能单独用,会出问题
--privileged:赋予容器全部权限,也叫特权模式容器,就可以在容器内使用同宿主机95%相似的能力
--cidfile:将容器ID写入指定文件,通常写一写运维脚本的时候会场用到这个参数
-e/--env:设置环境变量 ,比如 -e DB_PORT=3306 或者 -e PATH (这种不直接赋值的会默认用宿主机的)
-v/--volume:挂载数据卷,比如 -v /host/config:/app/config:ro 数据卷这个东西我后面会说,现在知道有这个东西就行,它可以把宿主机上的一些路径映射到容器里
-P和-p:容器端口映射到宿主机,格式为 宿主机端口:docker容器端口 ,通常用 -p 不用 -P (随机映射)
-d 用守护进程的方式创建容器
--volumes-from 复用一个容器的配置
--memory 1g    硬限制容器内存上限
--memory-reservation 1g  软限制容器内存上限,如果宿主机内存充足则可以超过,否则被限制到这个限度下
--memory-swap 1g  加上交换内存的,硬限制容器内存上限,使用该参数必须携带--memory 且值要大于--memory
--memory-swappiness  同理
--cpus 1.5 最多使用多少和cpu核心,类型是个小数
--cpu-shares  200   cpu使用权重,配合使用,当cpu资源紧张时权重大的优先

重点一是守护进程启动,在日常使用中我们不可能每次创建一个容器都去手动用快捷键退出,守护进程的方式可以让docker以非交互式的方式创建一个容器,但是有个非常重要的点要注意,如镜像中没有支撑持久化服务的启动命令,且你在创建容器时也没有给,则创建出来的容器会自动关闭并退出,且永远无法正常启动,也就是个废容器

bash 复制代码
#这样启动结果会是个废容器
[root@hdp3 ~] docker run -d centos
7cabf0e3224fe643c1cf7a5c37be51f1d38af5d6b9f443aa92541f463ff7a89f

[root@hdp3 ~] docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

[root@hdp3 ~] docker ps -n 1
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                     PORTS     NAMES
7cabf0e3224f   centos    "/bin/bash"   2 minutes ago   Exited (0) 2 minutes ago             agitated_galileo

正确的守护进程创建有两种方式

bash 复制代码
# 方式一:创建的同时传入一个能持久运行的命令
[root@node1 ~]# docker run --name m3 -d centos /bin/sh -c "while true; do echo 'Container running'; sleep 10; done"
c1019a40eabbfb7ed79ae6c5267b7ed78fde7e1338ff0c4094292ac3473cbbbf
[root@node1 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
c1019a40eabb   centos    "/bin/sh -c 'while t..."   7 seconds ago   Up 7 seconds             m3
[root@node1 ~]# docker logs c1019a40eabb
Container running
Container running


# 方式二:分配一个伪终端
[root@node1 ~]# docker run --name m4 -itd centos
16e790f68307b9d536b92067f8cf8792d6bd25c5f448715d3142a3462d5d73b5
[root@node1 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
16e790f68307   centos    "/bin/bash"              3 seconds ago    Up 2 seconds              m4
c1019a40eabb   centos    "/bin/sh -c 'while t..."   5 minutes ago    Up 5 minutes              m3

重点二是特权模式,它启动的容器也叫做特权容器,可以使用systemctl等系统命令,这里要说的是特权模式启动,如果不用守护进程方式,则会出现阻塞进程的情况,并且只能ctrl+c退出当前进程,但容器很可能会被关闭,从而导致后续使用该特权容器出现问题。所以各位读者就记住一句话,特权容器必须使用守护进程创建

bash 复制代码
# 这里的 /usr/sbin/init 和上面创建时传入一个命令持久化一个意思,这里传入的是 /usr/sbin/init 命令,该命令在常规启动服务器linux系统时会由内核自动调用,并常驻内存,是所有linux进程的顶级父进程
docker run -d --privileged=true centos:7.8.2003 /usr/sbin/init

而且特权容器,连接时必须指定登录口,也就是说特权模式只能用 exec 命令进入,至于登录口如/bin/bash

bash 复制代码
docker exec -it f063be0bd990 /bin/bash

注意,各位读者先知道特权模式启动参数如何用,先不要实际自己上手操作,因为流程上有个小尾巴,一起放在后面容器直连知识点中介绍。至于exec命令是用来从宿主机进入容器的,下面会介绍

6、查看当前有那些容器使用 ps

bash 复制代码
[root@node1 ~]# docker ps --all
CONTAINER ID   IMAGE          COMMAND       CREATED             STATUS                         PORTS     NAMES
cc9c78fa95a8   centos         "/bin/bash"   2 minutes ago       Exited (0) 2 minutes ago                 mycentos
92ced11329dd   48b5124b2768   "/hello"      About an hour ago   Exited (0) About an hour ago             compassionate_morse

注意,`IMAGE`的值跟着你实例化容器时指定的镜像值不同而不同,比如我指定的是centos这个镜像名字,如果我指定的是镜像的`IMAGE ID`那该值就等于`IMAGE ID`

常用参数:
-a/--all:显示所有容器(包括停止的)
--filter:按条件过滤输出
--format:自定义输出格式(table/json等)
-n/--last:显示最后创建的n个容器
-l/--latest:显示最新创建的容器
--no-trunc:不截断输出
-q/--quiet:仅显示容器ID
-s/--size:显示文件总大小

7、退出容器的两种方式

方式一:容器停止并退出

bash 复制代码
[root@64fb7232d515 /] exit
exit
[root@hdp3 ~] docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

方式二:在容器的会话界面使用快捷键Ctrl+P+Q,容器不停止,只是你退出了。有一个个人经验告诉大家,按快捷键的时候快一点,且快捷键组成的顺序按,慢了或者一起按都识别不到退不出去,就很怪

bash 复制代码
[root@hdp3 ~] docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
709a23ef0ee6   centos    "/bin/bash"   5 minutes ago   Up 5 minutes             mycentos01

8、启动和停止容器

bash 复制代码
[root@node1 ~]# docker stop 0d72382bc702
0d72382bc702
[root@node1 ~]# docker start 0d72382bc702
0d72382bc702

关闭时,强制关闭用 docker kill 容器id 命令

启动时有一个参数 -a 其实就是附加(attach命令),上面说过对非交互式使用有风险,这点要注意

9、进入容器的方式有两种,它们之间存在着差异

方式一:attach,和start命令的 -a 是同一个能力,使用时注意风险,或者你就记住除非有明确需求,否则永远不要用这种方式进入容器,你就当不知道有这种进入方式

bash 复制代码
[root@hdp3 ~] docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
b76a1b5188ce   centos    "/bin/bash"   2 minutes ago   Up 2 minutes             vigilant_bouman

[root@hdp3 ~] docker attach b76a1b5188ce

[root@b76a1b5188ce /]

方式二:exec,这种方式是普遍用的进入方式,但默认情况下并不会进入容器,而是把命令交给容器,并拿到结果

bash 复制代码
[root@hdp3 ~] docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
b76a1b5188ce   centos    "/bin/bash"   7 minutes ago   Up 7 minutes             vigilant_bouman

[root@hdp3 ~] docker exec b76a1b5188ce ls -l /tmp
total 12
-rwx------ 1 root root 701 Sep 15  2021 ks-script-4luisyla
-rwx------ 1 root root 671 Sep 15  2021 ks-script-o23i7rc2
-rwx------ 1 root root 291 Sep 15  2021 ks-script-x6ei4wuu

#这种使用方式下,当你想看容器中的进程,可以用 docker top 也可以用 docker exec 容器 ps -ef

如果你想以交互式的方式进入,则携带 it 参数的同时,将bash解析器显示调用的命令传递给容器。这样进入的会话进程完全独立且独属于你,你退出时该会话进程也就没了,不影响主会话进程。如果你需要可以使用--privileged以特权模式进入一个已有的容器

bash 复制代码
[root@hdp3 ~] docker exec -it b76a1b5188ce /bin/bash
[root@b76a1b5188ce /]

10、删除容器使用 rm 命令

bash 复制代码
[root@node1 ~]# docker rm cc9c78fa95a8 92ced11329dd
cc9c78fa95a8
92ced11329dd

注意,多个容器挨着写就行,空格分割,如果容器正在执行可以用 -f  参数强制删除,如果批量删除的容器id是处理出来的,则尽量使用 docker rm$(docker ps -a -q) 这种写法,不要用管道。其他对于docker的批量操作也都是如此

11、查看Docker容器的详细信息,包括容器配置、网络设置、挂载卷等元数据

bash 复制代码
docker inspect <容器ID或容器名称>

[root@node1 ~]# docker inspect 6b00d3f5b77c
[
    {
        "Id": "6b00d3f5b77c0513ae7e0045705a47a4eb6e2cf826deebd3b02d9f5faf604063",
        "Created": "2026-03-11T16:03:21.505110355Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 4634,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2026-03-11T16:03:49.085969421Z",
            "FinishedAt": "2026-03-11T16:03:24.70122309Z"
        },
        "Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
        "ResolvConfPath": "/opt/docker/containers/6b00d3f5b77c0513ae7e0045705a47a4eb6e2cf826deebd3b02d9f5faf604063/resolv.conf",
        "HostnamePath": "/opt/docker/containers/6b00d3f5b77c0513ae7e0045705a47a4eb6e2cf826deebd3b02d9f5faf604063/hostname",
        "HostsPath": "/opt/docker/containers/6b00d3f5b77c0513ae7e0045705a47a4eb6e2cf826deebd3b02d9f5faf604063/hosts",
        "LogPath": "/opt/docker/containers/6b00d3f5b77c0513ae7e0045705a47a4eb6e2cf826deebd3b02d9f5faf604063/6b00d3f5b77c0513ae7e0045705a47a4eb6e2cf826deebd3b02d9f5faf604063-json.log",
        "Name": "/mycentos",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": [
            "e326e057713637ea70bcf1030928b38a7d2413f228729d4a3d38715eedca0eb6"
        ],
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "ConsoleSize": [
                24,
                80
            ],
            "CapAdd": null,
            "CapDrop": null,
            "CgroupnsMode": "host",
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "private",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": [],
            "BlkioDeviceWriteBps": [],
            "BlkioDeviceReadIOps": [],
            "BlkioDeviceWriteIOps": [],
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": null,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "MaskedPaths": [
                "/proc/asound",
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",
                "/proc/sched_debug",
                "/proc/scsi",
                "/sys/firmware"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/opt/docker/overlay2/6d24ef0bb947f58a3e4630f2e9b816d96ccee37034d88d361e197a3ea2cd31b4-init/diff:/opt/docker/overlay2/cf06ff036862f5cd58bbe1239715256254d924f1d47fdfbc0705a1338e42c339/diff",
                "MergedDir": "/opt/docker/overlay2/6d24ef0bb947f58a3e4630f2e9b816d96ccee37034d88d361e197a3ea2cd31b4/merged",
                "UpperDir": "/opt/docker/overlay2/6d24ef0bb947f58a3e4630f2e9b816d96ccee37034d88d361e197a3ea2cd31b4/diff",
                "WorkDir": "/opt/docker/overlay2/6d24ef0bb947f58a3e4630f2e9b816d96ccee37034d88d361e197a3ea2cd31b4/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "6b00d3f5b77c",
            "Domainname": "",
            "User": "",
            "AttachStdin": true,
            "AttachStdout": true,
            "AttachStderr": true,
            "Tty": true,
            "OpenStdin": true,
            "StdinOnce": true,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "centos",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20210915",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS"
            }
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "21a950417c9f61302cf30bc6f359392309b9387fca6a4855a8fbf6b94c98b0ac",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/21a950417c9f",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "1ce0320c37db9144594e75a24f03c41e9041f14e01f45534e5670c5a0fe344ed",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "6101850c4353ee9aaaa21394ccc1bc1b801aab1c873d9a4b195a3259676d805c",
                    "EndpointID": "1ce0320c37db9144594e75a24f03c41e9041f14e01f45534e5670c5a0fe344ed",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]

返回JSON格式的详细容器信息

Id:容器的完整哈希ID

Name:容器的名称

Pid:容器进程在主机上的PID(如72607),关闭的容器是 0

IPAddress:容器IP

Gateway:网关

MacAddress:MAC地址

IPPrefixLen:子网掩码网络ID位的长度

Env:容器的PATH、NGINX_VERSION等环境变量

Cmd:默认的容器启动命令为,比如["nginx","-g","daemon off;"]

Image:使用的镜像

Labels:镜像维护者信息等元数据

LowerDir:基础镜像层路径

UpperDir:容器可写层路径

MergedDir:统一视图路径

WorkDir:工作目录路径

运行时信息:

Running:是否运行中的布尔值

Status字段显示为"running"表示容器正在运行,关闭的容器显示的是退出码

Created字段记录容器创建时间:"2023-07-15T02:14:24.508115644Z"

StartedAt字段记录容器启动时间:"2023-07-15T02:14:24.973205153Z"

FinishedAt字段为"0001-01-01T00:00:00Z"表示容器尚未停止

驱动配置消息:

ResolvConfPath:DNS解析配置文件路径"/var/lib/docker/containers/.../resolv.conf"

HostnamePath:主机名配置文件路径"/var/lib/docker/containers/.../hostname"

HostsPath:hosts文件路径"/var/lib/docker/containers/.../hosts"

LogPath:日志文件路径"/var/lib/docker/containers/.../json.log"

NetworkSettings:包含网关IP(如172.17.0.1)、网络模式等信息

使用技巧

查看特定字段:可以通过--format参数过滤特定信息,例如docker inspect --format='{``{.NetworkSettings.IPAddress}}' <容器ID>

批量查看:可以同时查看多个容器的信息,只需在命令后添加多个容器ID

12、查询一个容器实际使用宿主机多少资源

bash 复制代码
docker stats [--no-stream] <容器ID>

--no-stream:只显示第一次结果,不持续监控,不加这个参数会保持在动态显示资源使用情况的状态

#信息依次为 容器ID 、名称 、使用宿主机CPU资源占比 、当前内存使用量 / 最大可用内存限制 、内存使用百分比、网络输入/输出数据量、块设备读写数据量(磁盘读写)、容器内运行的进程数
[root@node1 ~]# docker stats 6b00d3f5b77c --no-stream
CONTAINER ID   NAME       CPU %     MEM USAGE / LIMIT     MEM %     NET I/O     BLOCK I/O   PIDS
6b00d3f5b77c   mycentos   0.00%     1.055MiB / 7.777GiB   0.01%     656B / 0B   0B / 0B     2

13、如果你有非常多的镜像,比如你在尝试某个软件不同版本中的一个bug,测试完成后,留下的没有容器使用的镜像,甚至是推送远程docker仓库后会留下很多同名临时镜像,docker提供了批量删除命令

bash 复制代码
#删除所有未被容器使用的镜像(会提示确认),使用的时候要带上 -a ,不然只会删除悬空的镜像。悬空镜像说的是重复构建同标签镜像,或删除了标签的镜像
docker image prune -a

除了批量删除没有引用的镜像,docker还提供了批量删除其他同样无引用资源的命令

bash 复制代码
容器清理:docker container prune:删除所有停止运行的容器
卷清理:docker volume prune:删除所有未被挂载的卷
网络清理:docker network prune:删除所有未使用的网络
全局清理:docker system prune:一键清理所有类型资源(容器、网络、镜像、缓存等)

建议大家后期使用,定期使用docker stats监控容器资源使用情况,执行清理命令前务必确认要删除的资源,特别是生产环境,当主机存储空间不足时,可优先考虑清理未使用的镜像和卷

14、容器的挂起和回复

bash 复制代码
#挂起,此时容器的内存状态和连接信息会被保留,也就是说它只是状态定格在哪里了,不再能够获取到CPU时间配额,至于占用的内存资源等等不会被释放,此时你进入也不会得到响应
docker pause <容器名>
[root@node1 ~]# docker pause 1482581648cb
1482581648cb
[root@node1 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                   PORTS     NAMES
1482581648cb   centos    "/bin/bash"   22 seconds ago   Up 22 seconds (Paused)             m1
[root@node1 ~]# docker exec 1482581648cb ls /
Error response from daemon: Container 1482581648cb is paused, unpause the container before exec

#恢复
docker unpause <容器名>
[root@node1 ~]# docker unpause 1482581648cb
1482581648cb
[root@node1 ~]# docker exec 1482581648cb ls /
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

15、前面说了很多次非交互式容器,也说了它大多数内部是一个前台启动的进程。那这种情况如何在不使用附加进入的前提下得到标准输出和标准错误输出,也就是控制台日志。答案是 log 命令,注意docker logs 只关心容器内进程的 stdout 和 stderr,而不关心进程写入到容器内部文件系统中的日志文件里有什么,所以你如果封装docker镜像的时候,命令是后台启动,或者输出到了一个文件里,log是获取不到的

bash 复制代码
docker logs 容器id
[root@node1 ~]# docker run --name m3 -d centos /bin/sh -c "while true; do echo 'Container running'; sleep 10; done"
c1019a40eabbfb7ed79ae6c5267b7ed78fde7e1338ff0c4094292ac3473cbbbf
[root@node1 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
c1019a40eabb   centos    "/bin/sh -c 'while t..."   7 seconds ago   Up 7 seconds             m3
[root@node1 ~]# docker logs c1019a40eabb
Container running
Container running

16、导入或导出镜像

bash 复制代码
docker save [选项] 镜像名[:标签] > 输出文件.tar
# 或使用 -o 参数指定输出文件
docker save -o 输出文件.tar 镜像名[:标签]
[root@node1 ~]# docker save -o /opt/m.tar centos
[root@node1 ~]# cd /opt/
[root@node1 opt]# ll
-rw-------.  1 root root 238581248 Mar 12 21:42 m.tar

# 将 nginx:latest 保存为 nginx.tar
docker save -o nginx.tar nginx:latest

# 将 ubuntu 和 nginx 打包到一起
docker save -o images.tar ubuntu:20.04 nginx:latest

# 保存并压缩为 .tar.gz
docker save nginx:latest | gzip > nginx.tar.gz
bash 复制代码
docker load [选项] < 输入文件.tar
# 或使用 -i 参数指定输入文件
docker load -i 输入文件.tar

# 先解压再加载
gunzip -c nginx.tar.gz | docker load

17、docker 的身份令牌,docker login 和 docker logout 是 Docker 命令行工具中用于身份认证的一对命令。如果你只需要下载(docker pull)像 ubuntu、nginx 这样的公共镜像,通常不需要登录。如果你想访问私有资源(自己的仓库、公司的镜像),或者上传镜像(docker push),就必须先登录

你在 Docker 上有一个私人仓库 my-private-app,你想下载它

bash 复制代码
docker login --username 你的用户名
# 回车后会提示输入密码或访问令牌

# 或者从标准输入读取密码,这样密码不会出现在命令历史里,更安全。
echo $DOCKER_PASSWORD | docker login --username $DOCKER_USERNAME --password-stdin

docker pull yourusername/my-private-app:latest  # 现在可以下载了

访问第三方/自建的镜像仓库,通常也需要登录

bash 复制代码
# 登录到阿里云镜像仓库
docker login --username 阿里云账号 registry.cn-shenzhen.aliyuncs.com

# 登录到公司自建的 Harbor 仓库
docker login --username 你的账号 harbor.yourcompany.com

退出就很简单了没有任何参数退出即可docker logout [SERVER]

相关推荐
宋明河2 小时前
写了一个小工具,在Get k8s 资源的yaml只看自己改过的配置参数,过滤默认的以及附加的参数
云原生·容器·kubernetes
灰阳阳3 小时前
Docker-镜像-命令清单
java·docker·eureka
灰阳阳3 小时前
docker基础命令讲解
运维·docker·容器·eureka
切糕师学AI3 小时前
K8s 中,为什么同一主机上的两个 Pod 可以监听相同端口而不冲突?
云原生·容器·kubernetes
写代码的小阿帆3 小时前
SpringBoot项目部署——命令行、Nginx代理与docker容器
spring boot·nginx·docker
ISU(考研版)3 小时前
从零开始复现 ThinkPHP RCE:Docker + Burp Suite 实战
运维·docker·容器
不光头强3 小时前
k8s知识点
云原生·容器·kubernetes
徒 花3 小时前
Docker在Ubuntu上的安装及配置(基于k8s基础环境配置)
ubuntu·docker·kubernetes
zhuzhihongNO13 小时前
腾讯云OpenCloudOS 8操作系统安装Docker
docker·云计算·腾讯云·docker安装·云服务器·opencloudos8·喂饭级教程