《OpenShift 4.x HOL教程汇总》

文章目录

  • OpenShift如何访问外部Registry的Image
    • 全局ImageStream
    • 本地ImageStream
  • 通过openshift项目中的全局ImageStream访问外部Image
    • 不同安装方式的差异
      • 在线安装环境
      • 离线安装环境
    • 为openshift项目的全局ImageStream配置访问红帽官方Registry的pull secret
      • 下载pull secret并生成新的pull secret
      • 将新的pull secret导入到OpenShift
      • 确认新的pull secret已经生效
  • 在一般项目中访问外部Registry的Image
    • 直接访问红帽官方registry.redhat.io的Image
      • 如果项目本地没有pull secret
      • 为一般项目配置访问红帽官方Registry的pull secret
    • 直接访问本地Docker Registry的Image
      • 如果没有配置访问本地Docker Registry的证书
      • 将访问本地Docker Registry的证书配置到OpenShift可信证书中
  • 参考

环境:

  1. OpenShift 4.5
  2. 在本地运行Docker Registry,访问证书位于“${REGISTRY_PATH}/certs/registry.crt”。也可使用《https://blog.csdn.net/weixin_43902588/article/details/109544040》获取本地Registry的访问证书。
  3. 从hub.docker.com导入busybox镜像,假设镜像访问地址为“registry.example.internal:5000/apps/busybox”。

OpenShift如何访问外部Registry的Image

无论是外部Registry还是内部Registry,OpenShift是通过ImageStream访问这些Registry上的Image的。无论是手动创建ImageStream对象还是在部署应用过程中通过Deployment自动创建ImageStream对象,OpenShift必须能通过ImageStream对象中的信息访问到对应实际的Image。

全局ImageStream

本地ImageStream

通过openshift项目中的全局ImageStream访问外部Image

通常我们在安装OpenShift的会选择一种安装方式:离线安装或在线安装。

  1. 在线安装:在安装环境可以访问到registry.redhat.io、quay.io等网站,并有账号从这些网站上按需下载Image。在线安装完后,我们可以通过openshift项目中的预配置的ImageStream自动访问registry.redhat.io、quay.io等红帽官方Image。
  2. 离线安装:在安装环境无法访问到registry.redhat.io,quay.io等网站,只能先将安装使用到的Image下载并导入本地的Image Registry环境中。在离线安装完后是无法通过openshift项目中的预配置的ImageStream自动访问registry.redhat.io、quay.io等红帽官方Image。如果OpenShift始终不能访问外网,那么解决方案是先将用到的外部Image手动下载,然后Import到本地Image Registry中,再修改openshift项目中的预配置的ImageStream对象,将其指向导入到本地Image Registry的Image。

不同安装方式的差异

在线安装环境

如果是在线安装的OpenShift,缺省pull-secret包含如下内容。通过该pull-secret,OpenShift就可以登录 “quay.io”、“cloud.openshift.com”、“registry.connect.redhat.com”、“registry.redhat.io”,并 pull 到 Image。通过base64 decode,可查看访问外部Registry的认证本体。

