日志
- 2023-05-04:新增Watchtower自动更新Docker镜像的教程。详见“自动更新容器镜像”小节。
- 2023-04-30:更新实用Docker命令。
清理镜像/卷
可以极大地减少Docker的空间占用!
前言
一般来说,Docker
是开箱即用的。不过,如果你是在国内用docker,并且你想用非root用户使用docker,就需要进行一些设置了。
这里把安装的代码也搞一份过来,以免大家不断地翻页。
安装Docker
首先看看自己的VPS有没有安装好Docker了:
which docker # /usr/bin/docker
国内VPS的Ubuntu用户可以根据菜鸟教程来安装。
我们可以先创建一个文件夹(可能没什么用,哈哈)
mkdir -p ~/docker/@install/ && cd ~/docker/@install/
如果你已经安装了docker,就不要运行下面的命令!如果你没有安装docker,可以运行:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
国外VPS的用户也可以参考官方安装方法,就是用不同的镜像嘛。
等安装完后,看一下docker:
which docker # /usr/bin/docker
安装docker-compose
我们下面安装一下docker-compose
,这个是一个布署docker服务的神器。你可以在这里查看docker-compose的最新发行版。选一个最新的版本下载即可。比如我写此博文的时候,是v2.4.1。运行以下命令
sudo curl -L "https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
国内的VPS可以用:
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
然后进行一些设置:
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
最后,看一下docker-compose
的版本:
docker-compose --version # docker-compose version 1.28.6, build 5db8d86f
Docker全局设置
换镜像源
我参考了这个博文:docker 修改使用国内镜像源
如果你需要修改镜像源的话,可以按下面的方法修改。
修改/etc/docker/daemon.json文件,如果没有先建一个即可:
sudo vim /etc/docker/daemon.json
比如,改成:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
"log-driver":"json-file",
"log-opts": {"max-size":"100m", "max-file":"3"}
}
registry-mirrors
设置了一个国内的镜像;log-driver
、log-opts
主要是管理Docker日志保存的方式和大小限制。见下面的日志管理
。
然后,reload下docker:
sudo systemctl daemon-reload
sudo systemctl restart docker
检查一下配置是否生效:
sudo docker info|less
检索一下应用:
sudo docker search nginx
可以正常、快速地检索说明生效了。
有不少镜像源可以选:
- 阿里云:https://registry.cn-hangzhou.aliyuncs.com
- docker中国:https://registry.docker-cn.com
- 网易:http://hub-mirror.c.163.com
- 腾讯云:https://mirror.ccs.tencentyun.com
自己也可以搜索一下哪些可以用。
日志管理
参考sleele的《限制Docker容器日志大小+清理日志脚本》。
首先,新建一个clean_docker_log.sh
文件:
vim ~/clean_docker_log.sh
填入以下内容:
#!/bin/sh
echo "======== start clean docker containers logs ========"
logs=$(find /var/lib/docker/containers/ -name *-json.log)
for log in $logs
do
echo "clean logs : $log"
cat /dev/null > $log
done
echo "======== end clean docker containers logs ========"
其实这个脚本的逻辑特别简单,就是清理/var/lib/docker/containers/
以-json.log
格式的文件。我们给予其可执行权限并进行软链接:
sudo chmod +x ~/clean_docker_log.sh && sudo ln -s `echo ~`/clean_docker_log.sh /usr/bin/clean_docker_log
然后平时运行:
clean_docker_log
就可以即时清理docker容器的日志。当然,你也可以设置cron定时任务,比如:
# clean docker logs every 10-day
* * */10 * * root /usr/bin/clean_docker_log >/dev/null 2>&1
添加非root用户
原理很简单,就是将某个用户添加到docker用户组里即可。
比如,我有一个test_user
用户。我可以这样:
sudo groupadd docker # 一般已经是内置的
sudo usermod -aG docker test_user
重启一下docker:
sudo systemctl restart docker
重新登陆当前用户:
su test_user
查看一下id:
id
输出类似于,用户组已经有docker:
... groups=... 998(docker)
就成功啦!
实用Docker命令
列出所有安装的镜像
docker image list
查看镜像的详细信息
# docker inspect <镜像名:tag>
docker inspect kerwin1202/chatgpt-web:latest
清理镜像/卷
随着使用时间延长,我们可能会产生很多废弃的镜像和卷;删除它们可以有效地释放磁盘空间。你可以通过下面的命令简单删除它们:
# 所有未被容器使用的镜像
docker images -qf dangling=true
# 删除所有未被容器使用的镜像
docker rmi $(docker images -qf dangling=true)
# 所有未被容器使用的卷
docker volume ls -qf dangling=true
# 删除所有未被容器使用的卷
docker volume rm $(docker volume ls -qf dangling=true)
输出日志
观察某个container最后20条日志:
docker logs <app> --tail=20 -f
观察某个docker-compose应用最后20条日志
docker-compose logs --tail=20 -f
Container数量
计算目前正在运行的container数量(来自Derek):
echo "Docker Running $(expr $(docker ps --all --format "table {{.Names}} {{.Status}} " -f status=running | wc -l) - 1)"
自动更新容器镜像
不了解docker compose的小伙伴请先看:《Docker系列 了解Docker Compose的配置文件》。
在实际使用中,大多数镜像还是适合做好备份再手动更新。不过,也有一些docker镜像,运行模式十分固定但是更新又很频繁,它们还是推荐自动更新。Watchtower是一个经典的用于自动更新Docker容器的工具。
这里我示例如何利用Watchtower自动更新diygod/rsshub:chromium-bundled
:
version: "3"
services:
watchtower:
image: containrrr/watchtower
container_name: watchtower
restart: unless-stopped
environment:
TZ: Asia/Shanghai
WATCHTOWER_NOTIFICATION_TITLE_TAG: Oracle01 # 邮件抬头
WATCHTOWER_MONITOR_ONLY: 'false'
WATCHTOWER_NOTIFICATIONS: email
WATCHTOWER_NOTIFICATION_EMAIL_FROM: [email protected] # 发送邮件
WATCHTOWER_NOTIFICATION_EMAIL_TO: [email protected] # 接收邮件
# SMTP帐号信息
WATCHTOWER_NOTIFICATION_EMAIL_SERVER: smtp.qq.com
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT: 465
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER: [email protected]
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD: xxxxxxxx # 按需改密码
WATCHTOWER_NOTIFICATION_EMAIL_DELAY: 2
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: bitwarden-app-1 --cleanup --schedule "0 0 6 * * *"
# 在command中可以添加多个容器名
# command: rsshub watchtower go-chatgpt-api chatgpt-proxy-server-warp duplicat portainer privatebin bitwarden wallabag ttrss alist --cleanup --interval 3600
# --schedule "0 0 4 * * *"
注意事项:
- command中是容器名而不是镜像名。我之前没仔细看,卡了好久 (ฅ´ω`ฅ) 容器名每个人的都是不一样的,大家可以用Portainer或者用
docker ps --format '{{.Names}}'
命令查看。 - 如果你要自动更新全部docker容器的相关镜像,不指定任何容器即可。
--cleanup
:更新镜像后自动删除旧镜像。--interval 3600
:每3600s(1h)检测更新1次。--schedule "0 0 6 * * *"
代表每天6时0分0秒进行一次检测。我个人比较倾向于每天检查一次更新,毕竟像privatebin、rsshub等镜像的自动更新频率是很高的,这样比较节省VPS流量(当然,使用Racknerd VPS的我并不是很担心流量问题)。
更多参数详见:Arguments – Watchtower。
小结
虽然我们添加了一个非root用户在docker的用户组,但是docker实际运行的时候,还是可能会用一些root权限。只不过这个root权限和宿主的root相比,权限是经过阉割的。所以应该还是安全的。
之后就开始玩Docker吧!
扩展阅读
- Docker-从入门到实践:比较系统的教程,写得不错,有兴趣可以看看。
- 如何删除Docker容器,镜像,卷和网络 | myfreax
- Watchtower自动升级Docker容器并发送邮件提醒教程 – 知乎
---------------
完结,撒花!如果您点一下广告,可以养活苯苯😍😍😍
利用Watchtower自动更新diygod/rsshub:chromium-bundled.写在哪个文件里面呢?
具体见“自动更新容器镜像”小节。 那里给出一个docker-compose.yml的示例。 您可能是对docker-compose不太了解,所以才有此问。 具体可见: 《Docker系列 了解Docker Compose的配置文件》。
如果是用docker compose部署的容器能用这种方法自动升级吗
可以的 ~
国内能不能直接使用宝塔面板内的docker,博主可以去看一看
对宝塔不熟悉,暂时也没有深入了解的打算。 docker默认的方法足够好了
想问一下博主自动更新镜像这里的 command: rsshub:chromium-bundled –cleanup –schedule “0 0 6 *” 填的是 docker ps 中的 IMAGE 值还是 NAMES 值啊?|´・ω・)ノ
我推测是name里面的某个字符。 比如,如果你有两个镜像叫rsshub01和rsshub02。 你写
rsshub
,这两个都会更新。我暂时还不太确定。 比如,我写了rsshub,但实际上rsshub:chromium-bundled并没有被更新。
我已经确定了——写的是容器名而不是镜像名。 教程也相应更新了 ヾ(≧∇≦*)ゝ
太好了!!