导火线
Docker的国内镜像被封禁,大概发生在2024年六月初,大概的现象就是,很多人租用了国内的云服务器,然后使用docker作为后端服务的载体进行服务外发。突然某一天,发现 自己的后端代码无法部署了,查了日志才发现,是docker的镜像无法拉取导致的,无论你是使用docker默认的国外的镜像源,还是国内的docker镜像源(清华,阿里....)都无法拉取。后端无法部署,这可是大事。直接可能导致项目延期上线。一时间网络上风声鹤唳,说今天禁用了docker,明天会不会把别的也给禁了,国内IT可能崩盘之类的···
docker是什么
Docker在软件开发中扮演关键角色。它通过容器化技术,将应用程序及其依赖打包成独立的可执行单元,实现跨平台、快速部署和可移植性。开发者可以在容器中隔离运行应用,避免环境差异性问题,提高开发和部署效率。Docker利用Linux内核的容器技术,如命名空间和控制组,实现资源隔离和安全性,使得应用之间相互独立运行。其镜像和容器的轻量级设计,使得开发者能够快速构建、测试和交付应用,极大地简化了开发流程和运维管理。
当谈论 Docker 时,有几个关键概念需要了解:
-
镜像(Image) :
Docker 镜像是一个只读的模板,包含了运行容器所需的所有信息,包括代码、运行时环境、系统工具和库等。镜像可以理解为应用程序的打包模板,通过它可以创建容器实例。 -
容器(Container) :
容器是从镜像创建的运行实例。它包含了应用程序及其所有依赖的运行时环境,如文件系统、系统工具、系统库等。容器利用 Docker 平台提供的隔离和安全机制,在主机操作系统上独立运行,可以轻松地启动、停止、删除和管理。 -
仓库(Repository) :
Docker 仓库用于存储 Docker 镜像,可以分为公共仓库(如 Docker Hub)和私有仓库。开发者可以从仓库拉取现有的镜像或将自己构建的镜像推送到仓库中共享。 -
Dockerfile:
Dockerfile 是一个文本文件,包含了一系列命令和指令,用于自动化地构建 Docker 镜像。通过 Dockerfile 可以指定基础镜像、安装依赖、运行命令等,最终生成一个新的镜像。 -
网络(Network) :
Docker 提供了多种网络模式,使得容器可以与主机或其他容器进行通信。默认情况下,每个容器都有自己的网络命名空间,可以通过端口映射或连接到自定义网络来实现通信。
举个例子:
我用dart语言开发了自己的 dartServer, 要部署到我租用的阿里云服务器,我除了把dartServer的build产物上传上去之外,还需要执行docker的镜像创建命令来创建我自己的 docker镜像,然后把镜像启动起来,形成一个服务容器, docker帮我把内网的端口转发到外网,让公网ip能够访问我的dartServer。
仓库一旦被封禁,那我就无法创建我的镜像,部署被阻塞。
如何解决
各位IT老油条应该都会魔法哈,这不赘述了。 其实只要会魔法的话,问题解决起来很简单。
由于我需要的是dart的3.2.3版本的镜像,以下就以它举例子。
步骤1:在有魔法的机器上下载docker基础镜像,并打包成tar。
比如,我在我的win上开了魔法,并且我安装了dockerDesktop,命令行中确保能够正常执行 docker --version
命令。
此时,我打开终端,执行 docker pull dart:3.2.3
,等待下载完成。
然后执行docker images
,确保我本地有了这个镜像。
然后,docker save -o dart_3.2.3.tar dart:3.2.3
这命令中:
-o dart_3.2.3.tar: 指定目标文件的全路径(如果按照上面的写法,这个tar文件就会生成在docker可执> 行文件的路径,最好是指定一个全路径,像是
D:/1/dart_3.2.3.tar
).dart:3.2.3 前面的dart是镜像名,后面的3.2.3是镜像的tag,用于区分不同的镜像版本。
这样我就得到了这么一个镜像的压缩文件:D:/1/dart_3.2.3.tar
,压缩之后大概是800多M
步骤2:将上一步中的tar上传到 服务器上的指定位置。
我使用的是xTerminal,比较友好的服务器SSH连接工具。直接拖进去就能上传了。
最好是创建这个tar文件的专属目录,比如在根目录下创建一个 dockerImageTar,然后直接把刚才的tar拖进去 ,等候片刻即可。
步骤3:SSH进入服务器终端,找到这文件,利用docker加载它
sh复制代码docker load -i /dockerImageTar/dart_3.2.3.tar
加载完成之后,应该会有这个打印 Loaded image: dart:3.2.3
步骤4:检查镜像是否加载完成
复制代码docker images
正常应该会有这种输出:
xml
复制代码
REPOSITORY TAG IMAGE ID CREATED SIZE
dart 3.2.3 <镜像 ID> mouments ago <大小>
OK,完成,到了这一步,你可以直接去进行项目部署了。docker下载镜像的原理也是优先使用本地已经有的镜像文件,本地没有的,再按照镜像源的配置去拉取,没配置镜像源的话就会从官方镜像源去下载。
祝各位好运!
如有侵权请联系站点删除!
技术合作服务热线,欢迎来电咨询!