$ oc get secret/pull-secret -n openshift-config -o template='{{index .data ".dockerconfigjson"}}' | base64 -d | jq
{"auths": {"cloud.openshift.com": {"auth": "b3BlbnNoaWZ0LXJlbGVhc2UtZGV2K2Jlbm9jZWxvdHVwcm9hcmNvbTFyeXRwcjl2aW1seGp2bGRiN3dkbDRxY2picDpJM0xSQUE4U0hUSFQzUlhBVzNIVEhSQVFRR0E1Nk5FUVVOQVFHSDdIOVpBTk9PWTJKSlROTzNWQUhFR0dGNDdM","email": "ben@ocelotuproar.com"},"quay.io": {"auth": "b3BlbnNoaWZ0LXJlbGVhc2UtZGV2K2Jlbm9jZWxvdHVwcm9hcmNvbTFyeXRwcjl2aW1seGp2bGRiN3dkbDRxY2picDpJM0xSQUE4U0hUSFQzUlhBVzNIVEhSQVFRR0E1Nk5FUVVOQVFHSDdIOVpBTk9PWTJKSlROTzNWQUhFR0dGNDdM","email": "ben@ocelotuproar.com"},"registry.connect.redhat.com": {"auth": "NTI4OTQ0NzB8dWhjLTFSWVRQcjl2SU1MWEpWTERCN1dETDRxY2pCcDpleUpoYkdjaU9pSlNVelV4TWlKOS5leUp6ZFdJaU9pSmtPR0ZsTVRsalkySmtOVEEwTldNelltUTBabVprWlRKbVpEVTJOREl5TWlKOS5wYkN3WUphTVRfTWk4RW9sbTZ3MzE1WmgyUEZXdDA0b1YzbVdXQzJQTnhhVEVkUnZLNFhVWWQtSVhwV1VaT2N6R0Q5MlFBUU02a1AzazFieXRDejdEUUtQZmtMclFwelh6dDNkbzM1OE4zVkhoMmVVR1RwVG5XLVV3UW5mSjBFN3Etb3RNeTZBZFgxamRPRDVldnV3X2pCb3RnMllMUC1DN3RSZGtYdzFWR3NHM3dyN2I1V2loUDRydFVZR2hLT1l3UE1yWGtQaFRSZEstYUFxdmMzMkVkVVZUOG9GX1hKS1dVaXFuc1VKZ0pidERYVE52SWtNb1NhUTRrQm16UFRUMTJVcjVvNFFTVkVBSVNjczdDaUVTOWhQam5ycUJYUzJlZWFSQlVNZDZxS05ONGljZmhLTTlzVnJ4eXRFRXY0cm5SQmVkM1M0ZWlhVGNmX1pGSnV1eDk4RU1XcXVDQ3I4aG1fOEdmcFJQSW4yYVZvcl9ESkd2MlBYWi0tZHdVaTNncHc5QkRQQzhQQXVKZVE4WkRyZEo0WXVhMElKaGp6NGtMY3FpY3NUMHNmcU5Idl9qdzhCUmpad1YtN2FJd3A2TlgwUWJSaXRvYnNDcmhKX1VQUGxMVXN3NzJxU3B4UERTU25NRjluTHRROTA2RXBMamtFa05TNHIxRDd5UkdpTUsxa2I4WjRQdkNzZTVrZWxfdHNJcU10aDdHX1hOZ1RUeGxfeUFrYXVOM0pxMF9YYTA0VW1zeVphRUdURVpfV3hBLWtQZ01JWko4VHFHUENsOGIwLXBFVGJHdHItbVlDVHY1a0Z1Um1iQV9qZEk4YTN4UW1HUzBTVzhwLUZfUENHS2hvSXg2SmRmTTVsSmVZTmlxeHRrUWxWLXVzckxnVWNSdTZNX3JfR1gxVQ==","email": "ben@ocelotuproar.com"},"registry.redhat.io": {"auth": "NTI4OTQ0NzB8dWhjLTFSWVRQcjl2SU1MWEpWTERCN1dETDRxY2pCcDpleUpoYkdjaU9pSlNVelV4TWlKOS5leUp6ZFdJaU9pSmtPR0ZsTVRsalkySmtOVEEwTldNelltUTBabVprWlRKbVpEVTJOREl5TWlKOS5wYkN3WUphTVRfTWk4RW9sbTZ3MzE1WmgyUEZXdDA0b1YzbVdXQzJQTnhhVEVkUnZLNFhVWWQtSVhwV1VaT2N6R0Q5MlFBUU02a1AzazFieXRDejdEUUtQZmtMclFwelh6dDNkbzM1OE4zVkhoMmVVR1RwVG5XLVV3UW5mSjBFN3Etb3RNeTZBZFgxamRPRDVldnV3X2pCb3RnMllMUC1DN3RSZGtYdzFWR3NHM3dyN2I1V2loUDRydFVZR2hLT1l3UE1yWGtQaFRSZEstYUFxdmMzMkVkVVZUOG9GX1hKS1dVaXFuc1VKZ0pidERYVE52SWtNb1NhUTRrQm16UFRUMTJVcjVvNFFTVkVBSVNjczdDaUVTOWhQam5ycUJYUzJlZWFSQlVNZDZxS05ONGljZmhLTTlzVnJ4eXRFRXY0cm5SQmVkM1M0ZWlhVGNmX1pGSnV1eDk4RU1XcXVDQ3I4aG1fOEdmcFJQSW4yYVZvcl9ESkd2MlBYWi0tZHdVaTNncHc5QkRQQzhQQXVKZVE4WkRyZEo0WXVhMElKaGp6NGtMY3FpY3NUMHNmcU5Idl9qdzhCUmpad1YtN2FJd3A2TlgwUWJSaXRvYnNDcmhKX1VQUGxMVXN3NzJxU3B4UERTU25NRjluTHRROTA2RXBMamtFa05TNHIxRDd5UkdpTUsxa2I4WjRQdkNzZTVrZWxfdHNJcU10aDdHX1hOZ1RUeGxfeUFrYXVOM0pxMF9YYTA0VW1zeVphRUdURVpfV3hBLWtQZ01JWko4VHFHUENsOGIwLXBFVGJHdHItbVlDVHY1a0Z1Um1iQV9qZEk4YTN4UW1HUzBTVzhwLUZfUENHS2hvSXg2SmRmTTVsSmVZTmlxeHRrUWxWLXVzckxnVWNSdTZNX3JfR1gxVQ==","email": "ben@ocelotuproar.com"}}
}

