当前位置 : 首页 » 文章分类 :  开发  »  Docker-常用命令

Docker-常用命令

Docker-Commands

Command-line reference
https://docs.docker.com/engine/reference/commandline/cli/


docker info 查看docker信息

# docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 18.06.1-ce
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: nvidia runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 468a545b9edcd5932818eb9de8e72413e616e86e
runc version: 69663f0bd4b60df09991c08812a60108003fa340
init version: fec3683
Security Options:
 seccomp
  Profile: default
Kernel Version: 3.10.0-514.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 24
Total Memory: 251.6GiB
Name: myapp
ID: UF76:IPSA:VE7G:YD67:PQRT:WU4E:3EKX:2J7F:36PQ:BSOT:N2CV:XMFX
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false

查看 Root Dir

$ docker info |grep "Docker Root Dir"
 Docker Root Dir: /var/lib/docker

查看 docker 的 cgroup driver

$ docker info |grep Cgroup
 Cgroup Driver: cgroupfs

docker system df 查看docker磁盘占用

https://docs.docker.com/engine/reference/commandline/system_df/

docker system df 查看 docker 磁盘占用汇总信息

docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          433       42        117.4GB   97.11GB (82%)
Containers      103       89        2.145GB   1.464GB (68%)
Local Volumes   9         6         116B      58B (50%)
Build Cache     0         0         0B        0B

RECLAIMABLE 是空闲镜像(没有任何容器使用的镜像)的大小,空闲镜像可以用命令 docker image prune -a 清理

查看docker容器占用磁盘空间大小

docker system df 加 -v 参数显示详细的磁盘占用信息,能看到每个镜像、容器、卷的磁盘占用情况:

$ docker system df -v
Images space usage:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE                SHARED SIZE         UNIQUE SIZE         CONTAINERS
blog                latest              3fc20337e23a        3 hours ago         975MB               0B                  975MB               1
elasticsearch       8.6.1-ik            b1e6c57fe659        5 months ago        1.297GB             0B                  1.297GB             1
gogs/gogs           latest              ead46421307d        3 years ago         92.38MB             0B                  92.38MB             1
nginx               alpine              377c0837328f        3 years ago         19.72MB             0B                  19.72MB             1

Containers space usage:

CONTAINER ID        IMAGE                    COMMAND                  LOCAL VOLUMES       SIZE                CREATED             STATUS              NAMES
a7faa3438b30        blog                     "java -jar /blog-ser…"   1                   0B                  3 hours ago         Up 3 hours          blog
3bd1f9b14c43        nginx:alpine             "nginx -g 'daemon of…"   0                   2B                  7 weeks ago         Up 7 weeks          nginx
7ee16ad38348        elasticsearch:8.6.1-ik   "/bin/tini -- /usr/l…"   0                   98.8MB              5 months ago        Up 5 months         es
f33daa8d3e09        gogs/gogs                "/app/gogs/docker/st…"   1                   5.57kB              5 months ago        Up 5 months         gogs

Local Volumes space usage:

VOLUME NAME                                                        LINKS               SIZE
947b26afba6c51e5d72f83f523a93fe3be7b7b83f32edc62175a8e858585ee12   0                   32.77kB
9f10a334ac3293f0e1ebcb880e1947c55017d0d878ba8d40b3925b98e494c9a1   0                   32.77kB
58f94b049406ebb796379a43061c9e81f33a309d295beb1e27c50f14a5fec417   1                   0B
716a30cd87333e7ee12d0e91cb55ad4a4005db78348c0696cfbd7568246ffab6   1                   33.6kB
08d2a5847d3b9e96b595e6efa29fdbe66cb6148eb285066069e17397463e0950   0                   32.77kB
317fdf41419fa5ac3ad7330a2c105452065e5d0846920e4ca32e9952790301dd   0                   32.77kB
8817b7c05b024d5c03d78f8ce8e5c133ca79d5e79570583135b9d892f7442785   0                   0B

Build cache usage: 0B

CACHE ID            CACHE TYPE          SIZE                CREATED             LAST USED           USAGE               SHARED

docker/containers 目录磁盘占用大清理

1、找到 docker 根目录
docker info |grep “Docker Root Dir”
默认是 /var/lib/docker

2、进入 containers 子目录,里面每个容器对应一个目录,目录名是容器ID,docker ps 结果的第一列就是容器ID的前缀
每个容器目录中有名字为 容器ID-json.log 的日志文件,通常会比较大,可以直接 >contain-id-json.log 清理掉

限制 docker 控制台日志大小

方法1、docker 全剧配置容器日志大小,对所有容器都生效。
新建或修改 docker 配置 /etc/docker/daemon.json

{
    "max-concurrent-downloads": 10,
    "log-driver": "json-file",
    "log-level": "warn",
    "log-opts": {
      "max-size": "50m",
      "max-file": "5"
    },
    "data-root": "/data/lib/docker"
}

单个日志文件最大 50m,最多 5 个日志文件,日志自动滚动:

34M    e5e0fbde1e9b3ef24bef5228e2381936568f97d7da5b7214f3883f40bc32c809-json.log
48M    e5e0fbde1e9b3ef24bef5228e2381936568f97d7da5b7214f3883f40bc32c809-json.log.1
48M    e5e0fbde1e9b3ef24bef5228e2381936568f97d7da5b7214f3883f40bc32c809-json.log.2
48M    e5e0fbde1e9b3ef24bef5228e2381936568f97d7da5b7214f3883f40bc32c809-json.log.3
48M    e5e0fbde1e9b3ef24bef5228e2381936568f97d7da5b7214f3883f40bc32c809-json.log.4

修改后重启docker:

systemctl daemon-reload
systemctl restart docker

方法2,docker run 时限制单个容器的日志大小
通过 --log-opt 指定日志文件大小和数量:

