1.【抄作业】如何优雅的源码更新 Docker 容器?使用Watchtower让Docker容器实现自动更新
2.Pytorch Docker镜像构建教程(不同系统、CUDA、源码Python版本)
3.一文带你学会Linux下安装Docker
4.二进制方式搭建极简kubernetes1.10环境@centos7.3
5.Docker manifest 详解
【抄作业】如何优雅的源码更新 Docker 容器?使用Watchtower让Docker容器实现自动更新
在折腾NAS上的Docker时,手动更新容器显得有些繁琐。源码本文将介绍如何使用Watchtower这款工具,源码实现Docker容器的源码qq运势小程序源码自动更新,让操作变得更加优雅。源码推荐将此技巧收藏以便未来使用。源码
本文以威联通TS-C为例,源码作为家用旗舰级4盘位NAS,源码它配置强大,源码包括Intel四核心处理器、源码支持Intel OpenVINO AI引擎、源码双2.5GbE口、源码NVMe双M.2插槽,源码以及USB3.2和HDMI2.0接口,非常适合Docker和虚拟机的使用。
Watchtower是视酷源码专卖一个开源应用,它作为一个Docker镜像运行,主要功能是监控容器在启动时的镜像是否需要更新。它的运作方式相对简单:监视运行中的容器及其相关镜像(可自定义),发现镜像变动并需要更新时,通过发送SIGTERM信号结束容器运行,然后根据设定的指令重新启动容器(包括Watchtower本身)。
Watchtower可以看作是应用市场,而Docker容器是APP,它通过更新命令实现容器的更新。
部署Watchtower仅需一条命令,通过调整命令参数可以满足不同的更新需求。例如,快速更新全部容器、指定更新特定容器、自动清除旧镜像、设置更新频率(时间间隔或定时检测)、使用前台模式实现手动更新等。大盘分析公式源码
具体部署命令如下:
- 快速更新全部容器(不推荐):`docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower`
- 指定更新容器:`docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower [容器名1] [容器名2]`
- 自动清除旧镜像:`docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --cleanup [容器名]`
- 指定更新频率:`docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --cleanup --interval [秒数] [容器名]` 或 `docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --cleanup --schedule "0 0 3 * * *" [容器名]`
- 前台模式(手动更新):`docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --cleanup --run-once [容器名]`
通过实际操作,以威联通的Container Station可以确认Watchtower的运行状态和更新效果。只需执行一次命令,即可实现容器的更新,操作简洁明了。
实操演示中,假设当前版本为4.5.1.的qbittorrentee镜像最新版本为4.5.2.。通过指定命令更新qbittorrentee容器,大约秒后,版本升级至4.5.2.,同时Watchtower退出运行。
查看日志命令:`docker logs -f watchtower`
本文为NAS上Docker操作的个人专栏第一篇,未来将分享更多实用技巧。感谢支持,期待与大家分享更多有趣的内容。
Pytorch Docker镜像构建教程(不同系统、CUDA、怎么定义php源码Python版本)
尽管 Pytorch官方和 Nvidia-NCG提供了很多版本的Pytorch镜像,但是我们平时的科研和工作中经常需要在特定系统版本、特定CUDA版本、特定Python版本下使用特定版本的Pytorch,官方的镜像很难满足自定义的需求,因此需要自己构建Pytorch镜像。下面我们来一步一步完成Pytorch镜像的构建。
完整的构建脚本、自动化构建流程见: cnstark/pytorch_docker: Pure Pytorch Docker Images. (github.com) 构建完成的镜像见: cnstark/pytorch (Docker Hub)
构建方法
默认读者对与Docker镜像的构建有大致的了解,我们从Dockerfile开始。
以Ubuntu.-Python3.9.-CUDA.3-Pytorch1..2为例,Dockerfile文件如下:
执行
以上就完成了Pytorch Docker镜像的构建。
自动生成构建脚本
我将以上构建流程整理成了 Github项目,可以自动生成构建脚本,完成构建。
2. 生成构建脚本
执行
生成如下文件
3. 执行构建
Github自动构建
借助Github的actions,可以在Github服务器上完成构建,登录界面动态源码并自动推送至 DockerHub,避免由于本地网络等原因造成的构建失败。
上述脚本会自动生成yml文件,提交至main分支后会自动触发构建。大家如果有需要的镜像版本,可以提交issue或者把上述文件提交pull request,我merge后就会触发构建。
一文带你学会Linux下安装Docker
Docker支持以下的CentOS版本:
目前,CentOS 仅发行版本中的内核支持 Docker。Docker 运行在 CentOS 7 上,要求系统为位、系统内核版本为 3. 以上。 Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为位、系统内核版本为 2.6.- 或者更高版本
方式一:使用 yum 安装 Docker(CentOS 7下)
Docker 要求 CentOS 系统的内核版本高于 3. ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。 通过
命令查看你当前的内核版本
安装 Docker
从 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Docker EE。Docker CE 即社区免费版,Docker EE 即企业版,强调安全,但需付费使用。 本文介绍 Docker CE 的安装使用。 移除旧的版本:
安装一些必要的系统工具:
添加软件源信息:
更新 yum 缓存:
安装 Docker-ce:
启动 Docker 后台服务
测试运行 hello-world
由于本地没有hello-world这个镜像,所以会下载一个hello-world的镜像,并在容器内运行。
方式二:使用脚本安装 Docker(1) 使用sudo 或 root 权限登录 Centos。(2) 确保 yum 包更新到最新。(3) 执行 Docker 安装脚本。 执行这个脚本会添加docker.repo源并安装 Docker。(4) 启动 Docker 进程。(5) 验证docker 是否安装成功并在容器中执行一个测试的镜像。 到此,Docker 在 CentOS 系统的安装完成。
镜像加速
鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,我使用的是网易的镜像地址:。
Aliyun容器镜像加速安装/升级Docker客户端 推荐安装1..0以上版本的Docker客户端,参考文档docker-ce 配置镜像加速器 针对Docker客户端版本大于 1..0 的用户 您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
请在该配置文件中加入(没有该文件的话,请先建一个): 新版的 Docker 使用 /etc/docker/daemon.json(Linux) 或者 %programdata%\docker\config\daemon.json(Windows) 来配置 Daemon。
执行以下命令来删除 Docker CE:
二进制方式搭建极简kubernetes1.环境@centos7.3
在CentOS 7.3(3..0-.el7.x_)环境中,构建一个极简的Kubernetes 1.集群,需在Master(...)和Node(.../)上进行以下步骤。
首先,安装Etcd,确保在3台主机上安装,并编辑install_etcd.sh脚本,用正确IP地址替换ifconfig命令。依次在每台主机上执行脚本,配置Etcd的集群连接信息,避免启动间隔过长导致集群失败。运行后,通过etcdctl检查集群成员状态。
接着,Flannel需要在所有主机上安装,编辑install_flannel.sh,设置正确的网络接口和etcd键值,然后分别执行安装命令。确认Flannel网络接口的配置。
Docker在所有主机上采用二进制方式进行安装,编辑install-docker.sh,添加Flannel参数,然后执行安装脚本。通过docker version检查安装是否成功。
Master节点部署Kubernetes,通过install_k8s_master.sh,配置Master与Etcd节点的连接。Minion节点通过install_k8s_node.sh,连接至Master。最后,确认集群状态,包括scheduler、etcd、controller-manager的健康,以及Node的状态。
为了运行Busybox容器,需要在本地导入镜像。编写busybox_rc.yaml配置文件,然后使用kubectl创建资源。验证容器运行正常。
部署kube-dns服务,确保集群内域名解析,修改kube-dns.yaml中的配置,通过kubectl create -f部署。同样,部署Dashboard服务,修改kubernetes-dashboard.yaml,使用Node IP访问。
部署完成后,检查kube-dns和Dashboard的Pod状态。安装介质和镜像可以从提供的链接下载。
Docker manifest 详解
å¨ . ( # )çæ¬ä¸æ·»å
åèé¾æ¥ï¼/engine/reference/commandline/manifest/#push-to-an-insecure-registry
/p/fad6b6fb
该docker manifestå½ä»¤æ¬èº«ä¸æ§è¡ä»»ä½æä½ã为äºå¯¹ manifest æ manifest list è¿è¡æä½ï¼å¿ é¡»æä¸ä¸ªåå½ä»¤ã
1. manifestæ¯ä¸ä¸ªæ件ï¼è¿ä¸ªæ件å å«äºæå ³äºéåä¿¡æ¯ï¼å¦å±ã大å°åæè¦ãdocker manifestå½ä»¤è¿åç¨æ·æä¾éå ä¿¡æ¯ï¼æ¯å¦æ建éåçæä½ç³»ç»åä½ç³»ç»æã
2. manifest list æ¯éè¿å¶å®ä¸ä¸ªæè å¤ä¸ªéåå称å建çéåå±å表ï¼å®å¯ä»¥è¢«å½ä½éåå称å¨docker pull ådocker run çå½ä»¤ä¸ä½¿ç¨
çæ³çæ åµä¸ï¼manifestæ¯æ ¹æ®ç¸ååè½ï¼ä¸åços/archç»åçéåæ建çï¼å æ¤ï¼manifest é常被称为âå¤æ¶æéåâã
ä½æ¯ï¼ç¨æ·å¯ä»¥å建ä¸ä¸ªæå两个éåçmanifestï¼ç¶å对ç¨æ·æä¾ä¸ä¸ªå¯ä¸çéåå称ãå¦ï¼ä¸ä¸ªç¨äºamdçWindowsä¸ï¼ä¸ä¸ªç¨äºamdä¸çdarwin
ä»Docker registry v2.3åDocker 1. å¼å§ï¼Docker hubå°±å¯ä»¥pull multi architecture Dockeréåäºã
manifest inspect --help
Usage: docker manifest inspect[OPTIONS][MANIFEST_LIST] MANIFEST
æ¾ç¤ºéåç manifest, or manifest list
Options:
--help ç¨æ³
--insecure å 许ä¸ä¸å®å ¨ç注å表éä¿¡
-v, --verbose è¾åºå ¶ä»ä¿¡æ¯å æ¬ layers å platform
Usage: docker manifest create MANIFEST_LIST MANIFEST[MANIFEST...]
Create a local manifest list for annotating and pushing to a registry
为annotating å建ä¸ä¸ªæ¬å°çmanifestï¼ pushå°éåä»åºä¸
Options:
-a,--amend ä¿®æ¹ç°æmanifest list
--insecure å 许ä¸ä¸å®å ¨ç注å表è¿è¡éä¿¡
--help ç¨æ³
Usage: docker manifest annotate [OPTIONS] MANIFEST_LIST MANIFEST
æ·»å å ¶ä»ä¿¡æ¯å°æ¬å°éåçmanifest
Options:
--arch string 设置ä½ç³»ç»æ
--help ç¨æ³
--os string 设置æä½ç³»ç»
--os-version string 设置æä½ç³»ç»çæ¬
--os-features stringSlice 设置æä½ç³»ç»åè½
--variant string 设置ä½ç³»ç»æåä½
Usage: docker manifest push [OPTIONS] MANIFEST_LIST
å° manifest list æ¨å° repository
Options:
--help ç¨æ³
--insecure å 许æ¨éå°ä¸å®å ¨çä»åºä¸
-p, --purge æ¨éåå é¤æ¬å°æ¸ åå表
manifestå½ä»¤ä» ä¸Docker ä»åºäº¤äºãå æ¤ï¼å®æ æ³æ¥è¯¢å¼æ以è·åå 许çä¸å®å ¨ä»åºå表ã为äºå 许CLIä¸ä¸å®å ¨çä»åºè¿è¡äº¤äºï¼æäºdocker manifest å½ä»¤å¸¦æä¸ä¸ª--insecureæ å¿ã对äºæ¯ä¸ªcreateæ¥è¯¢æ³¨å表çäºå¡ï¼ä¾å¦ï¼ï¼--insecureå¿ é¡»æå®æ å¿ãæ¤æ å¿åè¯CLIï¼æ¤æ³¨å表è°ç¨å¯è½ä¼å¿½ç¥å®å ¨æ§é®é¢ï¼ä¾å¦ä¸¢å¤±æèªç¾åè¯ä¹¦ãåæ ·ï¼å¨manifest æ¨å°ä¸å®å ¨çä»åºä¸çæ¶åï¼--insecureå¿ é¡»æå®è¯¥æ å¿ãå¦ææªä¸ä¸å®å ¨çä»åºä¸èµ·ä½¿ç¨ï¼æ¸ åå½ä»¤å°æ¾ä¸å°ç¬¦åé»è®¤è¦æ±çä»åºã
1. æ£æ¥éåçmanifest对象
``
$ docker manifest inspect hello-world
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config": {
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": ,
"digest": "sha:ccbfdafdafbf2eddbabfc"
},
"layers": [
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": ,
"digest": "sha:bfbadbeedca5a8cdbef5fcf4bc"
}
]
}
``
2. æ£æ¥éåçmanifest并è·åos/archä¿¡æ¯
该docker manifest inspectå½ä»¤å¸¦æä¸ä¸ªå¯é--verboseæ å¿ï¼å¯ä»¥æä¾imageçå称ï¼Refï¼ï¼ä½ç³»ç»æåosï¼å¹³å°ï¼ãå°±åå ¶ä»ä½¿ç¨æ åå称çdockerå½ä»¤ä¸æ ·ï¼å¯ä»¥å¼ç¨å¸¦ææä¸å¸¦ææ ç¾çæ åï¼ä¹å¯ä»¥å¼ç¨æè¦ï¼ä¾å¦hello-world@sha:f3b3babbce9e6d6ffcdb0dfffï¼ã
è¿æ¯ä¸ä¸ªä½¿ç¨--verboseæ å¿æ£æ¥éåçmanifestç示ä¾ï¼
$ docker manifest inspect --verbose hello-world
{
"Ref": "docker.io/library/hello-world:latest",
"Digest": "sha:f3b3babbce9e6d6ffcdb0dfff",
"SchemaV2Manifest": {
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config": {
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": ,
"digest": "sha:ccbfdafdafbf2eddbabfc"
},
"layers": [
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": ,
"digest": "sha:bfbadbeedca5a8cdbef5fcf4bc"
}
]
},
"Platform": {
"architecture": "amd",
"os": "linux"
}
}
3. å建并æ¨ä¸ä¸ªmanifest list
è¦å建manifest listï¼é¦å è¦å¨æ¬å° create manifest listï¼æ¹æ³æ¯æå®è¦å å«å¨manifest listä¸çç»æéåã 请记ä½ï¼è¿å·²æ¨éå°éåä»ï¼å æ¤ï¼å¦æè¦æ¨éå°dockeréåä»ä»¥å¤çå ¶ä»ä»åºï¼åéè¦ä½¿ç¨ä»åºå称æIPå端å£å建manifest listã è¿ç±»ä¼¼äºæ è®°éå并å°å ¶æ¨éå°å¤é¨éåä»åºã
å建manifest listçæ¬å°å¯æ¬åï¼å¯ä»¥éæ©å¯¹å ¶è¿è¡æ³¨éã å 许ç注éå æ¬ä½ç³»ç»æåæä½ç³»ç»ï¼è¦çéåçå½åå¼ï¼ï¼æä½ç³»ç»åè½ä»¥åä½ç³»ç»æåä½ã
æåï¼éè¦å°æ¸ åå表æ¨éå°æéçéåä»ã ä¸é¢æ¯å¯¹è¿ä¸ä¸ªå½ä»¤çæè¿°ï¼ä»¥åå°å®ä»¬å ¨é¨ç»åå¨ä¸èµ·ç示ä¾ã
$ docker manifest create ...:/coolapp:v1 \
...:/coolapp-ppcle-linux:v1 \
...:/coolapp-arm-linux:v1 \
...:/coolapp-amd-linux:v1 \
...:/coolapp-amd-windows:v1
Created manifest list ...:/coolapp:v1
$ docker manifest annotate ...:/coolapp:v1 ...:/coolapp-arm-linux--archarm
$ docker manifest push ...:/coolapp:v1
Pushed manifest ...:/coolapp@sha:edcaedd6cadb8c2cf4eccdf1ecabfb with digest: sha:fdcc5fcffabfe0ee5dae9bd8caf8efa6cf7f2adcb
Pushed manifest ...:/coolapp@sha:f3b3babbce9e6d6ffcdb0dfff with digest: sha:bca0bafcbfabe6bbef3a
Pushed manifest ...:/coolapp@sha:dcccffafaaacbfbfc9 with digest: sha:dfaffbadba0d3bbcfba5ea8bbb8e9ee4e8
Pushed manifest ...:/coolapp@sha:fbcd4acbae9eacbb3f1e3a4cd3eaf with digest: sha:5bb8eaa2eddbdf3ddfefbffabcf1cfc0e5e
sha:bddbafcdcbecaf4a7cfacaba
æ£æ¥ manifest list
$ docker manifest inspect coolapp:v1
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"manifests": [
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": ,
"digest": "sha:fdcc5fcffabfe0ee5dae9bd8caf8efa6cf7f2adcb",
"platform": {
"architecture": "arm",
"os": "linux"
}
},
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": ,
"digest": "sha:bca0bafcbfabe6bbef3a",
"platform": {
"architecture": "amd",
"os": "linux"
}
},
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": ,
"digest": "sha:dfaffbadba0d3bbcfba5ea8bbb8e9ee4e8",
"platform": {
"architecture": "ppcle",
"os": "linux"
}
},
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": ,
"digest": "sha:5bb8eaa2eddbdf3ddfefbffabcf1cfc0e5e",
"platform": {
"architecture": "sx",
"os": "linux"
}
}
]
}
æ¨éå°ä¸å®å ¨çéåä»åº
$ docker manifest create --insecure myprivateregistry.mycompany.com/repo/image:1.0 \
myprivateregistry.mycompany.com/repo/image-linux-ppcle:1.0 \
myprivateregistry.mycompany.com/repo/image-linux-sx:1.0 \
myprivateregistry.mycompany.com/repo/image-linux-arm:1.0 \
myprivateregistry.mycompany.com/repo/image-linux-armhf:1.0 \
myprivateregistry.mycompany.com/repo/image-windows-amd:1.0 \
myprivateregistry.mycompany.com/repo/image-linux-amd:1.0
$ docker manifest push --insecure myprivateregistry.mycompany.com/repo/image:tag