离线安装环境

当时在安装OpenShift的时候使用的是离线安装方式,在离线安装OpenShift后,openshift-config项目中的pull-secret只包含了安装OpenShift过程中使用到的访问本地Image Registry的认证信息,如下面只有登录内部 Image Registry 的登录信息(“registry.example.internal:5000”域名访问地址可能会有差异)。

  1. 首先我们可以查看OpenShift用来从外部Registry拉Image的访问认证,该认证存放在名为pull-secret的secret中。
$ oc describe secret/pull-secret  -n openshift-config
Name:         pull-secret
Namespace:    openshift-config
Labels:       <none>
Annotations:  <none>Type:  kubernetes.io/dockerconfigjsonData
====
.dockerconfigjson:  2734 bytes
  1. 执行以下命令可查看pull-secret中的认证信息。
$ oc get secret/pull-secret -n openshift-config -o template='{{index .data ".dockerconfigjson"}}' | base64 -d | jq
{"auths": {"registry.example.internal:5000": {"auth":"b3BlbnNoaWZ0OnJlZGhhdA=="}}
}

如果在离线安装完成OpenShift后又可以访问外网了,此时当查看这些ImageStream的时候,会提示下图的错误。由于没有将访问registry.redhat.io、quay.io等网站的secret配置到OpenShift里,因此会提示没有访问这些网站上的Image的权限。

为openshift项目的全局ImageStream配置访问红帽官方Registry的pull secret

如果开始离线安装的OpenShift事后又可以访问外网了,我们可以通过以下方法将访问红帽registry.redhat.io、quay.io等网站的pull secret配置追加到OpenShift中,这样openshift项目中的全局ImageStream就能够从红帽官方pull到Image。需要注意的是,全局openshift项目是使用openshift-config项目中的名为pull-secret的Secret对象访问的红帽网站的Image的。