docker run --log-opt max-size=100m --log-opt max-file=5 image-xx

max-size:单个日志文件上限(如 100MB)
max-file:保留的日志文件数量(如最多保留5个)


docker system prune 系统清理

https://docs.docker.com/engine/reference/commandline/system_prune/

docker system prune 会清理

  • 已停止的容器
  • 悬空镜像
  • 没被使用的网络
  • docker build 缓存

docker image prune -a 清理悬空镜像

https://docs.docker.com/engine/reference/commandline/image_prune/

docker image prune -a 命令可批量清理悬空镜像

docker images 看到的 none 镜像是悬空镜像(dangling images),即无标签、且不被容器使用的镜像。

REPOSITORY                                           TAG             IMAGE ID       CREATED          SIZE
<none>                                               <none>          5eaed6e23874   10 minutes ago   741MB

docker rmi 批量删除none镜像

docker rmi $(docker images | grep "none" | awk '{print $3}')
或者
docker images |grep none | awk '{print $3}' | xargs docker rmi


搜索 DockerHub 上的镜像

docker search zookeeper
NAME                               DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
zookeeper                          Apache ZooKeeper is an open-source server wh…   1075      [OK]
jplock/zookeeper                   Builds a docker image for Zookeeper version …   165                  [OK]
wurstmeister/zookeeper                                                             145                  [OK]

docker network

docker network ls 列出容器网络

docker network create

创建网络时,引擎默认为网络创建一个不重叠的子网。 该子网不是现有网络的细分。 它纯粹用于IP寻址目的。可以覆盖此默认值,并使用–subnet选项直接指定子网络值。 在桥接网络上,只能创建单个子网。
创建网络 br0
docker network create --driver=bridge --subnet=192.168.0.0/16 br0


docker run 运行容器

docker run
https://docs.docker.com/engine/reference/commandline/run/

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
以镜像 IMAGE 启动一个容器, 如果 IMAGE 不存在,会从默认仓库 Docker Hub 上下载此镜像,如果不指定 tag 默认是 latest,启动容器后执行命令 COMMAND

参数
-d, --detach 让 Docker 在后台运行而不是直接把执行命令的结果输出在当前宿主机下
-e, --env list 启动容器时增加环境变量
-p, --publish <宿主端口>:<容器端口> 映射宿主端口和容器端口,-p 标记可以多次使用来绑定多个端口。例如 -p 80:8080 映射本机 80 端口到容器内的 8080 端口
-P, --publish-all 随机映射宿主机上一个 49000~49900 之间的端口到容器内部的网络端口
--name string 指定启动的容器的名字
--restart string 容器退出后的重启策略,默认是 no, --restart=always 可保持容器一直运行
--rm 容器退出后随之将其删除。默认情况下,为了启动失败时查错,退出的容器并不会立即删除,除非手动 docker rm
--gpus 指定 NVIDIA GPU 资源
-w, --workdir 指定容器内的工作目录

例1、直接运行 ubuntu 镜像并进入启动的 Ubuntu 容器
docker run -it --rm ubuntu:18.04 bash
ubuntu:18.04:这是指用 ubuntu:18.04 镜像为基础来启动容器。
bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash

例2、直接运行 jdk8 镜像并进入容器
docker run -it adoptopenjdk/openjdk8:centos bash
会直接自动下载 centos+jdk 镜像,run 镜像,并进入容器内

-it 进入容器

-i, --interactive 则让容器的标准输入保持打开,交互式操作
-t, --tty 让 Docker 分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
-it 这两个参数一起使用,可进入容器执行命令。

-it --user root 以root身份进入容器

docker exec -it --user root <容器名> /bin/bash 以 root 身份进入容器

--network,--net 指定容器网络模式

--network network, --net network 指定容器的网络模式,默认为 bridge
bridge 即桥接网络,以桥接模式连接到宿主机,即宿主机和容器之间通过 docker0 虚拟网卡连到同一个局域网,bridge是默认的网络模式
host 宿主网络,即与宿主机共用网络,这种模式相当于没有网络隔离,好处是和宿主机处于同一网络,可随意访问,都不用 -p 做端口映射了。
none 则表示无网络,容器将无法联网
container:c_name 连接到容器 c_name 的网络
network_name 连接到预先创建好的网络 network_name

-v 映射文件/文件夹

-v, --volume [HOST-DIR:]CONTAINER-DIR[:OPTIONS] 在本地(宿主机)和容器间映射目录或文件。
注意此选项中 HOST-DIR 可以省略,但 CONTAINER-DIR 不能省略。如果只有一个目录,会被当做是 CONTAINER-DIR
HOST-DIR 省略时,会自动在本机创建和容器中同名的目录。
映射文件时文件名可以不相同。
如果 HOST-DIR 和 CONTAINER-DIR 都存在,host 上的文件/文件夹内容会覆盖 container 中的文件/文件夹内容。
当映射文件时,宿主机文件必须存在,因为如果不存在会自动在宿主机创建,但此时创建的就是目录了。
CONTAINER-DIR 必须是绝对路径。
HOST-DIR 可以是绝对路径,或者 volume 卷名。HOST-DIR 是绝对路径是,挂载此路径到容器。HOST-DIR 是卷名时,挂载此卷(没有会自动创建 volume)到容器。

挂载目录 -v A:B

  • 如果容器中目录 B 不存在,会先在 contanier 中创建目录 B,再将本地目录 A 中的所有文件 copy 到 B 中
  • 如果本地目录 A 不存在,可自动创建本地目录 A
  • 若果 A 和 B 都存在,会用本地目录 A 中的内容覆盖容器目录 B 中的内容

-v 可以出现多次,挂载多个不同的目录。

