分类: 技术

  • 如何使用 Watchtower 自动更新正在运行的 Docker 容器

    对开发运维人员来说,保持 Docker 容器为最新版本是重要工作之一。手动更新 Docker 容器是一项耗时的工作。这篇文章解释了 Watchtower 是什么,如何安装它,以及在 Linux 中如何 使用 Watchtower 自动更新正在运行的 Docker 容器 。

    Watchtower 是什么?

    Watchtower 是一款自由开源的应用,用来监控运行中的 Docker 容器,并且当它发现基础镜像被更改后,可以自动的更新容器。

    若 Watchtower 发现一个运行中的容器需要更新,它会以发送 SIGTERM 信号的方式,优雅的结束运行中容器的运行。

    它会下载新镜像,然后以最初部署时使用的方式,重启容器。所有文件会在后台自动下载,因此不需要用户的介入。

    在这份指南中,我们将会明白如何在类 Unix 系统中使用 Watchtower 自动更新正在运行的 Docker 容器。

    我已经在 CentOS 和 Ubuntu 中测试了这份指南,所有的 Linux 发行版中操作过程都一样。

    在 Linux 中安装 Watchtower

    可以通过 Docker 镜像的方式下载 Watchtower 。因此,部署它是小事一桩。在你的 Linux 中安装 Docker 镜像,然后运行 Watchtower 立即开始监控 Docker 容器。

    参考下方指导在基于 PRM 和 DEB 包管理系统中安装 Docker

    安装 Docker 后,你可以使用以下命令以 root 用户身份部署 Watchtower 容器:

    # docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower

    如果你已经安装了 Docker 桌面版,以普通用户运行 Watchtower 容器。

    $ docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower

    该命令会拉取最新版的 watchtower 镜像,并运行 watchtower 容器。

    输出样例:

    Unable to find image 'containrrr/watchtower:latest' locally
    latest: Pulling from containrrr/watchtower
    1045b2f97fda: Pull complete 
    35a104a262d3: Pull complete 
    1a0671483169: Pull complete 
    Digest: sha256:bbf9794a691b59ed2ed3089fec53844f14ada249ee5e372ff0e595b73f4e9ab3
    Status: Downloaded newer image for containrrr/watchtower:latest
    91c104ef0e9896e8cd5ff30d9f13e728dbfad66443830ec2ac85dde6d7d37564
    Run Watchtower Docker Container

    使用 Watchtower 自动更新 Docker 容器

    在你的系统上,Watchtower 正在和其他容器一起运行。你可以使用一下命令查看运行中的 Docker 容器列表:

    $ docker ps

    输出样例:

    CONTAINER ID   IMAGE                       COMMAND                  CREATED          STATUS          PORTS                                         NAMES
    91c104ef0e98   containrrr/watchtower       "/watchtower"            14 minutes ago   Up 14 minutes   8080/tcp                                      watchtower
    f90b462b0712   bitnami/wordpress-nginx:6   "/opt/bitnami/script…"   19 minutes ago   Up 19 minutes   0.0.0.0:80->8080/tcp, 0.0.0.0:443->8443/tcp   ostechnix-wordpress-1

    正如上方输出所示,watchtower 容器正在和名为 ostechnix-wordpress-1 的容器一起运行。从现在开始,watchtower 会每隔几分钟会检查该容器。

    如果 Watchtower 发现该容器的基础镜像的任何变化,它会优雅的关闭 ostechnix-wordpress-1 容器,然后使用与最初启动它时使用的相同方式,启动新的镜像。

    类似的,它会自动地每隔几分钟检查所有的运行中容器,并自动更新它们。

    Watchtower 如何更新多连接的容器?

    在监视多连接容器时,Watchtower 十分智能。

    假设我们现在运行两个容器。

    $ docker ps

    输出样例:

    CONTAINER ID   IMAGE                       COMMAND                  CREATED          STATUS          PORTS                                         NAMES
    91c104ef0e98   containrrr/watchtower       "/watchtower"            14 minutes ago   Up 14 minutes   8080/tcp                                      watchtower
    f90b462b0712   bitnami/wordpress-nginx:6   "/opt/bitnami/script…"   19 minutes ago   Up 19 minutes   0.0.0.0:80->8080/tcp, 0.0.0.0:443->8443/tcp   ostechnix-wordpress-1
    a895f082438a   bitnami/mariadb:10.6        "/opt/bitnami/script…"   20 minutes ago   Up 19 minutes   3306/tcp                                      ostechnix-mariadb-1
    View Running Docker Containers

    正如你看到的,我们正在运行 ostechnix-wordpress-1 和 ostechnix-mariadb-1 这两个容器。ostechnix-mariadb-1 容器链接到 ostechnix-wordpress-1 容器。

    如果 Watchtower 发现 ostechnix-wordpress-1 容器有个新版本,它会先关闭与之相连接的 ostechnix-mariadb-1 容器 ,然后才会关闭 ostechnix-wordpress-1 容器。

    更新 ostechnix-wordpress-1 容器后,Watchtower 会以正确的顺序,且与最初启动它们时使用的相同方式,重启这两个容器,以便应用程序正确恢复。在我们的例子中,首先启动的是 ostechnix-mariadb-1 容器,然后是 ostechnix-wordpress-1 容器,以确保连接能够继续运行。

    监控特定容器

    默认情况下,Watchtower 将监控在它所指向的 Docker 守护进程中运行的所有 Docker 容器。

    不过,你可以像下面这样,通过指定容器名称限制 Watchtower 监视特定的 Docker 容器。

    $ docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower ostechnix-wordpress-1

    在上方的例子中,watchtower 会忽略其他容器,只监视名为 ostechnix-wordpress-1 的容器更新情况。

    如果你不指定任何参数,Watchtower 会照常监视所有运行中的 Docker 容器。

    发送提示

    或许你想收到容器更新的通知。你可以通过电子邮件、Slack 、MSTeams 以及 Gotify 发送通知。

    下面这个例子展示了如何通过电子邮件发送通知。假设你已经设置了 SMTP 服务器。

    docker run -d \
      --name watchtower \
      -v /var/run/docker.sock:/var/run/docker.sock \
      -e WATCHTOWER_NOTIFICATIONS=email \
      -e WATCHTOWER_NOTIFICATION_EMAIL_FROM=fromaddress@gmail.com \
      -e WATCHTOWER_NOTIFICATION_EMAIL_TO=toaddress@gmail.com \
      -e WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.gmail.com \
      -e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587 \
      -e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=fromaddress@gmail.com \
      -e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=app_password \
      -e WATCHTOWER_NOTIFICATION_EMAIL_DELAY=2 \
      containrrr/watchtower

    参考下方 Watchtower Github 仓库和 Watchtower 官方主页获取更多信息:

  • ⽹⼼云容器版产品「容器魔⽅」介绍

    一、 什么是⽹⼼云容器版产品「容器魔⽅」?

    「容器魔方」由网心云推出的一款docker容器镜像软件,通过简单安装后即可快速加入网心云共享计算生态网络,为网心科技星域云贡献带宽和存储资源,用户根据每日的贡献量可获得相应的现金收益回报。网心科技星域云通过先进的边缘编排技术,将千家万户的节点连接成一张边缘云计算网络,为B端客户提供全球领先的、优质低成本的边缘计算服务。目前支持:koolshare、群晖、树莓派等支持docker的设备(arm32、aarch64、x86_64)。

    二、安装激活

    1.运行容器:

    docker run -d --name=wxedge --restart=always --privileged --net=host  --tmpfs /run --tmpfs /tmp -v /storage:/storage:rw  registry.hub.docker.com/onething1/wxedge

    必选参数说明:

    –privileged 必须打开(爱快docker不支持)。

    –net 目前只支持host(推荐)和macvlan两种网络模式(不熟悉docker和网络知识的用户不要尝试macvlan,非常复杂!)。

    “磁盘路径”是磁盘的目录,请根据自己实际磁盘目录更改,必须挂载到容器内的/storage目录,推荐磁盘是ext4文件系统,至少需要50G以上的空间,建议是固态硬盘。

    可选参数说明(建议新手都不要设置):

    -e NIC=eth0 有多网卡多线路时,可以使用该参数指定路由网卡,不配置会自动选默认路由网卡,如果是openwrt系统,可以使用-e NIC=br-lan,业务申请到和局域网同一个网段的IP。

    -e REC=false 第一次安装设置为false时,不会启动默认任务,默认为true,仅第一次安装有效。

    -e LISTEN_ADDR=”0.0.0.0:28888″ 支持设置绑定页面的监听地址和端口,监听全地址设置-e LISTEN_ADDR=”:28888″,默认监听全地址18888端口。多开容器也可以参考用该参数,比如容器A使用参数-e LISTEN_ADDR=”:18888″,容器B使用参数 -e LISTEN_ADDR=”:28888″(已经实现同一业务可多次添加,不建议多开容器)

    -v 磁盘路径:/var/lib/containerd 如果系统盘较小时,可以增加该参数修改安装路径,注意“磁盘路径”修改成自己的磁盘目录。

    2.升级容器:

    升级不需要删除原来的缓存,只升级镜像,原来的缓存是可以复用的,但注意挂载到容器中的路径必须是升级前的路径。如果发现生成新的SN,必定是挂载的路径错了。

    手动升级

    docker stop wxedge

    docker rm wxedge

    docker rmi registry.hub.docker.com/onething1/wxedge

    docker pull registry.hub.docker.com/onething1/wxedge

    docker run -d –name=wxedge –restart=always –privileged –net=host –tmpfs /run –tmpfs /tmp -v 磁盘路径:/storage:rw registry.hub.docker.com/onething1/wxedge

    “磁盘路径”要改成升级前的路径

    自动升级(containrrr/watchtower非网心云官方镜像,仅供参考,有问题请自行解决,强烈推荐)

    docker run -d –name watchtower –restart always -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower –cleanup wxedge

    3.存储迁移

    容器启动成功后,会在挂载目录生成一个wxnode的文件,该文件是设备的唯一标识与账号绑定,请务必做好备份,对于多次恶意删除wxnode的用户,将拒绝激活。换盘或者更换挂载目录时,要将wxnode迁移至新的挂载目录下,不需要app重新绑定。跨cpu架构的wxnode和缓存数据不能通用,如将x86的wxnode和缓存数据迁移到arm64的设备上是无法使用的。

    三、网心云容器魔方接口文档

    https://help.onethingcloud.com/7cb4/3ed5/1e3a

    四、设备绑定

    打开浏览器(推荐谷歌浏览器),输入http://ip:18888(ip替换成安装设备的ip),比如http://192.168.1.10:18888

    五、产品指南&教程

    「产品指南」:

    https://help.onethingcloud.com/caa9/a0fe/b6b3

    「群晖安装激活教程」:

    https://help.onethingcloud.com/7cb4/3ed5/9899

    「koolshare安装激活教程」:

    https://help.onethingcloud.com/7cb4/3ed5/a209

    「树莓派&命令行安装激活教程」:

    https://help.onethingcloud.com/7cb4/3ed5/8907

    六、技术和经验交流

    QQ群1(已满):947847221

    QQ群2:235763379

    加群备注:wxedge

    七、友情链接(非官方教程,可参考)

    1.视频安装教程 https://www.bilibili.com/video/BV1w341187MG?spm_id_from=333.999.0.0

    2.debian安装教程 https://zhuanlan.zhihu.com/p/380208961

    3.portainer面板安装教程 https://post.smzdm.com/p/ag45dprw/

    4.威联通安装教程 https://bbs.onethingcloud.com/forum.php?mod=viewthread&tid=800&highlight=%E5%A8%81%E8%81%94%E9%80%9A

    5.低版本群晖(5.2版本)安装教程 https://bbs.onethingcloud.com/forum.php?mod=viewthread&tid=1583&highlight=%E5%AE%B9%E5%99%A8

  • mkfs 格式化磁盘

    指令:mkfs

    使用权限 : 超级使用者
    使用方式 : mkfs [-V] [-t fstype] [fs-options] filesys [blocks] [-L Lable]
    说明 : 建立 linux 档案系统在特定的 partition 上

    参数 :

    device : 预备检查的硬盘 partition,例如:/dev/sda1

    -V : 详细显示模式
    -t : 给定档案系统的型式,Linux 的预设值为 ext2
    -c : 在制做档案系统前,检查该partition 是否有坏轨
    -l bad_blocks_file : 将有坏轨的block资料加到 bad_blocks_file 里面
    block : 给定 block 的大小
    -L:建立lable
     
    补充说明:
    mkfs本身并不执行建立文件系统的工作,而是去调用相关的程序来执行。例如,若在"-t" 参数中指定ext2,则
    mkfs会调用mke2fs来建立文件系统.使用时如省略指定【块数】参数,mkfs会自动设置    适当的块数.

    例1

    a,把该设备格式化成ext3文件系统 
    
     [root@linux ~]# mkfs -t ext3  /dev/sda6
    
    b,此命令在 /dev/hd3 设备上创建了一个空的文件系统,将卷序列号设为 vol001,文件系统名为 works。新的文件系统占用了整个设备。文件系统具有缺省分段大小(4096 字节)和缺省 nbpi 比率(4096)       
    [root@linux ~]# mkfs -lworks -vvol001 /dev/hd3
    
    c,在 /dev/lv01 设备上创建一个空的 4MB 的文件系统,其分段大小为 512 字节,且每 2048 个字节为一个 i-node[root@linux ~]# mkfs -s 4M -o nbpi=2048, frag=512 /dev/lv01    
    
    d,创建了一个启用磁盘大文件的 JFS 文件系统,并且分配组大小为 64 兆字节,磁盘的每 131072 字节为一个 inode。文件系统的大小将成为逻辑卷 lv01 的大小[root@linux ~]# mkfs -V jfs -o nbpi=131072,bf=true,ag=64 /dev/lv01   
    
  • fdisk 分区格式化

    disk

    相关命令:暂无相关命令

    fdisk磁盘分区命令-v
        打印 fdisk 的版本信息并退出.
    -l
        列出指定设备的分区表信息并退出。 如果没有给出设备,那么使用那些在 /proc/partitions (如果存在)提到的.
    -u
        以扇区数而不是以柱面数的形式显示分区表中各分区的信息. -s 分区 将分区的 大小 (单位为块)信息输出到标准输出
    [root@localhost ~]# fdisk -l      
    
    Disk /dev/sda: 500.1 GB, 500107862016 bytes
    255 heads, 63 sectors/track, 60801 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1   *           1          17      136552   83  Linux
    /dev/sda2              18         279     2104515   82  Linux swap / Solaris
    /dev/sda3             280       60801   486142965    5  Extended
    /dev/sda5             280       60801   486142964+  83  Linux
  • docker centos7 安装sshd

    1. 拉取镜像

    docker pull cenntos:7
    
    1. 运行容器并且附加端口映射

    docker run -itd -p 22:22 --name centos7 centos:7 
    

    3.进入到容器

    docker attach 容器Id
    

    4.安装系列工具

    yum -y update
    yum install passwd openssl openssh-server vim -y
    

    5.启动sshd服务

    /usr/sbin/sshd -D &
    

    6.报错如下

    Could not load host key: /etc/ssh/ssh_host_rsa_key
    Could not load host key: /etc/ssh/ssh_host_ecdsa_key
    Could not load host key: /etc/ssh/ssh_host_ed25519_key
    

    7.解决错误并且重新运行

    ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N '' 
    ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''
    ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N ''
    

    8.修改配置文件

    //UsePAM yes 改为 UsePAM no
    //UsePrivilegeSeparation sandbox 改为 UsePrivilegeSeparation no
    sed -i "s/#UsePrivilegeSeparation.*/UsePrivilegeSeparation no/g" /etc/ssh/sshd_config
    sed -i "s/UsePAM.*/UsePAM no/g" /etc/ssh/sshd_config
    
    1. 重新运行sshd服务

    /usr/sbin/sshd -D &

    10.修改密码

    passwd root

    11.使用putty或者xshell或者finalshell就可以连接登陆使用了。

    网络工具安装:

    yum search ifconfig

    通过yum search 这个命令我们发现ifconfig这个命令是在net-tools.x86_64这个包里,接下来我们安装这个包就行了

    运行 yum install net-tools   就OK 了

    yum install net-tools

    即可显示当前服务器上所有端口及进程服务,与grep结合可查看某个具体端口及服务情况··

    netstat -ntlp   //查看当前所有tcp端口·

    netstat -ntulp |grep 80   //查看所有80端口使用情况·

    netstat -an | grep 3306   //查看所有3306端口使用情况·

    ssh 命令不识别:

    yum -y install openssh-clients
  • docker 启动mq 服务

    mq:
            image: houlijiang/rabbitmq
            container_name: "mq"
            restart: always
            environment: 
                - TIME_ZONE=Asia/Shanghai #用户 
                - RABBITMQ_DEFAULT_USER=admin #密码 
                - RABBITMQ_DEFAULT_PASS=admin 
            volumes: 
                - /etc/localtime:/etc/localtime 
                - /etc/timezone:/etc/timezone 
                - /data/rabbitmq/db:/var/lib/rabbitmq/mnesia/rabbit@my-rabbit
            expose:
                - "15672"
                - "5672"
            ports:
                - "15672:15672"
                - "5672:5672"
            networks:
                - dev
  • docker 启动redis服务

    redis:
            image: redis:latest
            container_name: "redis"
            restart: always
            expose:
                - "6379"
            ports:
                - "6379:6379"
            networks:
                - dev
            command: --requirepass 123456
  • 延时队列服务启动docker

     rabbitmq:
        image: lianlianyi/rabbitmq:3.9.13-management-alpine-delayed
        ports:
          - 15672:15672
          - 5672:5672
        environment:
          - TIME_ZONE=Asia/Shanghai
          - RABBITMQ_DEFAULT_USER=admin
          - RABBITMQ_DEFAULT_PASS=admin
        volumes:
          - /etc/localtime:/etc/localtime
          - /etc/timezone:/etc/timezone
          - ./data/rabbitmq/db:/var/lib/rabbitmq/mnesia/rabbit@my-rabbit
  • redis 密码登录

    redis-cli

    auth (password)

  • Ubuntu笔记本合上盖子后无法远程重启的解决方法

    众所周知,Ubuntu系统笔记本可以通过远程控制重启系统,但是合上盖子后就无法实现这个功能了,这是怎么回事呢?碰到这个问题我们要如何解决呢?下面,小编就给大家介绍下Ubuntu笔记本合上盖子后无法远程重启的解决方法。


    Ubuntu系统

      方法步骤:

      1、首先检查电源选项,合上盖子选项设为“Do Nothing”。

      2、修改login manager 。

      打开/etc/systemd/logind.conf

      将:

      #HandleLidSwitch=suspend

      修改为:

      HandleLidSwitch=ignore

      重启system manager:

      systemctl restart systemd-logind