下载pull secret并生成新的pull secret

  1. 从https://cloud.redhat.com/openshift/install/pull-secret下载“pull secret”到本地的redhat-pull-secret.json文件。
  2. 将redhat-pull-secret.json中的数据和前面获得OpenShift已有的pull-secret中的数据(经过base64 decode后)合并为all-pull-secret.json文件。

将新的pull secret导入到OpenShift

  1. 执行以下命令,将新的all-pull-secret.json中的数据更新至OpenShift中的pull-secret对象。
$ oc set data secret/pull-secret -n openshift-config --from-file=.dockerconfigjson=<PATH>/all-pull-secret.json
  1. 查看更新后的pull-secret,确认有访问 “quay.io”、“cloud.openshift.com”、“registry.connect.redhat.com”、“registry.redhat.io”和内部Image registry的认证信息。
$ oc get secret/pull-secret -n openshift-config -o template='{{index .data ".dockerconfigjson"}}' | base64 -d | jq
  1. 另外还可进入到OpenShift集群节点,确认pull secret的配置已经写入每个节点的“/var/lib/kubelet/config.json”文件中。
$ oc deubg node/<NODE_NAME>
sh-4.4# chroot /host
sh-4.4# more /var/lib/kubelet/config.json | jq

确认新的pull secret已经生效

当新的pull secret生效后,OpenShift就可以访问到registry.redhat.io、quay.io等网站,并获取其红帽提供的官方镜像了。

  1. 在openshift项目中找到名为mysql的ImageStream,确认所有Tag指向的镜像都有有效的Identifier,并可以看到最近的更新时间。
  2. 在OpenShift控制台上进到Developer模式。点击+Add,然后在点击“Container Image”,此时会进入以下“Deploy Image”页面。确认可以从“Image stream tag from internal registry”选项下分别选中openshift项目,httpd的ImageStream和latest的Tag,最后点击Create按钮。
  3. 在Topology中查看部署情况,成功后如下图。可以通过Route下面的链接访问部署好的Apache HTTP页面。证明已经可以通过该pull secret从registry.redhat.io上pull到使用的Image了。

在一般项目中访问外部Registry的Image

直接访问红帽官方registry.redhat.io的Image

如果项目本地没有pull secret

如果我们在应用项目中直接访问红帽官方registry.redhat.io上的镜像(即不通过全局openshift项目里的已有ImageStream使用registry.redhat.io上的Image),看看会发生什么?

  1. 执行以下命令,确认会由于没有访问registry.redhat.io的认证授权导致import-image失败。
$ oc new project apache-http
$ oc import-image registry.redhat.io/rhscl/httpd-24-rhel7 -n apache-http --confirm
error: tag latest failed: Internal error occurred: registry.redhat.io/rhscl/httpd-24-rhel7:latest: Get https://registry.redhat.io/v2/rhscl/httpd-24-rhel7/manifests/latest: unauthorized: Please login to the Red Hat Registry using your Customer Portal credentials. Further instructions can be found here: https://access.redhat.com/RegistryAuthentication
imagestream.image.openshift.io/httpd-24-rhel7 imported with errorsName:                   httpd-24-rhel7
Namespace:              apache-http
Created:                Less than a second ago
Labels:                 <none>
Annotations:            openshift.io/image.dockerRepositoryCheck=2020-11-21T08:24:38Z
Image Repository:       image-registry.openshift-image-registry.svc:5000/apache-http/httpd-24-rhel7
Image Lookup:           local=false
Unique Images:          0
Tags:                   1latesttagged from registry.redhat.io/rhscl/httpd-24-rhel7! error: Import failed (InternalError): Internal error occurred: registry.redhat.io/rhscl/httpd-24-rhel7:latest: Get https://registry.redhat.io/v2/rhscl/httpd-24-rhel7/manifests/latest: unauthorized: Please login to the Red Hat Registry using your Customer Portal credentials. Further instructions can be found here: https://access.redhat.com/RegistryAuthenticationLess than a second ago
  1. 除了以上步骤可以验证外,还可以进入OpenShift控制台的Developer视图,通过依次点击“+Add”、“Container Image”,然后在下图的Deploy Image页面中直接部署外部容器镜像“registry.redhat.io/rhscl/httpd-24-rhel7”,页面也会提示访问权限失败的错误。