容器销毁后,启动容器时创建的宿主机目录不会销毁,容器运行过程中对目录的操作也都会保留在宿主机。

Docker volume 挂载时文件或文件夹不存在
https://segmentfault.com/a/1190000015684472

Use volumes
https://docs.docker.com/storage/volumes/

--mount 挂载卷

--mount 挂载本地卷、目录、文件到容器中。由多个键值对组成,由逗号分隔,每一个由 key=value 元祖组成。键值对没有顺序。
type,可以是 bind,volume,tmpfs。
source,主机上的文件或目录的路径。可能用 src,source 指定。
destination,容器中的文件或目录的路径。可能用 destination,dst,target 指定。
使用 -v 和 –volume 绑定主机不存在的文件或目录,将会自动创建。始终创建的是一个目录。
使用 –mount 绑定主机上不存在的文件或目录,则不会自动创建,会产生一个错误。

-u 指定容器的用户和组

-u, --user 指定容器用户,格式 <name|uid>[:<group|gid>]
使用 docker run 启动容器应用的时候,默认使用的是root用户,并且这个 root 用户和宿主机中的 root 是同一个用户,所以容器应用进程具有很高的权限

例如
docker run -u 1000:1000 -it ubuntu bash
docker run -u centos -it centos:7 bash

--privileged 特权模式

大约在 0.6 版,privileged 被引入 docker。
使用该参数,container 内的 root 拥有真正的 root 权限。
否则,container 内的 root 只是外部的一个普通用户权限。

--platform 指定架构

M1 Mac 上运行 amd64/x86_64 架构镜像,可以指定 --platform linux/amd64 参数

docker run -d --rm \
--platform linux/amd64 \
-p 8001:8001 \
--name blog \
-v /var/log/spring:/var/log/spring \
-e "SPRING_PROFILES_ACTIVE=local" \
blog

如果镜像本身是 amd64/x86_64 架构的,不需要指定,但 docker run 会报警告:
WARNING: The requested image’s platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested

--gpus 指定 NVIDIA GPU 资源

要使用 --gpus 参数,必须满足以下条件:
宿主机已安装 NVIDIA 显卡驱动
已安装 NVIDIA Container Toolkit(原nvidia-docker2)
Docker 版本 19.03 或更高

# 使用所有可用 GPU:
docker run --gpus all <image>

# 指定使用特定数量的 GPU:
docker run --gpus 2 <image>  # 使用2个GPU

# 指定使用特定的 GPU 设备:
docker run --gpus '"device=0,1"' <image>  # 使用GPU 0和1

# 通过GPU编号指定GPU
docker run --gpus device=GPU-3a23c669-1f69-c64e-cf85-44e9b07e7a2a ubuntu nvidia-smi
docker run --gpus '"device=UUID-GPU-1,UUID-GPU-2"' ubuntu nvidia-smi

还可以通过 gson 指定更复杂的选项:

docker run --gpus '{
  "device": ["0", "1"],
  "capabilities": ["utility", "compute", "graphics"]
}' <image>

可配置的字段包括:

  • device: 指定 GPU 设备 ID 或 UUID
  • capabilities: 指定需要的 GPU 功能
    • utility: 基本工具功能
    • compute: 计算能力
    • graphics: 图形渲染能力
    • display: 显示功能
    • video: 视频处理能力

容器无法启动问题排查

1、docker ps -a 能显示启动失败的容器,然后 docker logs -f 看启动日志有无报错
2、docker inspect 看容器信息
3、如果 docker ps -a 也看不到容器,可以去掉 -d 后台运行参数,前台运行,而是 -it 把容器日志打印到前台,看有什么报错。


docker容器何时变为up状态?

docker 容器启动命令如下:

docker run -itd my-app-image:1.0.0 bash -c "source ~/.bashrc && python3 scripts/start.py && sleep infinity"

启动 docker 容器时发现:start.py 还没执行完成,服务还在初始化,docker ps 里容器状态就已经是 Up

容器变为 up 状态的条件是什么?
Docker 容器的 Up 状态,只表示容器的主进程(PID 1)已经运行,并不代表服务已经准备好或初始化完成。
只要指定的 ENTRYPOINT 或 CMD(即这里的 bash -c ... 命令)被 Docker 启动并进入运行态,容器就会变为 Up。
Docker 并不关心运行的脚本(如 start.py)是否已经初始化完毕,也不管服务 ready 与否。
只要主进程(这里是 bash 进程)没有退出,容器就是 Up。

这个 case 的容器启动流程:
docker run … bash -c “source ~/.bashrc && python3 scripts/start.py && sleep infinity”
Docker 启动 bash 进程(PID 1),执行 source ~/.bashrc && python3 scripts/start.py && sleep infinity
bash 进程一旦开始运行,容器状态就为 Up
无论 start.py 是否完成初始化,Docker 都不做检查
只要 bash 进程没退出(后面加了 sleep infinity,不会退出),容器就一直是 Up


docker push 推镜像

https://docs.docker.com/engine/reference/commandline/push/
推镜像到 registry
docker push image[:tag]


docker image inspect 查看镜像详细信息

https://docs.docker.com/engine/reference/commandline/image_inspect/

docker image inspect 查看镜像的架构

其中 Architecture 是镜像的架构

