docker工具箱

docker常用工具

排查分析

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

# 进入容器的网络命名空间

# 获取容器的命名空间 ID
docker inspect --format "{{.State.Pid}}" wcn7-elasticsearch-1
crictl inspect <container-id> | grep  pid

# 进入指定 id 的网络命名空间
nsenter -n -t <pid>

# 一步进入网络ns
nsenter -n -t $(docker inspect --format "{{.State.Pid}}" v2raya)

nsenter -n -t $(crictl inspect -o go-template --template='{{ .info.pid }}' $(crictl ps | grep kube-scheduler | awk '{print $1}'))

# 在不 exec 进入容器, 查看和编辑容器文件
/proc/<pid>/root/


# 查找容器在宿主机的 rootfs
docker inspect 4b30b34c8434 | egrep -i mergeddir
docker inspect  -f '{{.GraphDriver.Data.MergedDir}}' 4b30b34c8434


# 日志
docker logs --tail 50 -f xxxx
docker logs --tail 50 -f -t xxxx    # 带时间输出
docker logs --since 2025-02-01 -f   # 指定时间开始


# 检查 - 配置文件和环境, 启动错误等
dockerd --validate


# 检查 Dockerfile 中的 CMD/ENTRYPOINT
docker inspect my-app:latest --format='{{json .Config.Cmd}}'
docker inspect my-app:latest --format='{{json .Config.Entrypoint}}'

环境

1
2
3
4
5
6
7
8
9
docker volume ls --format "{{.Name}}"   # 列出卷名称

# 查看磁盘使用情况
docker system df
docker system df -v

docker system prune -f --volumes        # 清理未使用的资源

docker stats --all      # 监控所有运行中容器的资源使用情况

容器管理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10

docker stop $(docker ps -q)             # 停止全部容器-运行中的
docker restart $(docker ps -q)          # 重启所有容器

docker rm $(docker ps -aq -f "status=exited")       # 删除所有停止的容器
docker rmi $(docker images -q -f "dangling=true")   # 删除 dangling 镜像 | 无标签的镜像 ID


# 更新容器配置 - 重启策略
docker update --restart=always nacos

镜像管理

得到一个镜像的方式

  1. pull
  2. load
  3. build
  4. import
  5. commit
  6. export
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17

# 列出全部镜像:tag
docker images
docker image ls
docker images --format "{{.Repository}}:{{.Tag}}"
docker image ls -f dangling=true        # dangling=true 显示没有使用过的镜像
docker image ls --no-trunc              # 不截断输出

# 下载并直接推送到目标服务器
docker save ghcr.io/psviderski/unregistry:X.Y.Z | ssh user@server docker load

docker rmi <images>                     # 删除镜像
docker rmi $(docker images -q)

docker commit <container> [repo:tag]    # 将一个 container 固化为一个新的 image

docker search fedora                    # 从仓库搜索镜像

上传/下载

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
docker pull/push NAME:TAG               # 下载/上传镜像到 registry server

# 拉取不同架构的镜像 - 方案一
docker pull --platform=arm64/amd64 nginx:alpine

# 拉取不同架构的镜像 - 方案二
export DOCKER_DEFAULT_PLATFORM=linux/amd64


# 按镜像的 sha256 来拉取
docker pull IMAGE_NAME:TAG@sha256:SHA256_VALUE
docker pull IMAGE_NAME@sha256:SHA256_VALUE

build

1
docker build -t chenwx/app:0.3 -f dockerfile/app.dockerfile .

save/load 镜像

save 导出的镜像,有包含该镜像的版本记录,包含一些历史数据

1
2
3
4
docker save -o img.tar IMAGE_ID     # 注意会丢失 REPOSITORY:TAG 信息
docker save -o img.tar image_name   # 会丢失 TAG 信息
docker save image_name > /tmp/img.tar
docker save -o img.tar img:TAG      # 推荐

load 镜像

1
2
3
docker load < /tmp/img.tar
docker load -i img.tar
docker import xxx.tar.gz

export

1
2
docker export app > app.tar         # 将容器导出成镜像
docker import app.tar app:latest    # 导入容器

常用镜像

1
2
3
4
5
6
7
docker pull alpine:3.11.6
docker pull centos:7.5.1804
docker pull python:3.7.0-slim
docker pull python:3.7.0-alpine

docker pull redis:4.0.10-alpine
docker pull nginx:1.15.1-alpine

dockerfile 常用项

1
2
ENV LANG "en_US.UTF-8"      # 即容器内语言
ENV TZ "Asia/Shanghai"      # 时区

代理

1
2
3
4
5
6
7
# proxy
/usr/lib/systemd/system/docker.service
Environment="HTTP_PROXY=http://192.168.0.73:15732"
Environment="HTTPS_PROXY=http://192.168.0.73:15732"

systemctl daemon-reload
systemctl restart docker

其它

临时性能记录脚本

1
2
3
4
5
6
7
#!/bin/bash
# 持续记录监控数据
while true; do
  echo  "$(date '+%Y-%m-%d %H:%M:%S')," >> stats.log
  docker stats --no-stream --format "{{.Name}},{{.CPUPerc}},{{.MemUsage}},{{.NetIO}},{{.BlockIO}},{{.PIDs}}" >> stats.log
  sleep 60
done

daemon.json

官方版本的配置文件路径 /etc/docker/daemon.json

