--- title: Container Registry (GCR) tags: GCP --- # <font color=#FF6600> Container Registry </font> --- ## 目錄 1. Docker 2. 倉庫 3. Google Container Registry 4. 實作 --- # <font color=#FF6600> 1. Docker </font> --- ### Docker Docker 容器的啟動時間是秒級的,大量節省開發、測試、部署的時間。 * 映像檔(Image): 映像檔可以用來建立 Docker 容器。 * 容器(Container): 它可以被啟動、開始、停止、刪除,每個容器都是相互隔離、保證安全的。 * 倉庫 (Registry): 是存放Docker Image的倉庫 --- ### Docker 工作流程圖 ![](https://i.imgur.com/VfKCmpI.png) --- ### Docker 常用指令 ![](https://i.imgur.com/qSdOGrF.png) --- # <font color=#FF6600> 2. 倉庫 </font> --- ### 倉庫 Repository (倉庫) 是集中存放映像檔的地方 Registry (倉庫註冊伺服器) 是存放與管理多個倉庫 倉庫類型:公開(Public)、私有(Private) * 公開倉庫: Docker Hub * 私有倉庫: Gitlab、harbor Google Container Registry (GCR) Azure Container Registry (ACR) Amazon Elastic Container Registry (ECR) --- # <font color=#FF6600> 3. Google Container Registry </font> --- ### GCR 功能與特色 1. 安全的私人 Docker Registry 2. 自動建立及部署映像檔 3. 深度安全漏洞掃描 4. 快速搜尋與容器標記 5. 快速的高可用性存取 --- ### GCR 名稱格式 * 以HOSTNAME和 projectID 命名 * 格式: <font size=5> HOSTNAME/PROJECT-ID/IMAGE:TAG </font> <font size=5> HOSTNAME/PROJECT-ID/IMAGE@IMAGE-DIGEST </font> <font size=5> ex:gcr.io/sc-lab-2/nginxhello2:1.1 </font> * HOSTNAME 儲存映像檔位置 <font size=5> gcr.io 目前在美國託管映像檔,但此託管位置未來可能會發生變化 <font size=5> us.gcr.io 在美國託管映像檔,與gcr.io使用的bucket不同 <font size=5> eu.gcr.io 在歐盟託管映像檔 <font size=5> asia.gcr.io 在亞洲託管映像檔 </font> --- ### 漏洞掃描(Vulnerability scanning) * <font size=6> Container Registry中透過Container Analysis進行映像檔執行漏洞掃描,並監控漏洞資訊以使其保持最新狀態。 </font> * <font size=6>兩個主要任務: 1.新增掃描:將映像檔上傳到Container Registry 2.持續分析:當Container Analysis從漏洞來源接收新的和更新的漏洞資訊時,它會重新分析容器</font> * <font size=6>支援作業系統 Alpine、CentOS、Debian、RedHat 和 Ubuntu 的各不同版本掃瞄。</font> --- ### 容器分析(Container Analysis) ![](https://i.imgur.com/a4mQbq3.png) --- ### 容器分析(Container Analysis) 時代演進 * 2017年11月22日 容器分析在Alpha中可用 * 2018年 9月 6日 容器分析提供Beta版 * 2019年 8月26日 容器分析API的V1版本現已全面上市 * 2019年 9月20日 容器分析現已全面推出 * 2020年 3月16日 Artifact Registry是Container Registry的演進版本,現已提供Beta版。 --- ### 漏洞的嚴重性級別 * Container Analysis 使用以下嚴重級別: Critical (嚴重) High (高) Medium (中) Low (低) Minimal (輕微) * 嚴重級別是反映漏洞被利用可能性、影響、範圍和成熟度等因素的等級 --- * 每種漏洞都有兩種關聯的嚴重程度指標: 1.有效嚴重程度 - 嚴重級別由Linux 發行版指定。 2.CVSS評分 - 通用漏洞評分系統來進行評分。 ![](https://i.imgur.com/kpuB8Ji.png) --- ### GCR 權限 * 啟用Container Registry 的漏洞掃描服務帳號會自動添加以三下種 <font size=5>[PROJECT-NUMBER]@containerregistry.iam.gserviceaccount.com </font> <font size=5> service-[PROJECT_NUMBER]@container-analysis.iam.gserviceaccount.com </font> <font size=5>service-[PROJECT_NUMBER]@gcp-sa-containerscanning.iam.gserviceaccount.com </font> ![](https://i.imgur.com/y9BfZFH.png) --- ### Cloud Storage角色和權限 * <font size=6> GCR使用Storage作為容器映像檔底層儲存空間 </font> * <font size=6> 默認服務帳戶的後綴為 </font> <font size=5> ```[PROJECT_NUMBER]-compute@developer.gserviceaccount.com```</font> ![](https://i.imgur.com/tshK8ep.png) --- ### GCR 費用 * Storage 存儲空間 * Docker 映像檔使用的輸出流量 * Docker 映像檔的漏洞掃描(選擇啟用此服務) --- ### 映像檔的漏洞掃描費用 * 每個掃描映像檔 $0.26 美元--2020/9/01起,完整計費 * 會自動掃描各個新推送的映像檔 * 如要掃描現有的映像檔,您必須重新推送 * 映像檔中新增、編輯標記均不會產生費用 --- ### 預估漏洞掃描费用 * 可使用Cloud Shell 開啟Open Editor新增 cost-estimation.sh文件,內容如下: ![](https://i.imgur.com/W3VdB62.png) --- 執行 bash cost-estimation.sh文件 ![](https://i.imgur.com/6m56lp9.png) --- ## <font color=#FF6600> 實作 </font> * 前置作業 * Docker run nginx * Docker build image * Docker push GCR * Deploy to GCE --- ### 實作 - 前置作業 1. GCP專案需挷定帳單 2. 開通storage 推送、拉取的權限 --- 3. GCR需進行身份驗證,gcloud作為Docker憑證,以便直接在gcloud 中配合Docker 使用 <font size=5> ``` gcloud auth login``` </font> ![](https://i.imgur.com/T4kZ12O.png) <font size=5> ``` gcloud auth configure-docker``` </font> ![](https://i.imgur.com/CsLyEb7.png) --- --- 4. 啟用 Container Registry API ![](https://i.imgur.com/b183RFk.png) --- 5. 啟用 漏洞掃描 ![啟用 漏洞掃描](https://i.imgur.com/1U79KOo.png) --- ### 實作1 - Docker run nginx <font size=5> ``` docker run -d --name nginx -p 80:80 nginx ```</font> <font size=5> ``` docker cp containerID:/usr/share/nginx/html/index.html .``` </font> --- ### 實作2 - Docker build image 1. 新增一個Dockerfile ![](https://i.imgur.com/qejDhi0.png) --- 2. 執行docker bulid 語法 <font size=5> ``` docker build -t nginxhello2 . ```</font> ![](https://i.imgur.com/3BsFRzs.png) --- ### 實作3:Docker push GCR 1. 標記本地映像: <font size=5> ``` docker tag [SOURCE_IMAGE] [HOSTNAME]/[PROJECT-ID]/[IMAGE]``` </font> <font size=5> docker tag nginxhello2 gcr.io/sc-lab-2/nginxhello2:1.1 </font> ![](https://i.imgur.com/tcDJD2a.png) --- 2. 推送到Container Registry: <font size=5> ```docker push [HOSTNAME]/[PROJECT-ID]/[IMAGE]``` </font> <font size=5> docker push gcr.io/sc-lab-2/nginxhello2:1.1 </font> ![](https://i.imgur.com/4bWF37x.png) 3. 確認有無推送成功 ![](https://i.imgur.com/2aeY31k.png) --- ### 實作4:Deploy to GCE 1. Deploy to GCE ![](https://i.imgur.com/cvUwfft.png) 2. 建立完成 ![](https://i.imgur.com/gSAhTAv.png) ![](https://i.imgur.com/AnFClXd.png) --- ### <font color=#FF6600> 參考來源: </font> # <font color=#FF6600> 官方文件 </font> https://cloud.google.com/container-registry/docs # <font color=#FF6600> Docker 工作流程圖 </font> https://kknews.cc/code/vak8np4.html