# Docker
### 主講人:黃夙賢
---
## 虛擬化技術
- 虛擬化(Virtualization),將將硬體軟體化,可直覺的分配運算資源 (例:CPU、Memory)
- Virutalbox、Vmware

---
## 為什麼雲端運算的龍頭老大Google不用虛擬機器(VM)
- 硬體獨立了,作業系統卻還是要重複安裝
- 動輒數GB的虛擬化映像檔,讓應用程式的安裝與復原費時費力
- 設定複雜
- 虛擬機器安裝動輒數分鐘到數小時
- 容器化(Container)技術的誕生
---
## 容器化技術
- 利用作業系統(Linux)的隔離技術,達成作業系統(OS)以上的虛擬化
- 常用在idc機房,多為Linux核心

---
## 伺服器 vs. VM vs. Container

---
## Container 相對於 VM
- Container不是用來取代VM,是相輔相成
- Container讓程式部屬自動化
- 可以自動化部屬,就有辦法達成自動備援、系統容錯
---
## Docker容器技術
- 2013年由Docker Inc公司基於GO語言開發,2019年被Mirantis公司收購
- 最多個人使用的容器化技術,也最簡單
- https://www.docker.com/

---
## Docker架構

---
- Docker Hub雲端儲存相關Docker Image(映像檔)
- 需要時,會從雲端Pull(抓取)一份Docker image至本地端
- Docker run可以執行映像檔成為Dcoker Container(容器)
- Docker Container之間透過Docker Network聯外以及容器間互相溝通
- 資料儲存於Docker Volume
---
## 安裝Docker
- curl -fsSL https://get.docker.com -o get-docker.sh (下載docker安裝檔)
- sudo sh get-docker.sh (執行docker安裝檔)
- sudo usermod -aG docker $USER (把docker加入使用者群組)
- newgrp docker
- exit(先離開環境再進去,exit之後再ssh進伺服器)
- docker version (檢查docker是否安裝成功)
- docker run hello-world
---

---
## Docker初體驗
- 最簡單的hello-world
- docker run hello-world
- 先去docker hub抓取一份hello-world的image到本地端
- 本地端有了image,可重複執行成hello-world容器
---

---
## Docker Image
- docker image ls (顯示目前本機中有多少映像檔,常打成docker images)
- docker image rm -f hello-world(移除hello-world映像檔)
- docker image ls
---

---
## Docker run
- docker run <映像檔> <指令>
- -d 背景執行
- -it 進入容器
- -p 通訊埠對應
- -v volume容器卷對應
- \-\-name 給定容器名稱
- \-\-rm 執行後刪除
---

---
## Docker run 常駐範例
- 前置作業
- 在虛擬機關機狀態下->網路(介面卡)->新增一通訊埠轉接->8080 to 80
- 重新啟動虛擬機

---
## Docker run 常駐範例
- docker run -d --name web -p 80:80 tutum/apache-php
- tutum/apache-php為automated容器,執行後會存在
- -d當作背景程式執行
- \-\-name給予此容器web名稱
- -p 80 port跟容器的80 port相對應
---

---
- 使用本機的瀏覽器,輸入http://localhost:8080,出現下圖表示成功

---
- docker ps (查詢有哪些服務)
- docker rm -f web (刪除web容器服務)
- docker ps

---
## Docker Volume
- docker volume資料卷是用來儲存容器資料
- 可以把資料跟容器執行程式分開來,獨立管理資料
- 即使容器不在,只要資料卷存在,依舊可以回復容器狀態。

---
## Docker Volume 範例
- mkdir web
- cd web
- wget https://raw.githubusercontent.com/shhuangmust/html/111-1/immust_7_footer.html

---
- docker run -d --name web -p 80:80 -v /home/ansible/web:/var/www/html tutum/apache-php
- (如有修正連結請按n)

---
- http://localhost:8080/immust_7_footer.html

---
- 刪除容器
- docker rm -f web
- 刪除web目錄及檔案
- sudo rm -rf web
---
# Docker Network (Docker網路連結)
---
- docker將容器連上網路的方法:每個容器的網卡是eth0,每一個新增容器會透過vethX介面,跟docker預設的聯外網卡docker0連線,再透過docker0跟真正的實體網卡eth0往外連。因此我們可以自己新增docker network取代docker0,來控制容器間的對外連線。

---
## Docker預設網路介面
- ip addr (或者ip ad,可看到docker預設網路卡docker0)

---
- docker run -d --name web tutum/apache-php (執行一個apache-php容器)
- docker ps
- docker exec -it web bash (進入web的bash介面)
- ip addr (觀察目前web容器使用的network介面,有個eth0虛擬網卡)
- exit
---

---
- ip addr (web容器使用的veth128e25c網路介面)
- docker rm –f web
- ip addr (刪除容器後,veth128e25c也消失了)

---
## 新增docker network來連接不同的容器
- docker network ls (查詢目前有哪些docker network介面)
- docker network create mybridge(新增mybridge網路介面)
- docker network ls (查詢是否建立成功)

---
- ip addr (多了一個br-xxx的網路介面,就是mybridge)

---
## 建立一個利用Mybridge串連的Mysql + phpmyadmin的應用
- mysql是網路常用的免費資料庫
- phpmyadmin是mysql常用的網路管理介面
---
- docker run -d --network mybridge --name db -p 3306:3306 -e MYSQL\_ROOT\_PASSWORD=abc1234 mysql (建立一個密碼為abc1234的mysql)
- docker ps
- docker run -d --network mybridge --name myadmin -p 80:80 phpmyadmin (建立一個phpmyadmin)

---
- http://localhost:8080
- id:root
- pwd:abc1234

---
## 刪除所有執行中的Docker Container
- docker rm -f $(docker ps -aq)
---
## Docker Compose
- 使用docker run可以啟動單一的docker container,但是如果要啟動多個 docker container,需要輸入多次docker run,還要建立起之間的docker network連結
- docker compose主要的目的,就是在docker-compose.yml檔內,設定所有要一起啟動的docker container
---
## 下載Docker Compose
- sudo apt install docker-compose-plugin
- docker compose version
---

---
## docker-compose.yml
- docker-compose.yml是docker如何啟動多個服務的yaml檔案
```yaml=
version: '3'
services:
db:
image: mysql
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: abc1234
myadmin:
image: phpmyadmin
ports:
- 80:80
```
---
## 下載docker-compose.yml
- wget https://github.com/shhuangmust/bigdata/raw/main/docker-compose.yml

---
## 啟動docker compose
- docker compose up -d
- docker compose ps (查看啟動的服務)

---

---
## 停止docker compose服務
- docker compose stop

---
## 移除docker套件
- sudo apt-get remove --auto-remove docker
- sudo apt-get purge docker-ce
- sudo rm -rf /var/lib/docker
{"metaMigratedAt":"2023-06-17T14:41:35.474Z","metaMigratedFrom":"YAML","title":"Docker","breaks":true,"contributors":"[{\"id\":\"ef0225b9-6c2a-4012-82c9-fa1031d2c4db\",\"add\":6453,\"del\":668}]"}