厂商发行版本的一般配置路径

  1. systemd-unit 文件内
  2. /etc/sysconfig/docker
  3. C:\ProgramData\docker\config\daemon.json

官方文档

https://docs.docker.com/config/daemon/

简版

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{
  "insecure-registries": ["http://192.168.65.27"],
  "live-restore": true,
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  },
  "data-root": "/apps/data"
}

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
{
    // docker 自身相关

    // 修改 /var/lib/docker 的 docker root 目录, 可以使用 docker info 确认
    // 也是可以用软链接的
    "data-root": "/data/docker",
    "storage-driver": "overlay2",        // 默认即 overlay2
    "storage-opts": [
        "overlay2.override_kernel_check=true"
      ],

    "hosts":["tcp://0.0.0.0:2375","unix:///var/run/docker.socket"],


    "selinux-enabled":false,

    // 早期是 cgroupfs, 推荐 systemd
    "exec-opts": ["native.cgroupdriver=systemd"],

    "pidfile": "",

    "tls": true,
    "tlscacert": "",
    "tlscert": "",
    "tlskey": "",
    "tlsverify": true,      // 远程访问管理 api 时要求 tls 校验证书

    //=============================================================

    // 集群相关
    "swarm-default-advertise-addr": "",
    "cluster-advertise": "",
    "cluster-store": "",
    "cluster-store-opts": {},

    //=============================================================
    // 仓库相关

    // 会将所有未指定源的仓库(即docker-hub)请求都走镜像站
    "registry-mirrors": [
        "https://registry.cn-hangzhou.aliyuncs.com",    // 这个镜像是可用的
    ],

    // 可信的内部仓库, 可以使用 http or https
    "insecure-registries": ["localhost:5000", "registry.wait"],

    "max-concurrent-downloads": 20,     // 增加下载并发数
    "max-concurrent-uploads": 10,
    "max-download-attempts": 5,

//=============================================================
    // 网络相关

    "dns": ["8.8.8.8", "8.8.4.4"],  // 容器内使用的 dns
    "dns-opts": [],
    "dns-search": [],
    "mtu": 1500,

    "default-address-pools": [
        {
          "base": "172.30.0.0/16",
          "size": 24
        },
        {
          "base": "172.31.0.0/16",
          "size": 24
        }
      ],

      "default-gateway": "",
      "default-gateway-v6": "",

      "ip": "0.0.0.0",
      "ip-forward": false,
      "ip-masq": false,

      // 为了避免和 firewalld 冲突, 可以关闭 docker 配置 iptable, 改为手工配置规则的方式
      "iptables": false,
      "ip6tables": false,
      "ipv6": false,

//=============================================================
    // 容器实例相关

    // 重启 docker daemon 时, 不停止容器实例
    // 理解为暂时托管给 systemd, 再次启动后又重新接管
    // 但是有一些限制, 如大版本升级时, 可能接管不了, 还是需要手工重启容器
    // 不支持 swarm 模式, 对日志输出似乎也有一些影响
    // 在修改或升级 docker daemon 后, 容器状态不会重启更新, 所以可能会导致状态差异;
    // 不经常变更和升级的生产环境可以开启
    "live-restore": true,

    "containerd": "/run/containerd/containerd.sock",
    "containerd-namespace": "docker",
    "containerd-plugin-namespace": "docker-plugins",


    // 容器日志
    "log-driver": "json-file",
    "log-level": "",
    "log-opts": {
        "max-size": "100m",
        "max-file": "10",

        "cache-disabled": "false",
        "cache-max-file": "5",
        "cache-max-size": "20m",
        "cache-compress": "true",
        "env": "os,customer",
        "labels": "somelabel"

    },

    "raw-logs": false,

    "runtimes": {
        "cc-runtime": {
          "path": "/usr/bin/cc-runtime"
        },
        "custom": {
          "path": "/usr/local/bin/my-runc-replacement",
          "runtimeArgs": [
            "--debug"
          ]
        }
      },

      "shutdown-timeout": 15,
//=============================================================

      "allow-nondistributable-artifacts": [],
      "api-cors-header": "",
      "authorization-plugins": [],
      "bip": "",
      "bridge": "",

      "debug": true,

      "cgroup-parent": "",
      "default-cgroupns-mode": "private",

      "default-runtime": "runc",
      "default-shm-size": "64M",
      "default-ulimits": {
        "nofile": {
          "Hard": 64000,
          "Name": "nofile",
          "Soft": 64000
        }
      },


      "exec-root": "",
      "experimental": false,
      "features": {},
      "fixed-cidr": "",
      "fixed-cidr-v6": "",
      "group": "",


      "icc": false,             // 禁用容器间通信
      "init": false,
      "init-path": "/usr/libexec/docker-init",

      "labels": [],

      "no-new-privileges": false,
      "node-generic-resources": [
        "NVIDIA-GPU=UUID1",
        "NVIDIA-GPU=UUID2"
      ],
      "oom-score-adjust": -500,

      "seccomp-profile": "",

      "userland-proxy": false,      // 优化网络性能
      "userland-proxy-path": "/usr/libexec/docker-proxy",
      "userns-remap": ""


}
Licensed under CC BY-NC-SA 4.0
转载或引用本文时请遵守许可协议,知会作者并注明出处
不得用于商业用途!
最后更新于 2023-02-10 00:00 UTC