Dokcer 架构/安装/使用/相关资源
Docker 的基础,包含基本概念、基本安装、使用步骤和相关资源,内容主要以 CentOS/Ubuntu/Windows 10、11 为主。
Docker 架构
Docker 包括三个基本概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
相关的概念:
概念 | 说明 |
---|---|
Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。 |
Docker 容器(Container) | 容器是独立运行的一个或一组应用,是镜像运行时的实体。 |
Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。 |
Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
Docker Registry | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。 Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。 一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。 通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。 |
Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
Docker 安装
Docker for Windows
在 Windows 中安装,需要开启虚拟化(一般为默认开启)和 Hyper-V 功能。
![](myimages\Docker\Docker-开启 Hyper-V.png)
在 Docker 官网中下载安装包。下载地址:
如果出现了 WSL 2 的错误,参见:旧版 WSL 的手动安装步骤 | Microsoft Docs
Docker For CentOS
命令执行默认为 root,如果没有请切换或加 sudo
安装 Docker
查看 CentOS 内核 版本
1
uname -r
Linux 内核:官方建议 3.10 以上。
使用 root 权限更新 yum 包(生产环境中此步操作需慎重,看自己情况,学习的话随便搞)
1
yum -y update
这个命令不是必须执行的,看个人情况,后面出现不兼容的情况的话就必须update了
1
2
3注意
yum -y update:升级所有包同时也升级软件和系统内核;
yum -y upgrade:只升级所有包,不升级软件和系统内核卸载旧版本(如果之前安装过的话)
1
yum remove docker docker-common docker-selinux docker-engine
安装需要的软件包, yum-util 提供yum-config-manager功能,另两个是devicemapper驱动依赖
1
yum install -y yum-utils device-mapper-persistent-data lvm2
设置 yum 源(阿里仓库)
1
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装最新版本的 Docker Engine-Community 和 containerd,或者转到下一步安装特定版本:
1
yum install docker-ce docker-ce-cli containerd.io
查看可用版本有哪些
1
yum list docker-ce --showduplicates | sort -r
通过其完整的软件包名称安装特定版本,该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。例如:docker-ce-18.09.1。
1
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
例如:
1
yum install docker-ce-20.10.3 docker-ce-cli-20.10.3 containerd.io
启动 Docker 并设置开机自启
1
systemctl start docker
1
systemctl enable docker
通过运行 hello-world 映像来验证。
1
run hello-world
卸载 Docker
删除安装包:
1
yum remove docker-ce
删除镜像、容器、配置文件等内容:
1
rm -rf /var/lib/docker
参考:
- centos7安装Docker详细步骤(无坑版教程) - 云+社区 - 腾讯云 (tencent.com)
- CentOS Docker 安装 | 菜鸟教程 (runoob.com)
- Docker for CentOS 安装 - 蝴蝶教程 (jc2182.com)
Docker For Ubuntu
卸载旧版本
1
apt-get remove docker docker-engine docker.io containerd runc
使用 Docker 仓库进行安装,使用 Docker 仓库进行安装。
更新 apt 包索引。
1
apt-get update
安装 apt 依赖包,用于通过HTTPS来获取仓库:
1
apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
添加 Docker 的官方 GPG 密钥:
1
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 通过搜索指纹的后8个字符,验证您现在是否拥有带有指纹的密钥。
1
apt-key fingerprint 0EBFCD88
使用以下指令设置稳定版仓库
1
add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/ $(lsb_release -cs) stable"
安装 Docker Engine-Community
更新 apt 包索引。
1
apt-get update
安装最新版本的 Docker Engine-Community 和 containerd ,或者转到下一步安装特定版本:
1
apt-get install docker-ce docker-ce-cli containerd.io
要安装特定版本的 Docker Engine-Community,请在仓库中列出可用版本,然后选择一种安装。列出您的仓库中可用的版本:
1
apt-cache madison docker-ce
使用第二列中的版本字符串安装特定版本,例如 5:18.09.1
3-0ubuntu-xenial。1
apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io
测试 Docker 是否安装成功,输入以下指令,打印出以下信息则安装成功:
1
docker run hello-world
Docker For MacOS
emmmm…等我有💴了吧…
Docker 加速
原文见:Docker 镜像加速 | 菜鸟教程 (runoob.com)
Ubuntu/CentOS
1 | sudo mkdir -p /etc/docker |
Docker 使用
Docker 镜像
显示本地镜像
使用 docker images 来列出本地主机上的镜像。
1 | docker images |
输出中各个选项说明:
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
所以,我们如果要使用版本为 15.10 的ubuntu系统镜像来运行容器时,命令如下:
1 | docker run -t -i ubuntu:15.10 /bin/bash |
参数说明:
- -i: 交互式操作。
- -t: 终端。
显示镜像信息
返回镜像信息
1 | docker images -q |
- q - 它告诉docker命令仅返回镜像的ID。
输出将显示有关镜像的详细信息。
1 | docker inspect Repository |
- Repository - 这是镜像的名称。
下载镜像
使用 docker pull 命令来下载新的镜像。
1 | docker pull |
查找镜像
可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/
我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个 httpd 的镜像来作为我们的 web 服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。
1 | docker search httpd |
输出说明:
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
AUTOMATED: 自动构建。
删除镜像
删除使用 docker rmi 命令,比如我们删除 hello-world 镜像:
1 | $ docker rmi hello-world |
创建/更新镜像
当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
- 1、从已经创建的容器中更新镜像,并且提交这个镜像
- 2、使用 Dockerfile 指令来创建一个新的镜像
更新镜像
使用镜像来创建一个容器。
1 | docker run -t -i ubuntu:15.10 /bin/bash |
在运行的容器内使用 apt-get update
命令进行更新。
在完成操作之后,输入 exit
命令来退出这个容器。
此时 ID 为 e218edb10161 的容器,是按需求更改的容器。可以通过命令 docker commit
来提交容器副本。
1 | docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2 |
-m: 提交的描述信息
-a: 指定镜像作者
e218edb10161:容器 ID
runoob/ubuntu:v2: 指定要创建的目标镜像名
可以使用 docker images
命令来查看我们的新镜像 runoob/ubuntu:v2:
1 | docker images |
使用新镜像 runoob/ubuntu 来启动一个容器
1 | docker run -t -i runoob/ubuntu:v2 /bin/bash |
创建镜像
使用命令 docker build
, 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。
1 | runoob@runoob:~$ cat Dockerfile |
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源
RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。
然后,我们使用 Dockerfile 文件,通过 docker build
命令来构建一个镜像。
1 | runoob@runoob:~$ docker build -t runoob/centos:6.7 . |
参数说明:
- -t :指定要创建的目标镜像名
- . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
使用 docker images
查看创建的镜像已经在列表中存在,镜像ID为860c279d2fec
1 | runoob@runoob:~$ docker images |
我们可以使用新的镜像来创建容器
1 | runoob@runoob:~$ docker run -t -i runoob/centos:6.7 /bin/bash |
从上面看到新镜像已经包含创建的用户 runoob。
设置镜像标签
可以使用 docker tag
命令,为镜像添加一个新的标签(dev)。
1 | runoob@runoob:~$ docker tag 860c279d2fec runoob/centos:dev |
- 860c279d2fec 镜像ID
- runoob/centos:dev 用户名称/镜像源名(repository name):新的标签名(tag)。
使用 docker images 命令可以看到,ID为860c279d2fec的镜像多一个标签。
1 | runoob@runoob:~$ docker images |
Docker 容器
运行一个容器内的应用程序
例如 Hello World:
1 | docker run ubuntu:15.10 /bin/echo "Hello world" |
- ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
- /bin/echo “Hello world”: 在启动的容器里执行的命令。
Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo “Hello world”,然后输出结果。
通过 docker 的两个参数 -i -t,让 docker 运行的容器实现交互式的能力:
1 | docker run -i -t ubuntu /bin/bash |
- -t: 在新容器内指定一个伪终端或终端。
- -i: 允许你对容器内的标准输入 (STDIN) 进行交互。
可以通过运行 exit 命令或者使用 CTRL+D 来退出容器。
创建一个以进程方式运行的容器
1 | docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done" |
docker ps 来查看是否容器有在运行。
1 | docker ps |
docker ps
默认列出正在运行的容器,docker ps -a
会显示所有状态的容器。
输出详情介绍:
CONTAINER ID: 容器 ID。
IMAGE: 使用的镜像。
COMMAND: 启动容器时运行的命令。
CREATED: 容器的创建时间。
STATUS: 容器状态。
状态有7种:
- created(已创建)
- restarting(重启中)
- running 或 Up(运行中)
- removing(迁移中)
- paused(暂停)
- exited(停止)
- dead(死亡)
PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
NAMES: 自动分配的容器名称。
在宿主主机内使用 docker logs 命令,查看容器内的标准输出:
1 | docker logs 2b1b7a428627 |
使用 docker stop 命令来停止容器:
1 | docker stop 2b1b7a428627 |
docker history ImageID
使用此命令,您可以通过容器查看通过映像运行的所有命令。
1 | docker history ImageID |
输出的内容包含以下属性:
- IMAGE - 镜像
- CREATED - 构建的时间
- CREATED BY - 构建时候运行的命令
- SIZE - 大小
- COMMENT - 注释
Docker 使用容器
查看容器
查看所有的容器命令如下:
1 | docker ps -a |
使用 docker top
命令,您可以查看容器中的顶级进程。
1 | docker top ContainerID |
输出的内容包含以下属性:
- UID - 运行容器的用户
- PID - 进程id
- PPID - 父进程id
- C -
- STIME - 上次运行的时刻
- TTY - 运行的终端
- TIME -
- CMD - 运行的命令
命令 docker stats
用于提供正在运行的容器的统计信息。
1 | docker rm ContainerID |
成功运行输出:容器运行时候内存和 CPU 使用率等信息
- CONTAINER ID - 容器id
- NAME - 名称
- CPU % - CPU使用率
- MEM USAGE / LIMIT - 内存使用/内存限制
- MEM % - 内存使用率
- NET I/O - 网络IO情况
- BLOCK I/O - 硬盘IO情况
- PIDS - 进程id数
启动容器
以下命令使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器:
1 | docker run -it ubuntu /bin/bash |
- -i: 交互式操作。
- -t: 终端。
- ubuntu: ubuntu 镜像。
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
要退出终端,直接输入 exit:
1 | exit |
启动已经停止的容器
1 | docker start b750bbbcfd88 |
- b750bbbcfd88 是容器的 ID
后台运行容器
在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式。
1 | docker run -itd --name ubuntu-test ubuntu /bin/bash |
注:加了 -d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec
暂停容器
命令 docker pause
用于暂停正在运行的容器。
1 | docker pause ContainerID |
命令 docker unpause
用于取消暂停的容器。
1 | docker unpause ContainerID |
停止容器
停止容器的命令如下:
1 | docker stop <容器 ID> |
停止的容器可以通过 docker restart 重启:
1 | docker restart <容器 ID> |
进入容器
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
1 | docker attach |
1 | docker exec |
推荐使用 docker exec
命令,因为此命令会退出容器终端,但不会导致容器的停止。
导入/导出容器
导出
如果要导出本地某个容器,可以使用 docker export
命令。
1 | docker export 1e560fca3906 > ubuntu.tar |
导出容器 1e560fca3906 快照到本地文件 ubuntu.tar
导入
可以使用 docker import
从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1:
1 | cat docker/ubuntu.tar | docker import - test/ubuntu:v1 |
也可以通过指定 URL 或者某个目录来导入,例如:
1 | docker import http://example.com/exampleimage.tgz example/imagerepo |
删除容器
删除容器使用 docker rm 命令:
1 | docker rm -f 1e560fca3906 |
下面的命令可以清理掉所有处于终止状态的容器。
1 | docker container prune |
终止容器中的进程
1 | docker kill ContainerID |
容器生命周期
- 最初,Docker容器将处于创建状态。
- 然后,当使用
docker run
命令时,Docker容器进入运行状态。 docker kill
命令用于终止现有的Docker容器。docker pause
命令用于暂停现有的Docker容器。docker stop
命令用于暂停现有的Docker容器。docker run
命令用于将容器从停止状态恢复到运行状态。
Web 应用容器
创建 web 容器
在docker容器中运行一个 Python Flask 应用来运行一个 web 应用。
1 | docker pull training/webapp |
1 | docker run -d -P training/webapp python app.py |
- **-d:**让容器在后台运行。
- **-P:**将容器内部使用的网络端口随机映射到我们使用的主机上。
查看 web 容器
使用 docker ps
来查看我们正在运行的容器:
1 | runoob@runoob:~# docker ps |
这里多了端口信息。0.0.0.0:32769->5000/tcp
。可在浏览器中通过32769端口访问。
查询最后一次创建的容器:
1 | docker ps -l |
设置端口号
也可以通过 -p 参数来设置不一样的端口:
1 | docker run -d -p 5000:5000 training/webapp python app.py |
使用 docker port
可以查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号。
1 | docker port <容器ID/容器名字> |
查看日志
1 | docker logs <容器ID/容器名字> |
查看 web 应用中的进程
1 | docker top <容器ID/容器名字> |
检查 web 程序
使用 docker inspect
来查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
1 | docker inspect <容器ID/容器名字> |
停止 web 容器
1 | docker stop <容器ID/容器名字> |
重启 web 容器
已停止的容器
1 | docker start <容器ID/容器名字> |
正在运行的容器
1 | docker restart <容器ID/容器名字> |
删除 web 容器
1 | docker rm |
删除容器时,容器必须是停止状态,否则会报如下错误
1 Error response from daemon: You cannot remove a running container bf08b7f2cd897b5964943134aa6d373e355c286db9b9885b1f60b6e8f82b2b85. Stop the container before attempting removal or force remove
Docker 网络
列出所有Docker网络
1 | docker network ls |
检查 Docker网络
如果要查看与Docker关联的网络的更多详细信息,可以使用 docker network inspect
命令。
1 | docker network inspect networkname |
- networkname - 需要检查的网络的名称。
创建新网络
可以在启动容器之前在Docker中创建网络。这可以使用以下命令完成
1 | docker network create --driver drivername name |
- drivername - 这是用于网络驱动程序的名称。
- name - 这是给网络的名称。
返回值:该命令将输出新网络的长ID。
网络端口映射
使用 -P 绑定端口号,也可以使用 -p 标识来指定容器端口绑定到主机端口。
两种方式的区别是:
- -P :是容器内部端口随机映射到主机的端口。
- -p : 是容器内部端口绑定到指定的主机端口。
使用 docker ps
来查看我们正在运行的容器,即可检查。
另外,可以指定容器绑定的网络地址,比如绑定 127.0.0.1。
1 | docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py |
这样就可以通过访问 127.0.0.1:5001 来访问容器的 5000 端口。
上面的例子中,默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp。
1 | docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py |
Docker 容器连接
容器命名
当我们创建一个容器的时候,docker 会自动对它进行命名。另外,我们也可以使用 –name 标识来命名容器,例如:
1 | ocker run -d -P --name runoob training/webapp python app.py |
容器连接
【例 1】
创建 Docker 网络
1
docker network create -d bridge test-net
-d:参数指定 Docker 网络类型,有 bridge、overlay。
其中 overlay 网络类型用于 Swarm mode。
连接容器
运行一个容器并连接到新建的 test-net 网络:
1
docker run -itd --name test1 --network test-net ubuntu /bin/bash
打开新的终端,再运行一个容器并加入到 test-net 网络:
1
docker run -itd --name test2 --network test-net ubuntu /bin/bash
通过 ping 来证明 test1 容器和 test2 容器建立了互联关系。
如果 test1、test2 容器内中无 ping 命令,则在容器内执行以下命令安装 ping(即学即用:可以在一个容器里安装好,提交容器到镜像,在以新的镜像重新运行以上俩个容器)。
1
apt-get update
1
apt install iputils-ping
如果你有多个容器之间需要互相连接,推荐使用
Docker Compose
【例 2】
Container Linking允许多个容器相互链接。这是比暴露端口更好的选择。
使用
pull
命令下载 Jenkins 镜像。1
docker pull jenkins
运行容器
1
docker run --name=jenkinsa -d jenkins
启动目标容器
1
docker run --name=reca --link=jenkinsa:alias-src -it ubuntu:latest /bin/bash
Ctrl+P
然后Ctrl+Q
退出目标容器,然后sudo docker ps
可以看到有两个容器正在运行。连接到接收容器
1
docker attach reca
然后运行
env
命令。您会注意到与源容器链接的新变量(以ALIAS_SRC_为前缀的变量)。
Docker 仓库管理
公共仓库 Docker Hub
仓库(Repository)是集中存放镜像的地方。以下介绍一下 Docker Hub。大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。
登录/退出
登录
1 | docker login |
退出
1 | docker logout |
搜索镜像
1 | docker search <镜像名> |
拉取镜像
1 | docker pull <镜像名> |
推送镜像
1 | docker push Repositoryname |
镜像标记
1 | docker tag imageID Repositoryname |
私有仓库
您可能需要拥有自己的私有存储库。您可能不想在Docker Hub上托管存储库。为此,Docker中有一个存储库容器。让我们看看如何下载和使用容器进行注册。
使用
docker run
命令下载私有注册表。这可以使用以下命令完成。1
sudo docker run -d -p 5000:5000 --name registry registry:2
关于上述命令需要注意以下几点:
- registry 是Docker管理的容器,可用于托管私有存储库。
- 容器公开的端口号是5000.因此,使用-p命令,我们将相同的端口号映射到本地主机的5000端口号。
- 我们只是将registry容器标记为“2”,以便在Docker主机上区分它。
- -d 选项用于运行分离模式的容器。这样容器可以在后台运行
标记一个现有镜像,以便我们可以将它推送到我们的本地存储库。以 Ubuntu 为例。将其标记为私有存储库并添加标记名称ubantu。
1
sudo docker tag 3556258649b2 localhost:5000/ubuntu
关于上述命令需要注意以下几点
- 3556258649b2指的是centos图像的镜像ID 。
- localhost:5000是我们的私有存储库的位置。
- 我们在我们的私有存储库中将存储库名称标记为ubuntu。
用
docker push
命令将存储库推送到我们的私有存储库。1
sudo docker push localhost:5000/ubuntu
docker rmi
命令删除 Ubuntu 设置的本地镜像。1
sudo docker rmi ubuntu
1
sudo docker rmi 3556258649b2
现在我们的本地机器上没有任何 Ubuntu 镜像,现在我们可以使用以下
docker pull
命令从我们的私有存储库中提取 Ubuntu 镜像。1
sudo docker pull localhost:5000/ubuntu
Docker Dockerfile
Docker Compose
Docker Machine
Swarm 集群管理
相关资源
Docker 资源
- Docker 官方主页: https://www.docker.com
- Docker 官方博客: https://blog.docker.com/
- Docker 官方文档: https://docs.docker.com/
- Docker Store: https://store.docker.com
- Docker Cloud: https://cloud.docker.com
- Docker Hub: https://hub.docker.com
- Docker 的源代码仓库: https://github.com/moby/moby
- Docker 发布版本历史: https://docs.docker.com/release-notes/
- Docker 常见问题: https://docs.docker.com/engine/faq/
- Docker 远端应用 API: https://docs.docker.com/develop/sdk/
Docker 国内镜像
阿里云的加速器:https://help.aliyun.com/document_detail/60750.html
网易加速器:http://hub-mirror.c.163.com
官方中国加速器:https://registry.docker-cn.com
ustc 的镜像:https://docker.mirrors.ustc.edu.cn
daocloud:https://www.daocloud.io/mirror#accelerator-doc(注册后使用)