docker工具箱

docker工具箱

排查分析


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

# 获取容器的命名空间 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}'))


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

环境

docker volume ls --format "{{.Name}}"   # 列出卷名称

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

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

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

容器管理


docker exec -it xxxx sh                 # 进入容器

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

启动容器

docker run --restart=always -d --rm --name xxx -p 3000:3000 --network xxxnet1

# 启动
# --net="host"
# --restart=always
# -p 1000:1000
# -e AENV='xxx2' -e DB_HOST=standalone

docker run -it --name test -h test  --rm alpine:3.11.6 sh

# 替代 entrypoint 参数
docker run -it --entrypoint sh nginx:1.23.1-alpine

镜像管理

得到一个镜像的方式

  1. pull
  2. load
  3. build
  4. import
  5. commit
  6. export

# 列出全部镜像: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                    # 从仓库搜索镜像

上传/下载

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

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

save/load 镜像

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

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 镜像

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

export

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

skopeo

# 下载到本地
skopeo copy --override-arch amd64 --override-os linux \
    docker://kong:2.8.1 \
    docker-archive:v2raya.tar:mzz2017/v2raya:v2.2.7.4

# 拉取+推送到仓库
skopeo copy --override-arch amd64 --override-os linux \
    docker://kong:2.8.1 \
    docker://harbor.services.wait/docker.io/kong:2.8.1

常用镜像

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 常用项

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

代理

# 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

其它

临时性能记录脚本

#!/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/

简版

{
  "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"
}

{
    // 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 模式, 对日志输出似乎也有一些影响
    "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": ""


}
最后更新于