# docker-registry

docker-registry类型的Secret主要用于存储从私有镜像库中下载容器镜像所需的相关信息，而不是为了向容器中传递数据的，其中主要包括：

1. 访问Docker私有镜像仓库所需的用户名；
2. 访问Docker私有镜像仓库所需的密码；
3. 访问Docker私有镜像仓库账户的Email；
4. Docker私有镜像仓库的地址（只有当不使用docker hub时，才需要指定，如使用阿里云的镜像仓库）；

这里将分作两部分讨论，第一部分是将所需信息传入docker-registry类型的Secret，即创建Secret，第二部分是Pod使用其中保存的信息从私有镜像仓库中下载容器所需镜像。

该类型的Secret的`secret.type=kubernetes.io/dockerconfigjson`。

## 配置传入Secret

数据传入Secret的过程，即**创建Secret**的过程，在创建时，可以将需要用来访问私有镜像仓库的信息以**键/值对**的形式写入Secret中。这里主要包括：访问私有镜像仓库所需的用户名、密码和Email。

创建Secret与ConfigMap同样有两种方式：

1. 使用指令创建（优选）；
2. 使用配置文件创建；

在这里我们仅展示使用第一种方式创建Secret的方式，即使用指令创建。下面展示一个创建该类型Secret的案例：

```bash
kubectl create secret docker-registry mydockerhubsecret --docker-username=myusername --docker-password=mypassword --docker-email=my.email@provider.com --docker-server=registry.cn-hangzhou.aliyuncs.com
```

{% hint style="info" %}
`--docker-username`：（必须）访问镜像仓库的用户名；

`--docker-password`：（必须）访问镜像仓库的密码；

`--docker-email`：（必须）访问镜像仓库的账户的Email；

`--docker-server`：镜像仓库不是Docker Hub时，需要另外指定，这里用的是阿里云的镜像仓库；
{% endhint %}

查看Secret中保存的数据，可以发现只有一个条&#x76EE;**.dockerconfigjson**，相当于用户主目录下的 .dockercfg 文件，该文件通常在运行`docker login`命令时由Docker自动创建。

## 使用Secret拉取镜像

Pod通过在`spec.imagePullSecrets`中的`name`指定包含了从私有镜像仓库中拉取镜像所需的信息的docker-registry类型的Secret名，进而利用该信息，从私有镜像仓库中下载容器镜像。

下面举一个例子，下载一个来自于私有镜像仓库的镜像`registry.cn-hangzhou.aliyuncs.com/yangsijie666/test:latest`生成容器：

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: private-pod
spec:
  imagePullSecrets:    # 从私有镜像仓库中拉取镜像所需的登录信息的docker-registry类型的Secret
  - name: mydockerhubsecret    # Secret名
  containers:
  - image: registry.cn-hangzhou.aliyuncs.com/yangsijie666/test:latest    # 来自于私有镜像仓库的镜像
    name: tcpdump
    command:
      - /bin/sh
```