docker image inspect adoptopenjdk/openjdk8:centos
[
    {
        "Id": "sha256:5c4f7308100d908ec26e8264a76d76b55591b405a76b581271dbc435c30cfbf2",
        "RepoTags": [
            "adoptopenjdk/openjdk8:centos"
        ],
        "RepoDigests": [
            "adoptopenjdk/openjdk8@sha256:56e00eb7fb3fb82dacb647590c0657534df2eb77605b83e4e706a38151eb082f"
        ],
        "Parent": "",
        "Comment": "buildkit.dockerfile.v0",
        "Created": "2023-07-01T15:09:31.842619662Z",
        "Container": "",
        "ContainerConfig": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": null,
            "Cmd": null,
            "Image": "",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": null
        },
        "DockerVersion": "",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/opt/java/openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "LANG=en_US.UTF-8",
                "LANGUAGE=en_US:en",
                "LC_ALL=en_US.UTF-8",
                "JAVA_VERSION=jdk8u372-b07",
                "JAVA_HOME=/opt/java/openjdk"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20201113",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS",
                "org.opencontainers.image.created": "2020-11-13 00:00:00+00:00",
                "org.opencontainers.image.licenses": "GPL-2.0-only",
                "org.opencontainers.image.title": "CentOS Base Image",
                "org.opencontainers.image.vendor": "CentOS"
            }
        },
        "Architecture": "arm64",
        "Variant": "v8",
        "Os": "linux",
        "Size": 1268913926,
        "VirtualSize": 1268913926,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/f4af2886d00a730fa35c6777754ce4ee11e1481ff22bf052f65933e70643f138/diff:/var/lib/docker/overlay2/5756458d0749a7f71398bf8162286f5cafefe39d499e04b2125662243c86ee56/diff",
                "MergedDir": "/var/lib/docker/overlay2/4bccc3a2faf71c2af258c3c7e80743331c5d72e69dc9d27c7a631406526a959c/merged",
                "UpperDir": "/var/lib/docker/overlay2/4bccc3a2faf71c2af258c3c7e80743331c5d72e69dc9d27c7a631406526a959c/diff",
                "WorkDir": "/var/lib/docker/overlay2/4bccc3a2faf71c2af258c3c7e80743331c5d72e69dc9d27c7a631406526a959c/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:65f23ff12f4df9625427d229db82655bdadd805108d3431520673d79198419ff",
                "sha256:010044c2a811335b6122c7a8d972c3e5a4f2a1f68a8253e0af581e3709179706",
                "sha256:0ede7ac16aa01ae57ed91a33faffd02eb95b81692791460dc234c68e60588489"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]

docker manifest inspect 查看镜像的manifest列表

有的镜像支持多架构,比如 https://hub.docker.com/r/adoptopenjdk/openjdk8/tags?page=1&name=centos
可以通过 docker manifest inspect 查看镜像支持哪些架构

当用户获取一个镜像时,Docker 引擎会首先查找该镜像是否有 manifest 列表,如果有的话 Docker 引擎会按照 Docker 运行环境(系统及架构)查找出对应镜像(例如 golang:alpine)。如果没有的话会直接获取镜像(例如上例中我们构建的 username/test)。

