Kubernetes從Private Registry中拉取容器映象的方法
原文:http://www.tui8.com/articles/news/41010.html
一、環境
由於 Kubernetes和Docker都在Active Develop的過程中,兩個專案的變動都很快,因此,特定的操作和說明在某些版本是好用的,但對另外一些版本卻是不靈光的。這裡先把環境確定清楚,避免誤導。
OS: Ubuntu 14.04.4 LTS Kernel:3.19.0-70-generic #78~14.04.1-Ubuntu SMP Fri Sep 23 17:39:18 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux Docker: # docker version Client: Version: 1.12.2 API version: 1.24 Go version: go1.6.3 Git commit: bb80604 Built: Tue Oct 11 17:00:50 2016 OS/Arch: linux/amd64 Server: Version: 1.12.2 API version: 1.24 Go version: go1.6.3 Git commit: bb80604 Built: Tue Oct 11 17:00:50 2016 OS/Arch: linux/amd64 Kubernetes叢集:1.3.7 私有映象倉庫:阿里雲映象倉庫 Docker映象:非公共映象,大家在測試中可以在自己的私有倉庫建立自己的測試映象 registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest
Kubernets在文件中描述了幾種訪問私有倉庫的方法,這裡挑選了那些可操作的,逐一測試一下。
二、方法1:利用Node上的配置訪問Private Registry
在玩Docker時,很多朋友都 搭建過自己的Private Registry。Docker訪問那些以basic auth方式進行鑑權的Private Registry,只需在本地執行docker login,輸入使用者名稱、密碼後,就可以自由向Registry Push映象或pull 映象到本地了:
# docker login registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api Username: {UserName} Password: Login Succeeded
在這一過程結束後,Docker實際上會在~/.docker目錄下建立一個config.json檔案,儲存後續與Registry互動過程中所要使用的鑑權串(這個鑑權串只是一個base64編碼結果,安全性欠佳^_^):
# cat ~/.docker/config.json { "auths": { "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api": { "auth": "xxxxyyyyzzzz" } } }
一但Node上有了這個配置,那麼K8s就可以通過docker直接訪問Private Registry了,這是
實際效果如何呢? 我們建立了一個Pod yaml,測試一下是否能run起來:
//rbd-rest-api-using-node-config.yaml apiVersion: v1 kind: Pod metadata: name: rbd-rest-api-using-node-config spec: containers: - name: rbd-rest-api-using-node-config image: registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest imagePullPolicy: Always
我們來建立一下這個Pod並檢視pod的建立狀態:
# kubectl create -f rbd-rest-api-using-node-config.yaml pod "rbd-rest-api-using-node-config" created # kubectl get pods NAME READY STATUS RESTARTS AGE rbd-rest-api-using-node-config 0/1 ErrImagePull 0 5s
通過describe檢視Pod失敗的詳細資訊:
# kubectl describe pod/rbd-rest-api-using-node-config ... ... Events: FirstSeen LastSeen Count From SubobjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 1m 1m 1 {default-scheduler } Normal Scheduled Successfully assigned rbd-rest-api-using-node-config to 10.66.181.146 1m 42s 3 {kubelet 10.66.181.146} spec.containers{rbd-rest-api-using-node-config} Normal Pulling pulling image "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest" 1m 42s 3 {kubelet 10.66.181.146} spec.containers{rbd-rest-api-using-node-config} Warning Failed Failed to pull image "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest": image pull failed for registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest, this may be because there are no credentials on this request. details: (Error: image xxxx/rbd-rest-api:latest not found) 1m 42s 3 {kubelet 10.66.181.146} Warning FailedSync Error syncing pod, skipping: failed to "StartContainer" for "rbd-rest-api-using-node-config" with ErrImagePull: "image pull failed for registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest, this may be because there are no credentials on this request. details: (Error: image xxxx/rbd-rest-api:latest not found)" ... ...
這個方法對我們的環境並不有效。並且經過多次測試,結果依舊,K8s無法從Private Registry獲取我們想要的映象檔案:(。
三、方法2:通過kubectl建立docker-registry的secret
K8s提供的第二種方法是通過kubectl建立一個 docker-registry的secret,並在Pod描述檔案中引用該secret以達到從Private Registry Pull Image的目的。
操作之前,我們先刪除掉各個Node上的~/.docker/config.json。
執行kubectl create secret docker-registry時需要提供private registry的訪問UserName和Password:
# kubectl create secret docker-registry registrykey-m2-1 --docker-server=registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api --docker-username={UserName} --docker-password={Password} [email protected] secret "registrykey-m2-1" created # kubectl get secret NAME TYPE DATA AGE registrykey-m2-1 kubernetes.io/dockercfg 1 29s
secret: registrykey-m2-1建立成功。我們來測試一下引用這個secret物件的Pod是否能Pull Image成功並Run起來。Pod yaml檔案如下:
//rbd-rest-api-registrykey-m2-1.yaml apiVersion: v1 kind: Pod metadata: name: rbd-rest-api-registrykey-m2-1 spec: containers: - name: rbd-rest-api-registrykey-m2-1 image: registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest imagePullPolicy: Always imagePullSecrets: - name: registrykey-m2-1
建立Pod,並觀察Pod狀態:
# kubectl create -f rbd-rest-api-registrykey-m2-1.yaml pod "rbd-rest-api-registrykey-m2-1" created # kubectl get pods NAME READY STATUS RESTARTS AGE rbd-rest-api-registrykey-m2-1 1/1 Running 0 7s rbd-rest-api-using-node-config 0/1 ImagePullBackOff 0 29m
通過describe pod,檢視建立的event序列:
Events: FirstSeen LastSeen Count From SubobjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 1m 1m 1 {default-scheduler } Normal Scheduled Successfully assigned rbd-rest-api-registrykey-m2-1 to 10.57.136.60 1m 1m 1 {kubelet 10.57.136.60} spec.containers{rbd-rest-api-registrykey-m2-1} Normal Pulling pulling image "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest" 1m 1m 1 {kubelet 10.57.136.60} spec.containers{rbd-rest-api-registrykey-m2-1} Normal Pulled Successfully pulled image "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest" 1m 1m 1 {kubelet 10.57.136.60} spec.containers{rbd-rest-api-registrykey-m2-1} Normal Created Created container with docker id d842565e762d 1m 1m 1 {kubelet 10.57.136.60} spec.containers{rbd-rest-api-registrykey-m2-1} Normal Started Started container with docker id d842565e762d
正如我們期望的那樣,引用了secret: registrykey-m2-1的Pod成功Run起來了。
如果一個pod中有來自不同私有倉庫的不同映象,我們需要怎麼做呢?通過kubectl create secret docker-registry我們一次只能建立一個registrykey,如果要訪問兩個映象倉庫,我們就需要分別為每個倉庫建立一個registrykey。我們再來建立一個registrykey,對應的倉庫為:registry.cn-hangzhou.aliyuncs.com/xxxx/test:
# kubectl create secret docker-registry registrykey-m2-2 --docker-server=registry.cn-hangzhou.aliyuncs.com/xxxx/test --docker-username={UserName} --docker-password={Password} [email protected] secret "registrykey-m2-2" created [email protected]:~/pullimagetest/test# kubectl get secret NAME TYPE DATA AGE registrykey-m2-1 kubernetes.io/dockercfg 1 1h registrykey-m2-2 kubernetes.io/dockercfg 1 6s
接下來,我們來建一個包含多個container的Pod:
//rbd-rest-api-multi-registrykeys-m2-2.yaml apiVersion: v1 kind: Pod metadata: name: rbd-rest-api-multi-registrykeys-m2-2 spec: containers: - name: rbd-rest-api-multi-registrykeys-m2-2 image: registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest imagePullPolicy: Always - name: test-multi-registrykeys-m2-2 image: registry.cn-hangzhou.aliyuncs.com/xxxx/test:latest imagePullPolicy: Always command: - "tail" - "-f" - "/var/log/bootstrap.log" imagePullSecrets: - name: registrykey-m2-1 - name: registrykey-m2-2
在secret引用中,我們將兩個key都引用了進來。
建立該Pod:
# kubectl create -f rbd-rest-api-multi-registrykeys-m2-2.yaml pod "rbd-rest-api-multi-registrykeys-m2-2" created # kubectl get pod NAME READY STATUS RESTARTS AGE rbd-rest-api-multi-registrykeys-m2-2 2/2 Running 0 5s
通過pod的event,我們看看啟動的操作順序:
Events: FirstSeen LastSeen Count From SubobjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 44s 44s 1 {default-scheduler } Normal Scheduled Successfully assigned rbd-rest-api-multi-registrykeys-m2-2 to 10.57.136.60 43s 43s 1 {kubelet 10.57.136.60} spec.containers{rbd-rest-api-multi-registrykeys-m2-2} Normal Pulling pulling image "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest" 43s 43s 1 {kubelet 10.57.136.60} spec.containers{rbd-rest-api-multi-registrykeys-m2-2} Normal Pulled Successfully pulled image "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest" 42s 42s 1 {kubelet 10.57.136.60} spec.containers{rbd-rest-api-multi-registrykeys-m2-2} Normal Created Created container with docker id 7c09048a41f6 42s 42s 1 {kubelet 10.57.136.60} spec.containers{rbd-rest-api-multi-registrykeys-m2-2} Normal Started Started container with docker id 7c09048a41f6 42s 42s 1 {kubelet 10.57.136.60} spec.containers{test-multi-registrykeys-m2-2} Normal Pulling pulling image "registry.cn-hangzhou.aliyuncs.com/xxxx/test:latest" 42s 42s 1 {kubelet 10.57.136.60} spec.containers{test-multi-registrykeys-m2-2} Normal Pulled Successfully pulled image "registry.cn-hangzhou.aliyuncs.com/xxxx/test:latest" 42s 42s 1 {kubelet 10.57.136.60} spec.containers{test-multi-registrykeys-m2-2} Normal Created Created container with docker id 9930834fe4a3 42s 42s 1 {kubelet 10.57.136.60} spec.containers{test-multi-registrykeys-m2-2} Normal Started Started container with docker id 9930834fe4a3
k8s分別從兩個映象倉庫嘗試pull image,並且最終都成功了!
四、方法3:通過secret yaml檔案建立pull image所用的secret
除了上面通過kubectl可以快捷的建立pull image所用的secret外,我們還可以使用常規的手段-yaml描述檔案來建立我們需要的secret資源。
//registrykey-m3-1.yaml apiVersion: v1 kind: Secret metadata: name: registrykey-m3-1 namespace: default data: .dockerconfigjson: {base64 -w 0 ~/.docker/config.json} type: kubernetes.io/dockerconfigjson
前面說過docker login會在~/.docker下面建立一個config.json檔案儲存鑑權串,這裡secret yaml的.dockerconfigjson後面的資料就是那個json檔案的base64編碼輸出(-w 0讓base64輸出在單行上,避免折行)。
建立registrykey-m3-1 secret:
# kubectl create -f registrykey-m3-1.yaml secret "registrykey-m3-1" created # kubectl get secret NAME TYPE DATA AGE myregistrykey3 kubernetes.io/dockerconfigjson 1 3h registrykey-m2-1 kubernetes.io/dockercfg 1 1h registrykey-m2-2 kubernetes.io/dockercfg 1 23m registrykey-m3-1 kubernetes.io/dockerconfigjson 1 29s
對比後,我們發現通過kubectl和yaml建立的兩個registrykey secret的型別略有不同,前者是kubernetes.io/dockercfg,後者是kubernetes.io/dockerconfigjson。
接下來,我們編寫一個引用了registrykey-m3-1的Pod:
//rbd-rest-api-registrykey-m3-1.yaml apiVersion: v1 kind: Pod metadata: name: rbd-rest-api-registrykey-m3-1 spec: containers: - name: rbd-rest-api-registrykey-m3-1 image: registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest imagePullPolicy: Always imagePullSecrets: - name: registrykey-m3-1
建立Pod:
# kubectl create -f rbd-rest-api-registrykey-m3-1.yaml pod "rbd-rest-api-registrykey-m3-1" created # kubectl get pods NAME READY STATUS RESTARTS AGE rbd-rest-api-registrykey-m3-1 1/1 Running 0 8s
建立成功。
那麼這種方法如何應對含有來自多個映象倉庫container的Pod的呢?這裡的思路與方法2略有不同。我們不需要建立並引用兩個或多個secret,而是建立一個可以訪問多個私有映象倉庫的secret,我們需要將多個映象倉庫的訪問鑑權串都放到~/.docker/config.json中:
按照方法1的介紹,我們先login registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api,得到config.json如下:
{ "auths": { "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api": { "auth": "....省略...." } } }
我們再login registry.cn-hangzhou.aliyuncs.com/xxxx/test,得到config.json如下:
{ "auths": { "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api": { "auth": "....省略...." }, "registry.cn-hangzhou.aliyuncs.com/xxxx/test": { "auth": "....省略...." } } }
我們看到Docker自動將新login的private registry的鑑權串merge到了同一個config.json中了。現在我們基於該包含了兩個庫鑑權串的config.json建立一個新secret:registrykey-m3-2:
//registrykey-m3-2.yaml apiVersion: v1 kind: Secret metadata: name: registrykey-m3-2 namespace: default data: .dockerconfigjson: {base64 -w 0 ~/.docker/config.json} type: kubernetes.io/dockerconfigjson
建立secret: registrykey-m3-2
# kubectl create -f registrykey-m3-2.yaml secret "registrykey-m3-2" created # kubectl get secrets NAME TYPE DATA AGE registrykey-m2-1 kubernetes.io/dockercfg 1 1h registrykey-m2-2 kubernetes.io/dockercfg 1 42m registrykey-m3-1 kubernetes.io/dockerconfigjson 1 19m registrykey-m3-2 kubernetes.io/dockerconfigjson 1 6s
我們編輯一個包含兩個容器,引用secret “registrykey-m3-2″ 的Pod yaml:
//rbd-rest-api-multi-registrykeys-m3-2.yaml apiVersion: v1 kind: Pod metadata: name: rbd-rest-api-multi-registrykeys-m3-2 spec: containers: - name: rbd-rest-api-multi-registrykeys-m3-2 image: registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest imagePullPolicy: Always - name: test-multi-registrykeys-m3-2 image: registry.cn-hangzhou.aliyuncs.com/xxxx/test:latest imagePullPolicy: Always command: - "tail" - "-f" - "/var/log/bootstrap.log" imagePullSecrets: - name: registrykey-m3-2
建立該Pod:
# kubectl create -f rbd-rest-api-multi-registrykeys-m3-2.yaml pod "rbd-rest-api-multi-registrykeys-m3-2" created # kubectl get pod NAME READY STATUS RESTARTS AGE rbd-rest-api-multi-registrykeys-m3-2 2/2 Running 0 4s
Pod建立成功!
五、呼叫API建立registrykey secret
對比了方法2和方法3,方法2更簡潔,方法3更強大。但在任何一個產品中,secret都不應該是手動建立的,在這種情況下, API建立 registrykey secret便是必經之路。一旦選擇通過API建立,我們顯然將依仗著方法2中的原理,將config.json中的內容通過API請求的Body Post給K8s api server。
如何在遠端構建出config.json的內容呢繼而構建出secret yaml中.dockerconfigjson的值資料呢?我們發現config.json套路中,唯一不確定的就是每個private repository下的auth串,那麼這個串是啥呢?你大可base64 -d一下:
# echo -n "VXNlck5hbWU6UGFzc3dvcmQ="|base64 -d UserName:Password
沒錯,實質上這個auth串就是UserName:Password的base64編碼值。因此,你首先要用某個倉庫的UserName和Password按照’UserName:Password’格式進行base64編碼,利用編碼的結果值構造json內容,比如:
{ "auths": { "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api": { "auth": "VXNlck5hbWU6UGFzc3dvcmQ=" } }
然後對這段json資料再做base64編碼,所得到的值就是secret yaml中的.dockerconfigjson的值資料。至此,我們來通過API建立一個secret:
$ curl -v -H "Content-type: application/json" -X POST -d ' { "apiVersion": "v1", "kind": "Secret", "metadata": { "name": "registrykey-m4-1", "namespace": "default" }, "data": { ".dockerconfigjson": "{cat ~/.docker/config.json |base64 -w 0}" }, "type": "kubernetes.io/dockerconfigjson" }' http://10.57.136.60:8080/api/v1/namespaces/default/secrets # kubectl get secret NAME TYPE DATA AGE registrykey-m2-1 kubernetes.io/dockercfg 1 2h registrykey-m2-2 kubernetes.io/dockercfg 1 1h registrykey-m3-1 kubernetes.io/dockerconfigjson 1 43m registrykey-m3-2 kubernetes.io/dockerconfigjson 1 24m registrykey-m4-1 kubernetes.io/dockerconfigjson 1 18s
基於registrykey-m4-1,我們啟動一個Pod:
//rbd-rest-api-registrykey-m4-1.yaml apiVersion: v1 kind: Pod metadata: name: rbd-rest-api-registrykey-m4-1 spec: containers: - name: rbd-rest-api-registrykey-m4-1 image: registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest imagePullPolicy: Always imagePullSecrets: - name: registrykey-m4-1 # kubectl create -f rbd-rest-api-registrykey-m4-1.yaml pod "rbd-rest-api-registrykey-m4-1" created # kubectl get pod NAME READY STATUS RESTARTS AGE rbd-rest-api-registrykey-m4-1 1/1 Running 0 5s
Pod建立成功!
相關推薦
Kubernetes從Private Registry中拉取容器映象的方法
原文:http://www.tui8.com/articles/news/41010.html 一、環境 由於 Kubernetes和Docker都在Active Develop的過程中,兩個專案的變動都很快,因此,特定的操作和說明在某些版本是好用的,但對另外一些版本
git從遠端倉庫中拉取指定分支
若本地分支不存在的情況: git checkout -b 本地分支名稱 origin/遠端分支名稱 使用該方式會在本地新建分x,並自動切換到該本地分支. git fetch origi
從es中拉取全部數據/大量數據 使用scroll+scan避免深分頁
數據量 技術 blog nbsp 怎麽辦 聚合 超過 不能 current es一次請求默認返回的數據條數是10條,可以通過設置size參數來控制返回數據的條數: 如果要返回很多數據,可以把size設置的很大,不過elastic search默認size最大不能超過1
Kubernetes之解決從k8s.gcr.io拉取映象失敗問題
前言 因谷歌網路限制問題,國內的K8ser大多數在學習Kubernetes過程中因為映象下載失敗問題間接地產生些許失落感,筆者也因此腦殼疼,故翻閱資料得到以下解決方式: 在應用yaml檔案建立資源時,將檔案中映象地址進行內容替換即可: 將k8s.gcr.io替換為 registry.c
Kubernetes:如何解決從k8s.gcr.io拉取映象失敗問題
簡介 新版本的Kubernetes在安裝部署中,需要從k8s.grc.io倉庫中拉取所需映象檔案,但由於國內網路防火牆問題導致無法正常拉取,本文將介紹如何繞過此問題,來完成業務的部署。 問題描述 使用Kubernetes V1.11.3版本部署叢集業務,在進行kubea
git 從新的git 庫中拉取---變換git地址用;
http light rem nbsp sharp amp example bsp div 2.先刪後加 git remote rm origin git remote add origin [url]----- example : git rem
批量更新程式碼整理(程式碼庫)從陣列中批量取資料的方法
查詢出所有的資料,分批插入。從原來的所有的list 資料裡面,每次拿出X 條資料,再批量更新 public void insertStudent() { List<Student> list = studentDao.listAllStudentForStat(); i
Maven踩坑(從程式碼庫中拉專案下來,別人家的沒問題,而你的有問題)
當你從程式碼庫中拉專案下來,別人家的沒問題,而你的有問題,jdk配置問題就不說了,自己弄好。 如果你出現ClassNotFind 或者NotFindMethod 之類的錯誤,那肯定是相應的jar沒有正確下載。 這個時候你先Maven--》UpdataProject ,多
另類爬蟲:從PDF檔案中爬取表格資料
簡介 本文將展示一個稍微不一樣點的爬蟲。 以往我們的爬蟲都是從網路上爬取資料,因為網頁一般用HTML,CSS,JavaScript程式碼寫成,因此,有大量成熟的技術來爬取網頁中的各種資料。這次,我們需要爬取的文件為PDF檔案。本文將展示如何利用Python的camelot模組
拉取國內映象搭建Kubernetes
安裝kubeadmin 所有節點執行 使用阿里雲映象源安裝kubelet kubeadm kubectl cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes base
第十一章 從網站圖片中抓取文字
#!/usr/bin/env python # _*_ coding:utf-8 _*_ #這一節是數144頁從網站圖片抓取文字的程式碼, #需要安裝tesseract,它是開源的可以通過訓練識別出字型
spring cloud 從註冊中心遠端拉取配置檔案錯誤幾種解決方法
1.檢查config server 是否能正常訪問2.檢查config client配置:1)必須是"bootstrap"命名的引導配置檔案2)spring: application: name: 這裡配置的名稱需要與遠端庫的配置檔名稱一致 或者使用spring.
docker國內映象拉取和映象加速registry-mirrors配置修改
由於國內訪問直接訪問docker hub網速比較慢,拉取映象的時間就會比較長。一般我們會使用映象加速或者直接從國內的一些平臺映象倉庫上拉取。 我比較常用的是網易的映象中心和daocloud映象市場。 網易映象中心:https://c.163.com/hub#
Sql Server儲存過程從一個表中抓取資料填充到另一張表中
set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go -- ============================================= -- Author: <alex,,Name> -- Create
輸入兩個整數n和m,從1-n中隨意取幾個數,使其和等於m
程式設計求解,輸入兩個整數n和m,從數列1,2,3,……n中隨意取幾個數,使其和等於m。要求將所有的可能組合列出來。 求解思路: 1.首先判斷,如果n>m,則n中大於m的數不可能參與組合,此時置n = m; 2.遞迴求解 #include<
Java實現輸入兩個整數n和m,從0-n中隨意取幾個數,使其和等於m
程式設計求解,輸入兩個整數n和m,從數列1,2,3,……n中隨意取幾個數,使其和等於m。要求將所有的可能組合列出來。 思路: 1.首先判斷,如果n>m,則n中大於m的數不可能參與組合,此時置n = m; 2.將最大數n加入且n == m,則滿足條件,
輸入兩個整數n和m,從0-n中隨意取幾個數,使其和等於m
程式設計求解,輸入兩個整數n和m,從數列1,2,3,……n中隨意取幾個數,使其和等於m。要求將所有的可能組合列出來。實際上就是一個揹包問題。 求解思路: 1.首先判斷,如果n>m,則n中大於m
(docker拉取的映象安裝啟動,用navicat連結不上,報1251)修改 Docker-MySQL 容器的 預設使用者加密規則
問題的原因:是從MySQL8.0 開始,預設的加密規則使用的是 caching_sha2_password。 我看了下我從官方拉下來的 docker 映象版本是8以上版本。 在啟動MySQL 容器的時候,可以修改一些設定的。主要有2種方式。1. 自定義配置檔案,並 moun
docker 從阿里雲映象倉庫拉取Ubuntu映象
開啟docker,開啟後會在工作列看到切換為開啟windows powershell用這條命令登陸阿里雲docker login [email protected] registry.cn-hangzhou.aliyuncs.com登入registry的使用
C語言取花生米(取棋子)系列問題。從一堆中輪流取的情況。
最簡單情況 描述 Tom和Jerry是鄰居,他們都喜歡吃花生米。Tom的信條是“規則永遠由強者制定,弱者只有遵守的權力”;Jerry則深信“頭腦比拳頭更有力量”。除此之外,他們都很聰明,恩,至少有211工程大學本科生水平。 五一長假第一天,Tom和Jer