引言
Discourse一款功能强大、现代化的开源论坛软件。其现代化、简洁的界面设计等特点深受我的喜欢。如果你还没有部署安装,可以参考:在独立环境和Nginx的环境中部署搭建Discourse论坛 | BOBO Blog | 和nginx共存 (soulcloser.com) ,安装过程无法pull镜像:首次安装。
由于众所周知的原因,在使用Docker拉取新版本的镜像时,可能会遇到一些问题。即使更换国内源,也因为国内源没有及时更新,在更新最新版本时找不到镜像。本篇文章就列出以下几个解决方案,希望能对你的镜像拉取有帮助😉并分享使用docker push、pull镜像至阿里云免费仓库。
问题描述
使用./launcher rebuild app
更新discourse时卡在pull界面,多次重试无法下载镜像;
或使用命令拉取Discourse镜像时,提示:
Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
使用国内镜像源
使用阿里源专属加速地址
解决方法一,使用国内镜像源。由于网络限制,直接从Docker官方镜像库拉取镜像可能会遇到超时问题。可以通过添加国内镜像源来解决这个问题。首先是阿里云,需要登录后才能获取加速地址:
- 登录阿里云,右上方搜索栏处搜索“容器镜像服务“→”管理控制台“→”镜像工具“→”镜像加速器“,或者直接链接跳转到阿里云的容器镜像服务https://cr.console.aliyun.com ,得到专属的镜像加速地址,类似于
“https://********.mirror.aliyuncs.com”
- 打开或新建Docker的配置文件
vi /etc/docker/daemon.json
- 添加刚刚获取的专属镜像源加速地址,也可以直接在官网复制对应系统的命令添加
{
“registry-mirrors”: [“https://********.mirror.aliyuncs.com”]
}
还没完!请看下文⬇️
不需要登录账号(支持匿名pull)
Docker 官方和国内很多云服务商都提供了国内加速器服务。
- Docker官方提供的中国镜像库:https://registry.docker-cn.com
- 七牛云加速器:https://reg-mirror.qiniu.com
比如我想把这些都添加上,那么只需要在daemon.json文件中写入:⬇️
{ "registry-mirrors": [ "https://registry.docker-cn.com", "https://reg-mirror.qiniu.com", "https://docker.mirrors.ustc.edu.cn" ] }
重启Docker服务、验证配置
完事之后记得重启服务使生效,随便检查下配置是否生效,配置没问题的话可以在docker info中找到你配置的源地址。
sudo systemctl daemon-reload #重新加载systemd的配置文件 sudo systemctl restart docker #重启docker docker info #验证配置
配置Dockerd代理
如果配置国内镜像源无法解决问题,可以使用 HTTP/HTTPS 代理来加速镜像拉取、构建和使用,接下来介绍如何配置docker http代理(如果机器能走魔法就更好了)。
当你使用 docker pull
命令来拉取 Docker 镜像时,实际上是由 Docker 的守护进程 dockerd
来执行这个操作。而 dockerd
守护进程是由 systemd
管理的服务。因此如果你想在执行 docker pull
命令时使用 HTTP/HTTPS 代理,你需要通过 systemd
来配置这个代理,以便 dockerd
能够使用它。
- 创建或编辑 Docker 的 systemd 配置文件:通常,Docker 的 systemd 配置文件位于
/etc/systemd/system/docker.service.d
目录下。如果没有这个目录,可以创建它。
sudo mkdir -p /etc/systemd/system/docker.service.d
- 然后,在该目录下创建或编辑一个名为
http-proxy.conf
的文件:
sudo vi /etc/systemd/system/docker.service.d/http-proxy.conf
- 添加代理配置:添加代理配置:在
http-proxy.conf
文件中,添加以下内容来配置 HTTP 和 HTTPS 代理。💡 将proxy.example.com:8080
替换为你的代理服务器地址和端口。HTTP_PROXY
用于代理访问http
请求,HTTPS_PROXY
用于代理访问https
请求。如果你有不需要通过代理的地址,可以在NO_PROXY
变量中指定。
[Service] Environment="HTTP_PROXY=http://proxy.example.com:8080" Environment="HTTPS_PROXY=http://proxy.example.com:8080" Environment="NO_PROXY=localhost,127.0.0.1"
- 重新加载 systemd 配置并重启 Docker 服务
保存文件并退出编辑器,重新加载 systemd 配置并重启 Docker 服务。
sudo systemctl daemon-reload sudo systemctl restart docker
完事之后可以通过这条命令检查 Docker 服务的环境变量配置,没有问题的话当你再次pull镜像时则会通过你配置的代理拉取。
sudo systemctl show --property=Environment docker
手动下载镜像(Discourse镜像)
说了那么多,结果我的问题还是没有解决:作为网站的管理员,保持网站的更新,提升安全性、功能性等任务再日常不过了。但是在我更新Discourse论坛的时候,没有办法pull到latest版本镜像,导致网站down掉……你说使用国内源(更新不及时国内源找不到镜像),你说使用http代理(懂得懂得)。为了解决这个问题,我们可以手动下载镜像到本地,再更新或安装。具体实现的方式:
- 使用浏览器从可信的镜像源下载对应的镜像文件(通常为
.tar
格式)加载到本地Docker即可(不推荐)。 - 通过境外的服务器pull镜像到境外服务器本地,“导出”再”导入“镜像。命令格式为
docker save -o <保存路径/文件名.tar> <镜像名:标签> #导出镜像 docker load -i <路径/文件名.tar> #导入镜像
举个例子:假设你有一个名为 nginx
的镜像,先导出到/root文件夹下,把镜像下载到目标主机,再使用命令导入:
docker save -o /root/nginx.tar nginx:latest #导出镜像到/root/文件夹下 docker load -i /root/nginx.tar #使用命令导入
阿里云仓库Push、Pull镜像
读者一看,麻烦,镜像包根本不好找,说的也是。等等,说好的discourse镜像呢?⬇️
先说我实现的方法:💡首先通过境外的机器下载镜像到境外机器本地,然后在境外机器把镜像上传到阿里云的个人镜像仓库中,最后在境内的服务器上登录个人的镜像仓库,把镜像pull到本地就行了,解决网络问题,且使用仓库管理方便!多提一嘴,可以本地自建仓库自行维护镜像,不过需要仓库机器能”魔法“。
push到仓库的话,方便其他机器pull镜像,也不需要魔法,速度很快。这里推荐阿里云的仓库,个人免费支持3个命名空间和300个仓库。具体仓库使用方法和命令阿里云中写的很详细了,这里就不贴图片了。比如我现在想把最新的discourse镜像分享给你,我只需要把我的公共仓库pull地址给你就行了。那么我们现在来实现上面的操作,这里只是以discourse镜像为例,授人以鱼不如授人以渔你说是吧?
- 首先,在https://cr.console.aliyun.com/这里”创建个人示例“,跟着向导“设置密码”,”创建命名空间”,“创建镜像仓库”。忘记密码可以在“个人实例”→“访问凭证”中修改
- 登录到境外机器,使用命令查找你要pull的镜像,比如最新
discourse
版本是discourse/base:2.0.20240708-0023
。那么先pull到本地
docker pull discourse/base:2.0.20240708-0023
- 将镜像推送到Registry。登录导航到:阿里云容器镜像服务/实例列表/镜像仓库/基本信息,命令已经准备好了,只需修改部分值就行了。简而言之分为pull镜像、登录、修改tag、push 四步。像这样
完了后在阿里云对应的仓库应该能看见刚刚push的镜像了
- 本地pull镜像。回到国内的机器,我设置的为公开仓库,无需登录即可直接可以pull到本地。如果你设置的是私有仓库,那么需要使用docker login登录,和上方是一样的。我的是1G的下行,几分钟镜像就过来了,非常快啊。其他版本镜像照葫芦画瓢就行了!
docker pull registry.cn-chengdu.aliyuncs.com/soulcloser/boboblog:latest #discourse:2.0.20240708-0023
Discourse安装、更新
更新
接上文,现在你把discourse镜像pull到本地了,只需要在/var/discourse/
目录下执行想实现的命令就行了,你甚至都不需要把镜像tag修改为原来的tag。不信?我边写边执行命令实现呢,内容较简单就不贴图片了。
比如说你要更新论坛,思路就是先git pull新的仓库文件,使用命令重建时会显示更新论坛的镜像,把显示的镜像版本像上方一样下载到本地,最后rebuild,💡注意要下载新的镜像后再重构。像这样:
cd /var/discourse/ git pull ./launcher rebuild app #下载镜像后再重构
首次安装
那你是第一次安装呢?这里主要是解决无法第一次安装无法pull镜像的问题。先看看这篇文章:在独立环境和Nginx的环境中部署论坛使用第二种方法安装,毕竟你没有办法直接pull镜像嘛。在这篇文章说的第二种方法中,完成了编辑 app.yml 文件这一步后就不要继续了,按照上方的方法把镜像下载到本地,然后使用这条链接中的3.重构discourse,也就是下方的命令⬇️完了!不知道有没有表达清楚。
./launcher bootstrap app ./launcher start app
结语
文章就到这里了,每个步骤我都有操作实现过,原创不易。希望这篇文章对你在Docker国内无法Pull镜像、使用阿里云仓库、更新安装discourse有所帮助。对文章内容有疑问或建议欢迎来论坛多指教😉https://bbs.soulcloser.com。文章分享链接:https://www.soulcloser.com/4290
版权声明 © 2024 BOBO Blog :原创文章,本文不允许在未获取作者同意的情况下以任何形式复制其内容、摘编、转载。