docker manifest inspect adoptopenjdk/openjdk8:centos
{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
   "manifests": [
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 956,
         "digest": "sha256:099e5eda268dc834873028c94eb7031d2acb2dad0ce92edccee78d6fd7666b7b",
         "platform": {
            "architecture": "arm64",
            "os": "linux",
            "variant": "v8"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 953,
         "digest": "sha256:c185c64ed5993198248bf8aad74e706077b34ee30f7d0260e19c55397ac0f2f2",
         "platform": {
            "architecture": "arm",
            "os": "linux",
            "variant": "v7"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 954,
         "digest": "sha256:65147bda6f81bfba8922d4c3ae896184551ac5d8fe750e3ba9916846b9eadb91",
         "platform": {
            "architecture": "ppc64le",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 954,
         "digest": "sha256:d2c6b89782cc256d9cef8b4dd72623f7594eb935ba62ba762ddfc17aaace8bbb",
         "platform": {
            "architecture": "amd64",
            "os": "linux"
         }
      }
   ]
}

docker pull 下载镜像

https://docs.docker.com/engine/reference/commandline/pull/

docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
具体的选项可以通过 docker pull –help 命令看到
Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub。
仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像。

例如 docker pull ubuntu:18.04
上面的命令中没有给出 Docker 镜像仓库地址,因此将会从 Docker Hub 获取镜像。
而镜像名称是 ubuntu:18.04,因此将会获取官方镜像 library/ubuntu 仓库中标签为 18.04 的镜像。

–platform 指定架构

有的镜像同一 tag 提供多架构的,可通过 –platform 参数指定架构

docker pull adoptopenjdk/openjdk8:centos –platform amd64
docker pull centos:7 –platform linux/amd64

修改docker镜像存储位置

一般默认情况下 docker 镜像的存放位置为 /var/lib/docker(可通过 docker info 命令查看 Docker Root Dir 配置项), 而此目录一般不会分配很大空间,docker 上跑的东西太多就会发现此目录满了。

注意:Mac 虽然 docker info 看到的 Docker Root Dir 也是 /var/lib/docker, 但其实镜像并不在这里,而是在
$HOME/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw 这个单独的文件中,并且无法修改。

解决方法:

软链接

systemctl stop docker       # 关闭 docker 服务
mv /var/lib/docker /var/lib/docker.bak   # 备份当前 docker 镜像文件目录
ln -s /data/docker  /var/lib/docker         # 设置软连接,其中 /data/docker 目录为新的存放 docker 镜像目录
cp -rp /var/lib/docker.bak /data/docker        # 将旧的 docker 文件拷贝过去

修改 docker 配置文件

指定镜像和容器存放路径的参数是 --graph=/var/lib/docker,我们只需要修改配置文件指定启动参数即可。
1、修改 /etc/sysconfig/docker 配置文件
添加

OPTIONS=--graph="/root/data/docker" --selinux-enabled -H fd://

2、如果 docker 是 1.12 或以上的版本,可以修改(或新建)/etc/docker/daemon.json 文件。修改后会立即生效,不需重启 docker 服务。
改为

{
  "graph": "/data/docker",
  "default-shm-size": "64g"
}

修改docker.service服务配置

修改 docker 安装后自动创建的 linux 服务脚本 /etc/systemd/system/docker.service
改为

ExecStart=/usr/bin/dockerd -g /data/docker/ -H fd://

然后 systemctl daemon-reload 重载 unit 配置文件

docker no space left on device

docker 镜像所在磁盘空间不足时 pull image 会报这个错误。

四个修改Docker默认存储位置的方法
https://blog.51cto.com/forangela/1949947


docker images 列出本机镜像

docker image ls 列出镜像,等价于 docker images

$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              fce289e99eb9        11 months ago       1.84kB

列表包含了 仓库名、标签、镜像 ID、创建时间 以及 所占用的空间

docker image ls ubuntu 根据仓库名列出镜像
docker image ls ubuntu:18.04 指定仓库名和标签列出镜像
docker image ls -q 只列出镜像ID,经常用做其他命令的输入参数

docker image rm 删除本地镜像

docker image rm [选项] <镜像1> [<镜像2> ...] 等价于 docker rmi

docker image rm centos 用镜像名,也就是 仓库名:标签,来删除镜像
docker image rm $(docker image ls -q redis) 删除所有仓库名为 redis 的镜像
docker image rm $(docker image ls -q -f before=mongo:3.2) 删除所有在 mongo:3.2 之前的镜像


docker build 构建镜像

docker build
https://docs.docker.com/engine/reference/commandline/build/

docker build [选项] <上下文路径/URL/->
-t, --tag 指定 image 文件的名字,后面还可以用冒号指定标签,例如 name:tag。如果不指定,默认的标签就是 latest
-f, --file 指定 Dockerfile 文件名称,默认是 PATH/Dockerfile

docker build -t myapp . 在当前目录使用 Dockerfile 构建 myapp 镜像
docker build -t myapp -f path-to-Dockerfile . 在当前目录使用 path-to-Dockerfile 构建 myapp 镜像


–platform 构建多架构镜像

构建 amd64 架构的镜像

docker build -f devops/blog.Dockerfile --platform=amd64 -t blog .

M1 Mac 上打的镜像默认是arm64架构的

在 M1 Mac 上使用 Docker 构建的镜像架构默认是 arm64(不指定 –platform 参数时)。M1芯片是基于ARM架构的处理器,因此Docker会根据宿主机的架构来构建相应的镜像。
这意味着,在M1 Mac上构建的镜像只能在支持arm64架构的设备上运行,而不能在传统的x86架构设备上运行。

如果 Dockerfile 中指定了特定架构的基础镜像,例如 FROM ubuntu:amd64,则构建的镜像继承了基础镜像的架构,因此也是 amd64 架构的


构建上下文

docker 构建命令 docker build [选项] <上下文路径/URL/-> 最后需要制定上下文目录
当构建的时候,用户会指定构建镜像上下文的路径,docker build 命令得知这个路径后,会将路径下的所有内容打包,然后上传给 Docker 引擎。这样 Docker 引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件。

如果在 Dockerfile 中这么写:
COPY ./package.json /app/
这并不是要复制执行 docker build 命令所在的目录下的 package.json,也不是复制 Dockerfile 所在目录下的 package.json, 而是复制 上下文(context) 目录下的 package.json。

一般来说,应该会将 Dockerfile 置于一个空目录下,或者项目根目录下。如果该目录下没有所需文件,那么应该把所需文件复制一份过来。如果目录下有些东西确实不希望构建时传给 Docker 引擎,那么可以用 .gitignore 一样的语法写一个 .dockerignore ,该文件是用于剔除不需要作为上下文传递给 Docker 引擎的。

实际上 Dockerfile 的文件名并不要求必须为 Dockerfile,而且并不要求必须位于上下文目录中,比如可以用 -f ../Dockerfile.php 参数指定某个文件作为 Dockerfile。

.dockerignore

.dockerignore 用于剔除不需要作为上下文传递给 Docker 引擎的文件


docker history 查看镜像历史

https://docs.docker.com/engine/reference/commandline/history/
查看镜像历史

--no-trunc 不截断输出结果,不加这个选项的话 CREATED BY 中显示不全

docker history zookeeper:3.4.14
IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
4b03fe5b3f64   2 months ago   /bin/sh -c #(nop)  CMD ["zkServer.sh" "start…   0B
<missing>      2 months ago   /bin/sh -c #(nop)  ENTRYPOINT ["/docker-entr…   0B
<missing>      2 months ago   /bin/sh -c #(nop) COPY file:9258d11b841666f1…   1.16kB
<missing>      2 months ago   /bin/sh -c #(nop)  ENV PATH=/usr/local/openj…   0B
<missing>      2 months ago   /bin/sh -c #(nop)  EXPOSE 2181 2888 3888        0B
<missing>      2 months ago   /bin/sh -c #(nop)  VOLUME [/data /datalog /l…   0B
<missing>      2 months ago   /bin/sh -c #(nop) WORKDIR /zookeeper-3.4.14     0B
<missing>      2 months ago   |2 DISTRO_NAME=zookeeper-3.4.14 GPG_KEY=3F7A…   60MB
<missing>      2 months ago   /bin/sh -c #(nop)  ARG DISTRO_NAME=zookeeper…   0B
<missing>      2 months ago   /bin/sh -c #(nop)  ARG GPG_KEY=3F7A1D16FA421…   0B
<missing>      2 months ago   /bin/sh -c set -eux;     apt-get update;    …   12.3MB
<missing>      2 months ago   /bin/sh -c set -eux;     groupadd -r zookeep…   329kB
<missing>      2 months ago   /bin/sh -c #(nop)  ENV ZOO_CONF_DIR=/conf ZO…   0B
<missing>      2 months ago   /bin/sh -c set -eux;   arch="$(dpkg --print-…   109MB
<missing>      2 months ago   /bin/sh -c #(nop)  ENV JAVA_VERSION=8u292       0B
<missing>      2 months ago   /bin/sh -c #(nop)  ENV LANG=C.UTF-8             0B
<missing>      2 months ago   /bin/sh -c #(nop)  ENV PATH=/usr/local/openj…   0B
<missing>      2 months ago   /bin/sh -c { echo '#/bin/sh'; echo 'echo "$J…   27B
<missing>      2 months ago   /bin/sh -c #(nop)  ENV JAVA_HOME=/usr/local/…   0B
<missing>      2 months ago   /bin/sh -c set -eux;  apt-get update;  apt-g…   8.82MB
<missing>      2 months ago   /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>      2 months ago   /bin/sh -c #(nop) ADD file:7362e0e50f30ff454…   69.3MB

docker ps 列出本机容器

docker container ls 等于 docker ps
docker ps 列出本机正在运行的容器
docker ps -a 列出本机所有容器,包括终止运行的容器

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
5edb883d9423        nginx:alpine        "nginx -g 'daemon of…"   10 months ago       Up 10 months                            nginx
e057ebc04ff5        gogs/gogs           "/app/gogs/docker/st…"   12 months ago       Up 12 months                            gogs
756930ef3388        search              "java -jar /app.jar"     12 months ago       Up 12 months                            search
992185baf34b        disqus              "java -jar /app.jar"     12 months ago       Up 12 months                            disqus
d89f76910cd6        statistic           "java -jar /app.jar"     12 months ago       Up 12 months                            statistic
2dcbb37eb434        eureka              "java -jar /app.jar"     12 months ago       Up 12 months                            eureka

docker container start 启动已终止容器

可以利用 docker container start 命令,直接将一个已经终止的容器启动运行。

docker stop 终止容器

docker container stop 等于 docker stop
docker stop [OPTIONS] CONTAINER [CONTAINER...]

docker rm 删除容器

docker rm 等于 docker container rm
docker rm [OPTIONS] CONTAINER [CONTAINER...]
如果要删除一个运行中的容器,可以添加 -f 参数。Docker 会发送 SIGKILL 信号给容器。
docker rm -f container1 停止并删除容器,相当于 docker stop 再 docker rm


docker exec 进入容器执行命令

docker exec 等于 docker container exec
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
-it 这两个参数一起使用,可进入容器执行命令。
常用格式
docker exec -it 容器ID bash
docker exec -it 容器ID sh

先查看当前运行的容器

$ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
724d51cc7cf7        nginx               "nginx -g 'daemon of…"   47 minutes ago      Up 47 minutes       0.0.0.0:80->80/tcp   mystifying_knuth

指定容器id进入容器

$ docker exec -it 724d51cc7cf7 bash
root@724d51cc7cf7:/#

OCI runtime exec failed bash executable file not found

docker exec -it 33e828194205 bash
OCI runtime exec failed: exec failed: container_linux.go:346: starting container process caused “exec: "bash": executable file not found in $PATH”: unknown

原因: 原因是该容器并没有 bash
解决: 改用 sh
docker exec -it 33e828194205 sh


docker commit 将容器保存为镜像

当我们运行一个容器的时候(如果不使用卷的话),我们做的任何文件修改都会被记录于容器存储层里。而 Docker 提供了一个 docker commit 命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。

docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]

-a, --author string 指定修改的作者
-m, --message string 记录本次修改的内容

例如

$ docker commit \
    -a "Tao Wang <twang2218@gmail.com>" \
    -m "修改了默认网页" \
    webserver \
    nginx:v2

其中 -a 指定修改的作者,而 -m 则是记录本次修改的内容,这点和 git 版本控制相似,不过这里这些信息可以省略留空。


docker save 导出镜像

https://docs.docker.com/engine/reference/commandline/save/

保存镜像到 tar 文件,默认输出到 stdout, 默认包含所有的 layer, 所有的tags, 当然也可以指定tags
-o, --output docker save 默认是输出到 stdout, 通过 -o 参数可指定保存的档案文件名

docker save busybox > busybox.tar 保存镜像 busybox 的所有版本到 busybox.tar 文件
docker save -o myimage.tar myimage:tag1 保存镜像 myimage 的 tag1 版本到 myimage.tar 文件

利用 docker save/load 导入导出镜像

方法一、利用 gzip/gunzip 压缩解压
导出镜像并压缩为gzip
docker save myimage:latest | gzip > myimage_latest.tar.gz 导出镜像并压缩

倒入镜像压缩包
gunzip -c myimage_tag.tar.gz | docker load

方法二、或者使用 tar 命令压缩和解压

docker save myimage:tag > myap.tar
tar -zcvf myap.tar.gz myap.tar

解压导入镜像

tar -xzvf myap.tar.gz
docker load < myap.tar

当然,如果 tar 文件本身不大,不用压缩也可以。

内网下载docker镜像

1、在可以联网的机子上执行 docker pull 命令下载镜像,如: sudo docker pull freewil/bitcoin-testnet-box,命令使用参考 Docker pull 命令
2、然后运行 docker save 命令将镜像保存为 tar 归档文件,如:docker save -o bitcoin-testnet-box.tar freewil/bitcoin-testnet-box,命令使用参考Docker save 命令
3、将保存的 bitcoin-testnet-box.tar 归档文件拷贝进内网机器
4、内网机器上执行 dock load 命令加载保存的 tar 归档文件,如:docker load -i bitcoin-testnet-box.tar

docker load 导入镜像

https://docs.docker.com/engine/reference/commandline/load/

从 tar 文件或标准输入 stdin 导入镜像,会重建镜像和所有的 tag.
这里的 tar 文件是用 docker save 命令导出的镜像。
--input , -i : 指定导入的文件,代替 STDIN
--quiet , -q : 精简输出信息。

docker load < busybox.tar.gz 利用输入重定向从 tar 文件导入镜像
docker load --input fedora.tar 通过 --input 参数指定 tar 文件导入镜像


docker cp 在容器和宿主机间拷贝文件/目录

https://docs.docker.com/engine/reference/commandline/cp/

docker cp 等于 docker container cp
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

示例
1、将容器中的文件 /root/123.mp4 拷贝到宿主机的 /root/mp4/ 目录中,其中 335d957237c9 是容器id

docker cp 335d957237c9:/root/123.mp4 /root/mp4/

2、将容器中的 /root/images 目录拷贝到宿主机的 /root/data/ 目录中,其中 335d957237c9 是容器id

docker cp 335d957237c9:/root/images /root/data/

3、将宿主机当前目录中的 xx.mp4 文件拷贝到容器的 /root/data/ 目录中,其中 video-processor 是容器名

docker cp xx.mp4 video-processor:/root/data/

docker tag 重命名镜像

https://docs.docker.com/engine/reference/commandline/tag/
docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]
重命名镜像,将 source 重命名为 target
docker tag myapp:ver1 myapp:ver2


docker logs 查看容器日志

docker logs [OPTIONS] CONTAINER
如果容器无法启动,先 docker ps -a 找到启动失败的容器id, 然后 docker logs 容器id 查看失败日志
注意为了保留启动失败的容器,不能加 --rm 否则失败后容器文件就被删除了。
docker logs -f 容器id 以滚动方式查看容器日志


docker inspect 显示容器信息

docker inspect [OPTIONS] NAME|ID [NAME|ID...]

$ docker inspect blog
[
    {
        "Id": "1b2a948873a0b44a6553dfee4ab96160195d1d41c10047d08744f9331f370195",
        "Created": "2023-08-24T13:24:10.537047009Z",
        "Path": "java",
        "Args": [
            "-jar",
            "/blog-server.jar"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 30211,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2023-08-24T13:24:10.735225254Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:8a4f3b90771a63fca73de426a882b9e540cdb3e82bb54f5c6828fdd0fcac7019",
        "ResolvConfPath": "/var/lib/docker/containers/1b2a948873a0b44a6553dfee4ab96160195d1d41c10047d08744f9331f370195/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/1b2a948873a0b44a6553dfee4ab96160195d1d41c10047d08744f9331f370195/hostname",
        "HostsPath": "/var/lib/docker/containers/1b2a948873a0b44a6553dfee4ab96160195d1d41c10047d08744f9331f370195/hosts",
        "LogPath": "/var/lib/docker/containers/1b2a948873a0b44a6553dfee4ab96160195d1d41c10047d08744f9331f370195/1b2a948873a0b44a6553dfee4ab96160195d1d41c10047d08744f9331f370195-json.log",
        "Name": "/blog",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": [
                "/home/centos/git/hexo/source/_posts:/home/centos/git/hexo/source/_posts",
                "/var/log/spring:/var/log/spring"
            ],
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "host",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": true,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "Capabilities": null,
            "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",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "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": "/var/lib/docker/overlay2/1348860d518c757e7e1ff3c1e6f28c07c19de62d89a7cef4c80ceaad16fe462b-init/diff:/var/lib/docker/overlay2/e8b6a48ed759efa3ae67ecb40263598c0a8b6ee5301462bcc3d83e5e793b1cd2/diff:/var/lib/docker/overlay2/1fa0bf9fa238529796268727234d64c5ae43c0a772777ab5e994e507e0d8941b/diff:/var/lib/docker/overlay2/fe8966ed84314a86ccefe3ba6f82e63e1cf8d26228ac5617e19de5458665a80a/diff:/var/lib/docker/overlay2/02e5f96ab2f2cec701cb9112b46bb70e5f0c9e74e5e2a724209fe877a927ce75/diff:/var/lib/docker/overlay2/1961851b14190d3e33ff7d4da98ebbc6ef15e766381c4d6f33b07b8bfcd640ec/diff:/var/lib/docker/overlay2/71c38e268e4e12d19c1eb6a5f9dac9d368f13e27e38e8cc65fad6d44e0134677/diff:/var/lib/docker/overlay2/a1151919d07928f90f2dfec6cd51f8d481058a9d89a4a85119f6a507ee606f8a/diff:/var/lib/docker/overlay2/bf2ff9aa57906946d9b64e98f7868a098384e9b1eb6a7847dd0b39553be7350e/diff:/var/lib/docker/overlay2/184ccf4335849b0b9d4427c47fed2d4e098fa278841cb3b73b8296a053eb7da2/diff:/var/lib/docker/overlay2/309a7215c73eed1e4362551ef038f89b22fa388289b6bae168eef3d0849e54c8/diff:/var/lib/docker/overlay2/72c8c882fb6eef99e0d0e65c6346123f7e6d518edb5f8a87251dcd1e3d150994/diff",
                "MergedDir": "/var/lib/docker/overlay2/1348860d518c757e7e1ff3c1e6f28c07c19de62d89a7cef4c80ceaad16fe462b/merged",
                "UpperDir": "/var/lib/docker/overlay2/1348860d518c757e7e1ff3c1e6f28c07c19de62d89a7cef4c80ceaad16fe462b/diff",
                "WorkDir": "/var/lib/docker/overlay2/1348860d518c757e7e1ff3c1e6f28c07c19de62d89a7cef4c80ceaad16fe462b/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/var/log/spring",
                "Destination": "/var/log/spring",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "volume",
                "Name": "30fc28fdb0150ac58196c22ed7a93859f4f006a6144e45a7ac1debf48d325dc9",
                "Source": "/var/lib/docker/volumes/30fc28fdb0150ac58196c22ed7a93859f4f006a6144e45a7ac1debf48d325dc9/_data",
                "Destination": "/tmp",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "bind",
                "Source": "/home/centos/git/hexo/source/_posts",
                "Destination": "/home/centos/git/hexo/source/_posts",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
        "Config": {
            "Hostname": "lightsail",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "SPRING_PROFILES_ACTIVE=prod",
                "PATH=/opt/java/openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "LANG=en_US.UTF-8",
                "LANGUAGE=en_US:en",
                "LC_ALL=en_US.UTF-8",
                "JAVA_VERSION=jdk8u382-b05",
                "JAVA_HOME=/opt/java/openjdk",
                "LD_LIBRARY_PATH=:/usr/lib64"
            ],
            "Cmd": null,
            "Image": "blog",
            "Volumes": {
                "/tmp": {}
            },
            "WorkingDir": "",
            "Entrypoint": [
                "java",
                "-jar",
                "/blog-server.jar"
            ],
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20201113",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS",
                "org.opencontainers.image.created": "2020-11-13 00:00:00+00:00",
                "org.opencontainers.image.licenses": "GPL-2.0-only",
                "org.opencontainers.image.title": "CentOS Base Image",
                "org.opencontainers.image.vendor": "CentOS"
            }
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "1784dcbf33ad6f4b77cee88b29fd5a20c004ae83314449e6a8e3d65ec4da0432",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/default",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "",
            "Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "MacAddress": "",
            "Networks": {
                "host": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "f2bdcc4e19f4fddcc771e5107d9aeb36e7bdfcd1a2ff93afb3d34da6cbce33b7",
                    "EndpointID": "f27b48b87af78897921f13db8187b4c17756f8d63a0ff51ac292e0372c6ce443",
                    "Gateway": "",
                    "IPAddress": "",
                    "IPPrefixLen": 0,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "",
                    "DriverOpts": null
                }
            }
        }
    }
]