为一般项目配置访问红帽官方Registry的pull secret

  1. 用浏览器打开https://access.redhat.com/terms-based-registry,然后用redhat的订阅账号登录。
  2. 在以下“Registry Service Accounts”页面中点击“New Service Account”按钮。
  3. 在下图的“Create a New Registry Service Account”页面里提供Name即可,然后点击CREATE按钮。
  4. 在“Token Information”页面中切换到“OpenShift Secret”。然后根据提示,将secret内容复制到my-pull-security-secret.yml中,然后再执行以下命令,在你的项目中创建Secret对象。另外也可参照下图第3步,直接在pod的yaml配置中使用该Secret对象以获取红帽官方Registry的容器镜像。
$ oc create -f my-pull-security-secret.yml -n apache-http


5. 执行命令,查看创建的11485319-my-pull-security-pull-secret对象。

$ oc get secret -n apache-http
NAME                                    TYPE                                  DATA   AGE
11485319-my-pull-security-pull-secret   kubernetes.io/dockerconfigjson        1      2m31s
builder-dockercfg-w6d9d                 kubernetes.io/dockercfg               1      13m
builder-token-nz655                     kubernetes.io/service-account-token   4      13m
builder-token-z7kz9                     kubernetes.io/service-account-token   4      13m
default-dockercfg-szrdv                 kubernetes.io/dockercfg               1      13m
default-token-bkg44                     kubernetes.io/service-account-token   4      13m
default-token-dqr8t                     kubernetes.io/service-account-token   4      13m
deployer-dockercfg-vklnr                kubernetes.io/dockercfg               1      13m
deployer-token-p9srj                    kubernetes.io/service-account-token   4      13m
deployer-token-w6769                    kubernetes.io/service-account-token   4      13m
  1. 执行import-image命令,在当前项目直接从红帽官网registry.redhat.io/rhscl/httpd-24-rhel7镜像创建对应的ImageStream。
$ oc import-image registry.redhat.io/rhscl/httpd-24-rhel7 -n apache-http --confirm
imagestream.image.openshift.io/httpd-24-rhel7 importedName:                   httpd-24-rhel7
Namespace:              apache-http
Created:                Less than a second ago
Labels:                 <none>
Annotations:            openshift.io/image.dockerRepositoryCheck=2020-11-21T11:14:30Z
Image Repository:       image-registry.openshift-image-registry.svc:5000/apache-http/httpd-24-rhel7
Image Lookup:           local=false
Unique Images:          1
Tags:                   1latesttagged from registry.redhat.io/rhscl/httpd-24-rhel7* registry.redhat.io/rhscl/httpd-24-rhel7@sha256:6df4e25ab52799d356715b1a0eaacc5b2ba9d5ba653b7de21b4689e402940887Less than a second agoImage Name:     httpd-24-rhel7:latest
Docker Image:   registry.redhat.io/rhscl/httpd-24-rhel7@sha256:6df4e25ab52799d356715b1a0eaacc5b2ba9d5ba653b7de21b4689e402940887
Name:           sha256:6df4e25ab52799d356715b1a0eaacc5b2ba9d5ba653b7de21b4689e402940887
Created:        Less than a second ago
Annotations:    image.openshift.io/dockerLayersOrder=ascending
Image Size:     121.1MB in 4 layers
Layers:         76.41MB sha256:2b63304f1869b42027cc113af46692a963e05ef7867c88d36ef9c75ffc2fdfc71.807kB sha256:d518f7038c56d881774a7a29c5eb0c5dab9a9c5223a989b818ec4f2ca864867c7.231MB sha256:3811c17826fed41d93a6e6bcfb6a048828f5f72e3032bb61e8f7cd0785995bfc37.48MB sha256:c250bba8807e6ce11bed5c942e045aee7c5e5f1e1759b2b29243ae0781336b5a
。。。。。。
  1. 如果不是通过人工操作而是要在pod中能够pull到Image,那么需要将上面的Pull Secret添加到本项目的ServiceAccount中。
