Docker系列 配置Docker全局环境
本文最后更新于 558 天前,如有失效请评论区留言。

本博客由Faconhost大力赞助!如何更快地访问本站?有需要可加电报群获得更多帮助。本博客用什么VPS?创作不易,请支持苯苯!推荐购买本博客的VIP喔,10元/年即可畅享所有VIP专属内容!

日志

  • 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-driverlog-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吧!

扩展阅读

---------------
完结,撒花!如果您点一下广告,可以养活苯苯😍😍😍

感谢Faconhost的友情赞助 (ฅ´ω`ฅ) 本博客基于m2w创作。版权声明:除特殊说明,博客文章均为Bensz原创,依据CC BY-SA 4.0许可证进行授权,转载请附上出处链接及本声明。VIP内容严禁转载!由于可能会成为AI模型(如chatGPT)的训练样本,本博客禁止将AI自动生成内容作为文章上传(特别声明时除外)。如有需要,请至学习地图系统学习本博客的教程。加Telegram群可获得更多帮助喔! | 博客订阅:RSS | 广告招租请留言 | 博客VPS | 致谢渺软公益CDN |

评论

  1. yyl
    Windows Edge 128.0.0.0
    3 月前
    2024-9-02 21:24:36

    利用Watchtower自动更新diygod/rsshub:chromium-bundled.写在哪个文件里面呢?

    • 博主
      yyl
      Windows Edge 128.0.0.0
      2 月前
      2024-9-09 21:59:33

      具体见“自动更新容器镜像”小节。 那里给出一个docker-compose.yml的示例。 您可能是对docker-compose不太了解,所以才有此问。 具体可见: 《Docker系列 了解Docker Compose的配置文件》。

  2. i_orange
    Windows Chrome 119.0.6045.160
    8 月前
    2024-4-05 11:04:35

    如果是用docker compose部署的容器能用这种方法自动升级吗

    • 博主
      i_orange
      Windows Edge 123.0.0.0
      8 月前
      2024-4-05 14:22:32

      可以的 ~

  3. Windows Edge 114.0.1823.41
    1 年前
    2023-6-09 22:20:19

    国内能不能直接使用宝塔面板内的docker,博主可以去看一看

    • 博主
      栋dong
      Windows Edge 114.0.1823.41
      1 年前
      2023-6-09 22:22:44

      对宝塔不熟悉,暂时也没有深入了解的打算。 docker默认的方法足够好了

  4. shule
    Windows Chrome 112.0.0.0
    2 年前
    2023-5-07 12:08:24

    想问一下博主自动更新镜像这里的 command: rsshub:chromium-bundled –cleanup –schedule “0 0 6 *” 填的是 docker ps 中的 IMAGE 值还是 NAMES 值啊?|´・ω・)ノ

    • 博主
      shule
      Windows Edge 112.0.1722.68
      2 年前
      2023-5-07 12:09:59

      我推测是name里面的某个字符。 比如,如果你有两个镜像叫rsshub01和rsshub02。 你写rsshub,这两个都会更新。

    • 博主
      shule
      Windows Edge 112.0.1722.68
      2 年前
      2023-5-07 12:11:57

      我暂时还不太确定。 比如,我写了rsshub,但实际上rsshub:chromium-bundled并没有被更新。

    • 博主
      shule
      Windows Edge 113.0.1774.35
      2 年前
      2023-5-08 12:17:06

      我已经确定了——写的是容器名而不是镜像名。 教程也相应更新了 ヾ(≧∇≦*)ゝ

      • shule
        Bensz
        Windows Chrome 112.0.0.0
        2 年前
        2023-5-08 13:24:54

        太好了!!

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