查看Docker容器的启动命令

1、如果在容器内部,可以用 ps -fe 查看,其中 1 号进程就是启动命令

2、在容器外部,物理机上,可以用 docker inspect container_id/name 查看,Config 中的 Cmd 或 Entrypoint 就是启动命令
或者直接 docker inspect --format '{{.Config.Cmd}}' container_id

runlike 查看运行中容器的完整docker run命令

可以使用 python 工具 runlike 查看运行中容器的完整 docker run 命令
pip install runlike
runlike container_id

例如:

runlike selenium-standalone-chrome
docker run --name=selenium-standalone-chrome --hostname=centos --user=1200 --env='SE_OPTS=-port 8444' --network=host --log-opt max-size=50m --log-opt max-file=5 --runtime=nvidia --detach=true dockerproxy.net/selenium/standalone-chrome:3.141.59 /opt/bin/entry_point.sh

runlike selenium-standalone-firefox
docker run --name=selenium-standalone-firefox --hostname=centos --user=1200 --env='SE_OPTS=-port 8445' --network=host --log-opt max-size=50m --log-opt max-file=5 --runtime=nvidia --detach=true dockerproxy.net/selenium/standalone-firefox:3.141.59 /opt/bin/entry_point.sh

上一篇 Docker-Compose

下一篇 Docker-Dockerfile