$ oc get sa -n apache-http
NAME       SECRETS   AGE
builder    2         38m
default    2         38m
deployer   2         38m$ oc describe sa default
Name:                default
Namespace:           apache-http
Labels:              <none>
Annotations:         <none>
Image pull secrets:  default-dockercfg-szrdv
Mountable secrets:   default-token-bkg44default-dockercfg-szrdv
Tokens:              default-token-bkg44default-token-dqr8t
Events:              <none># 将前面创建的11485319-my-pull-security-pull-secret加入到名为default的ServiceAccount中。
$ oc secrets link default 11485319-my-pull-security-pull-secret --for=pull
# 将前面创建的11485319-my-pull-security-pull-secret加入到名为build的ServiceAccount中,可执行S2I builds和oc new-build。
$ oc secrets link builder redhat-registry-secret

直接访问本地Docker Registry的Image

如果没有配置访问本地Docker Registry的证书

  1. 创建项目
$ oc new-project busybox
  1. 进入OpenShift控制台的Developer视图,通过依次点击“+Add”、“Container Image”,然后在下图的Deploy Image页面中直接部署外部容器镜像“registry.example.internal:5000/apps/busybox”,页面会提示访问权限失败的错误。

将访问本地Docker Registry的证书配置到OpenShift可信证书中

  1. 执行命令,将访问本地Docker Registry的证书配置到OpenShift可信证书中。注意其中“registry.${DOMAIN}…5000”是本地Registry的访问域名(注意将 “:” 改成 “…”)。
$ oc create configmap registry-crt -n openshift-config --from-file=registry.${DOMAIN}..5000=${REGISTRY_PATH}/certs/registry.crt
$ oc patch image.config.openshift.io/cluster --patch '{"spec":{"additionalTrustedCA":{"name":"registry-crt"}}}' --type=merge
  1. 最后再次在“Deploy Image”页面上部署“registry.example.internal:5000/apps/busybox”。确认已经可以访问本地Registry上的镜像了。

参考

https://medium.com/@salih.sipahi1/use-your-own-external-registry-with-openshift-container-platform-8bafff3f660
https://tomd.xyz/openshift-red-hat-registry/#enhancement
https://docs.openshift.com/container-platform/4.6/builds/setting-up-trusted-ca.html
https://dzone.com/articles/pulling-images-from-external-container-registry-to
https://cloudowski.com/articles/why-managing-container-images-on-openshift-is-better-than-on-kubernetes/
https://docs.openshift.com/container-platform/4.6/openshift_images/image-streams-manage.html#images-imagestream-import-images-private-registry_image-streams-managing
https://docs.openshift.com/container-platform/4.5/openshift_images/managing_images/using-image-pull-secrets.html
https://docs.openshift.com/container-platform/4.6/builds/setting-up-trusted-ca.html
https://docs.openshift.com/container-platform/4.6/registry/configuring-registry-operator.html
https://docs.openshift.com/container-platform/4.6/registry/configuring_registry_storage/configuring-registry-storage-baremetal.html#configuring-registry-storage-baremetal

