Docker 实用技巧拾遗

前言

最近发现身边很多的运维老鸟对于一些 Docker 经常使用操做还不太清楚,或者使用来一些比较复杂的实现方式。文本主要记录一下可能不太常见,可是很是实用的 Docker 小技巧。git

信息查看

查看容器资源使用状况

docker stats
复制代码

查看容器内进程

docker top <container>
复制代码

查看数据占用

docker system df
复制代码

这几个命令很简单,通常你们都知道,还有些图形界面的服务,可视化展现的,如 Google 的 cAdvisorPrometheus。还有些商业化软件就不写了。github

瘦身

清除无用的数据很是常见,例如删除失败的容器,删除没有运行的镜像等等,最近发现有些人仍是使用 ps 列出 ID 以后一个个复制删除,其实有更高效的方法。docker

docker ps 有个 -f 参数能够帮助咱们筛选容器。json

例如,获取正在运行的容器bash

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 选项强制),不过删除需谨慎,请确认后再操做。 一样的还有其余的清除命令。ide

清除未使用的镜像

docker image prune
复制代码

清除未使用的网络

docker network prune
复制代码

清除未使用的卷(Volume)

docker volume prune
复制代码

以及,终极命令,上面命令的集合ui

清除全部未使用的资源

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 看到的。同时也避免日志文件过大,占用过多磁盘空间。

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}
复制代码

log-driver 配置日志驱动,驱动很是多,还有第三方的插件,最经常使用的就是 json-file(也是默认的),Docker CE 能和 docker logs 配合使用的只有这三个。

  • local
  • json-file
  • journald

log-opts 是日志驱动的配置,对于 json-file 的主要配置 max-sizemax-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
复制代码

参考

相关文章
相关标签/搜索