前言
最近发现身边不少的运维老鸟对于一些 Docker 常用操作还不太清楚,或者使用来一些比较复杂的实现方式。文本主要记录一下可能不太常见,但是非常实用的 Docker 小技巧。
信息查看
查看容器资源使用情况
docker stats
查看容器内进程
docker top <container>
查看数据占用
docker system df
这几个命令很简单,一般大家都知道,还有些图形界面的服务,可视化展示的,如 Google 的 cAdvisor 和 Prometheus。还有些商业化软件就不写了。
瘦身
清除无用的数据非常常见,例如删除失败的容器,删除没有运行的镜像等等,最近发现有些人还是使用 ps 列出 ID 之后一个个复制删除,其实有更高效的方法。
docker ps 有个 -f 参数可以帮助我们筛选容器。
例如,获取正在运行的容器
docker ps -f status=running
获取状态为 exited 的容器
docker ps -f status=exited
配合 -q 参数(只输出 ID)和 docker rm 命令可以快速删除容器。
docker rm $(docker ps -qf status=exited)
还是嫌麻烦?Docker 其实直接给我提供了命令。
清除未运行的容器
docker container prune
这个命令可以直接删除停止的容器(会询问,-f 选项强制),不过删除需谨慎,请确认后再操作。
同样的还有其他的清除命令。
清除未使用的镜像
docker image prune
清除未使用的网络
docker network prune
清除未使用的卷(Volume)
docker volume prune
以及,终极命令,上面命令的集合
清除所有未使用的资源
docker system prune
配置
Docker Daemon 有很多配置非常有用,必要时可以修改。配置文件的地址是:/etc/docker/daemon.json。
不存在就创建,修改后需要重启 docker 服务生效。
修改镜像源
这个很多人都知道,由于国内网络的原因,除非忍受力非常好,基本是必改的。很多云服务商都是提供镜像加速地址的,例如阿里云的,只要有账户就可以生成,免费使用。
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
修改 Docker 存储路径
因为 Docker 存储目录可能非常大,我们有时候需要移到其他磁盘上。可以修改配置生效。
{
"data-root": "/mnt/docker-data"
}
还有一个办法就是将目录移动到其他磁盘后,创建一个软链接。
mv /var/lib/docker /mnt/docker-data
ln -s /mnt/docker-data /var/lib/docker
日志配置
Docker 的日志输出也可以配置,就是 docker logs 看到的。同时也避免QQ转让平台日志文件过大,占用过多磁盘空间。
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
log-driver 配置日志驱动,驱动非常多,还有第三方的插件,最常用的就是 json-file(也是默认的),Docker CE 能和 docker logs 配合使用的只有这三个。
localjson-filejournald
log-opts 是日志驱动的配置,对于 json-file 的主要配置 max-size 和 max-file 配置滚动日志的最大单文件大小和数量。
而 json 日志文件存放在 /var/lib/docker/containers/<container_id>/<container_id>_json.log。
ulimit 设置
部分容器运行对 ulimit 有要求,如 Elasticsearch,我们可以在运行时指定,
docker run -d --ulimit nofile=20480:40960 nproc=1024:2048 <image>
也可以进行全局配置
{
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 64000,
"Soft": 64000
}
}
}
容器存活
一般情况下,Docker Daemon 不稳定或重启时,所有的容器进程都会停止。我们可以开启 live-restore 功能,这样即使 Docker Daemon 挂掉,容器的进程也不会被杀死。对于我们需要经常升级版本、更改配置等原因重启 Docker,但是不想要重启所有容器的时候非常有用。
{
"live-restore": true
}
需要注意的是,个别大版本更新或者修改了 Daemon 的 bridge IP,graph driver 等配置,Docker Daemon 重启后会无法恢复对容器的控制,容器进程将会失去 Docker 的管理,需要手动干预。
CGroups 配置
CGroups 是 Control Groups 的缩写,是 Docker 用来限制容器资源使用的组件,如 CPU,内存的限制等。在用容器编排的时候非常有用,如 Kubernetes 中使用 Docker。Docker 默认的 cgroups 驱动是 cgroupfs,而对于有 systemd 的系统来说,systemd 和 cgroups 有更紧密的连接且针对单个进程控制。Kubernetes 也推荐使用 systemd 作为 cgroups 驱动,不然可以看到类似如下的警告:
[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
修改 cgroups 驱动配置。
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
网络代理
网络代理适用于不能直接访问外网下载镜像,或者镜像服务器在特殊的内网,不能直接访问的情况。
下面是使用 systemd 下的配置,首先创建配置目录
mkdir -p /etc/systemd/system/docker.service.d
创建配置文件 /etc/systemd/system/docker.service.d/http-proxy.conf,加入如下内容,类似于 Linux 的代理设置,这里也是配置 HTTP_PROXY 环境变量。
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/"
当然可以更灵活,用 HTTP_PROXY 配置 HTTP 代理,HTTPS_PROXY 配置 HTTPS 代理,NO_PROXY 配置不用代理。
[Service]
Environment="HTTP_PROXY=http://proxy-addr:proxy-port" "HTTPS_PROXY=http://proxy-addr:proxy-port" "NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com"
然后,需要重新载入配置和重启服务。
sudo systemctl daemon-reload
sudo systemctl restart docker
可以通过如下命令查看是否配置成功。
systemctl show --property=Environment docker