Blogger Information
Blog 28
fans 0
comment 0
visits 16745
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
Docker 实用技巧拾遗
Coco
Original
377 people have browsed it

前言

最近发现身边不少的运维老鸟对于一些 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


Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post