OpenShift 4 - 用Pull Secret访问红帽官方或其他外部Registry的Image相关推荐

  1. OpenShift 4 - 配置本地Neuxs Registry并通过Pull Secret访问

    <OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.6环境中验证 文章目录 部署Neuxs Registry 更新OpenShift的Pull Secr ...

  2. OpenShift 4 概念 - OpenShift是如何通过ImageStream访问Image的

    <OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.6环境中验证 文章目录 ImageStream基本概念 Internal Image 和 Exter ...

  3. 如何从红帽官方网站下载镜像文件

    1.打开红帽官方网站: https://access.redhat.com 2.登陆已经注册的用户 3.选择产品&服务选项中的 基础设施及管理第一项 Red Hat Enterprise Li ...

  4. OpenShift 4 - 通过 secret 访问受保护的镜像

    <OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.8环境中验证 文章目录 @[TOC] 环境要求 向 quay.io 推送应用镜像 向 OpenShi ...

  5. OpenShift 4 之通过直接访问内部的 Image Registry 操作容器镜像

    <OpenShift 4.x HOL教程汇总> OpenShift 4 的运行环境开始使用CoreOS Linux作为支撑Container运行的操作系统.CoreOS Linux是一个非 ...

  6. OpenShift 4 之Istio-Tutorial (10) 访问白名单、黑名单

    <OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.6环境中验证 环境准备:我们在开始之前先确保环境和完成<OpenShift 4 之Istio- ...

  7. OpenShift 4 之Istio-Tutorial (9) 访问限流

    <OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.6环境中验证 Istio可以实现对服务访问的限流.通常限流可以保护被调用服务的可用性,以防止被调用服 ...

  8. 浏览器tab关闭事件_翻译|揭示现代浏览器原理(2):网页访问 — Chrome官方

    原文:Inside look at modern web browser (part 2) 网页访问过程中发生了什么 这是揭秘浏览器原理系列的第二篇,在上一篇,我们讲解了浏览器如何利用不同的进程和线程 ...

  9. 03-通过代理服务器访问myeclipse官方网站的方法

    第一步:打开网站:www.coobai.com这是一个代理服务器,可以访问一些国外的网站. 第二步:输入要访问的地址进行访问 第三步:效果展示

最新文章

  1. linux c获得时间和设置时间
  2. c语言strcat_s用于调用的参数太少_为什么系统调用会消耗较多资源呢
  3. 什么是服务器端口?服务器端口都有哪些?
  4. 腾讯再次开源三项技术,提升企业运维效率
  5. svn提交时自动设置 needs-lock
  6. 编码实战Web端联系人的增删改查
  7. Win7下WinDbg开启Local Kernel Debug调试
  8. CSDN-Markdown编辑器使用小技巧
  9. ios 获取html中的json数据,[IOS]UIWebView实现保存页面和读取服务器端json数据
  10. Good Numbers(HDU5447+唯一分解)
  11. (转)淘淘商城系列——使用JsonView来格式化json字符串
  12. Java基础学习总结(182)——Java 日志记录实践总结
  13. windows下的Redis安装:
  14. linux下回收站在哪个文件夹,linux回收站在哪里
  15. Android作业四
  16. Bus Hound使用心得#抓包工具#协议抓取
  17. 使用clusterProfiler进行KEGG富集分析
  18. 图书销售系统需求分析获取
  19. Cloudera-server迁移
  20. 老款Mac装win10黑屏或灰屏

热门文章

  1. java list 在头部添加6_【Java提高十六】集合List接口详解
  2. java模拟病人就诊过程_new 患者在医院看病过程:先排队等候 联合开发网 - pudn.com...
  3. python如何监听toast提示信息_python 怎样获取toast?
  4. 织梦服务器怎么修改,织梦dedecms更换服务器搬家教程
  5. python复利计算函数_PyThon编程入门:了解python format格式化函数的使用
  6. 基于php的外卖订餐系统开题报告_石化二小参加区2020省市级现代教育技术课题研究开题会议...
  7. 中科罗伯特机器人吧_延庆旧县南站附近继续教育
  8. 生肖牛年元素新年促销电商PSD分层页面模板|妥妥过年!
  9. linux高级的脚本,【2018.07.23学习笔记】【linux高级知识 Shell脚本编程练习】
  10. C++设置不定参数方法 简单示例