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镜像管理
得到一个镜像的方式
- pull
- load
- build
- import
- commit
- 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_VALUEbuild
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.gzexport
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-alpinedockerfile 常用项
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
donedaemon.json
官方版本的配置文件路径 /etc/docker/daemon.json
厂商发行版本的一般配置路径
- systemd-unit 文件内
- /etc/sysconfig/docker
- 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": ""
}最后更新于