# Docker integration + Artifact Registry
> [name=陳信安]
> [time=TUE, OCT 12, 2020 16:36 PM]
---
# Agenda
* 何謂Docker
* 容器與虛擬主機差異
* Docker核心元素與常用指令
* Artifact Registry
* Docker-compose
* Docker-compose常用指令
---
## 何謂Docker
可以將應用程式虛擬化並運行在任何地方,讓我們可以不用花費太多時間在建置與安裝基礎設施上
---
## 容器與虛擬主機差異

---
## Docker核心元素與常用指令
Docker的啟動時間是秒級的,大量節省開發、測試、部署的時間。主要核心元素如下:
* 映像檔(Image):
映像檔可以用來建立Docker容器
* 容器(Container):
它可以被啟動、開始、停止、刪除,每個容器都是相互隔離、保證安全的
* 倉庫(Registry):
集中存放映像檔的倉庫
---
## Docker特性

---
### Docker 工作流程圖

---
### Docker 常用指令

---
### Demo-nginx範例
```=
docker run -d (--rm) --name nginx --restart=always -p 8080:80 nginx:1.19.3
```
###### 備註:tag禁止使用latest因為會快取
---
### 建立映像檔
Dockerfile是一個文字格式用來設定容器環境

---
### Dockerfile
```=
FROM nginx
COPY index.html /usr/share/nginx/html
```
### docker build
```=
docker build -t mynginx .
```
### docker run
```=
docker run -d --rm -p 8080:80 mynginx
```

---
### 容器內使用PING
首先先進入容器內後執行
```=
apt-get update
```
安裝ping工具
```=
apt-get install iputils-ping
```
---
先建立netwotk
```=
docker network create db-network
```
查看network
```=
docker network ls
```

---
建container
```=
docker run -d --name mysql --net db-network -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7.31
docker run -d --name myadminer --net db-network -p 8888:8080 adminer:4.7.7
```
---
查看container細項
```=
docker inspect containID
```

---
## 倉庫
Repository (倉庫) 是集中存放映像檔的地方
Registry (倉庫註冊伺服器) 是存放與管理多個倉庫
倉庫類型:公開(Public)、私有(Private)
* 公開倉庫: Docker Hub
* 私有倉庫: Gitlab、harbor
Google Container Registry (GCR)
Azure Container Registry (ACR)
Amazon Elastic Container Registry (ECR)
---
## Artifact Registry
Container Registry 的進化版,用來集中管理容器映像檔和語言套件 (例如 Maven 和 npm)

###### 安裝並初始化[Cloud SDK](https://cloud.google.com/sdk/docs/quickstart#windows)
---
### 定價
系統會收取儲存空間和網路輸出流量費用
* 儲存空間:

###### 備註:
單一地區和多地區存放區的價格均相同
GCR儲存空間$0.026美元(每GB)
---
* 網路輸出

---

---
完成建立

---
Artifact Registry驗證
```=
gcloud auth configure-docker asia-east1-docker.pkg.dev
```
###### 備註:需留意倉庫的建立區域(asia-east1)

---
推送映像檔至Artifact Registry repository
1. 將映像檔帶版號
```=
docker tag mynginx(自定義映像檔) asia-east1-docker.pkg.dev/PROJECTID/REPO-NAME/IMAGE-NAME:tag
```
2. Push
```=
docker push asia-east1-docker.pkg.dev/PROJECTID/REPO-NAME/IMAGE-NAME:tag
```
---


---
拉取映像檔至本機
```=
docker pull asia-east1-docker.pkg.dev/PROJECTID/REPO-NAME/IMAGE-NAME:tag
```

---
## docker-compose
docker-compose是一個工具,用來管理與執行多個容器。
---
docker-compose.yml用來定義容器參數,讓他們可以在獨立環境內一起執行
最後執行docker-compose up將會建立與執行你所定義的容器
---
docker-compose.yml 檔案看起來像這樣(adminer與mysql)
```=
version: "3"
services:
db:
container_name: "mysql"
image: "mysql:5.7.31"
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootpwd
MYSQL_USER: user
MYSQL_PASS: user
ports:
- 3306:3306
adminer:
container_name: "adminer"
image: "adminer:4.7.7"
restart: always
ports:
- 8888:8080
```
---
## docker-compose常用指令

---
## Reference
[Docker工作流程圖](https://kknews.cc/code/vak8np4.html)
[Artifact Registry](https://cloud.google.com/artifact-registry?hl=zh-tw)
## home work
* docker run -v -p
* docker logs -f --tail 10
* docker exec -it xxx bash
* 跨容器通訊(容器內的dns解析)
* dockerfile -> docker build -> docker push -> docker pull -> docker run
* docker-compose up
*
{"breaks":true,"metaMigratedAt":"2023-06-15T14:02:53.515Z","metaMigratedFrom":"YAML","title":"docker integration + Artifact Registry","contributors":"[{\"id\":\"eb2e54af-dbaa-403f-b0cd-84e7c5f68bf7\",\"add\":1,\"del\":1},{\"id\":\"83162077-2ad2-4507-aaf7-5b5de0cf9767\",\"add\":4877,\"del\":1052},{\"id\":\"9acc9603-61e8-40aa-b538-fdce22d06df3\",\"add\":307,\"del\":28}]"}