阅读
评论
9.2k
阅读预计44分钟
创建日期 2025-08-05
修改日期 2025-08-05
类别
标签
目录
  1. docker info 查看docker信息
    1. 查看 Root Dir
    2. 查看 docker 的 cgroup driver
  2. docker system df 查看docker磁盘占用
    1. 查看docker容器占用磁盘空间大小
    2. docker/containers 目录磁盘占用大清理
    3. 限制 docker 控制台日志大小
  3. docker system prune 系统清理
  4. docker image prune -a 清理悬空镜像
    1. docker rmi 批量删除none镜像
  5. docker search
  6. docker network
    1. docker network create
  7. docker run 运行容器
    1. -it 进入容器
    2. -it --user root 以root身份进入容器
    3. --network,--net 指定容器网络模式
    4. -v 映射文件/文件夹
    5. --mount 挂载卷
    6. -u 指定容器的用户和组
    7. --privileged 特权模式
    8. --platform 指定架构
    9. --gpus 指定 NVIDIA GPU 资源
    10. 容器无法启动问题排查
    11. docker容器何时变为up状态?
  8. docker push 推镜像
  9. docker image inspect 查看镜像详细信息
    1. docker image inspect 查看镜像的架构
  10. docker manifest inspect 查看镜像的manifest列表
  11. docker pull 下载镜像
    1. –platform 指定架构
    2. 修改docker镜像存储位置
      1. 软链接
      2. 修改 docker 配置文件
      3. 修改docker.service服务配置
    3. docker no space left on device
  12. docker images 列出本机镜像
  13. docker image rm 删除本地镜像
  14. docker build 构建镜像
    1. –platform 构建多架构镜像
    2. M1 Mac 上打的镜像默认是arm64架构的
    3. 构建上下文
    4. .dockerignore
  15. docker history 查看镜像历史
  16. docker ps 列出本机容器
  17. docker container start 启动已终止容器
  18. docker stop 终止容器
  19. docker rm 删除容器
  20. docker exec 进入容器执行命令
    1. OCI runtime exec failed bash executable file not found
  21. docker commit 将容器保存为镜像
  22. docker save 导出镜像
    1. 利用 docker save/load 导入导出镜像
    2. 内网下载docker镜像
  23. docker load 导入镜像
  24. docker cp 在容器和宿主机间拷贝文件/目录
  25. docker tag 重命名镜像
  26. docker logs 查看容器日志
  27. docker inspect 显示容器信息
    1. 查看Docker容器的启动命令
    2. runlike 查看运行中容器的完整docker run命令

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论