### Docker2.0
<img src="https://dic.vbird.tw/network_project/images/doecker-1.png" style="width:50%" />
---
### 目錄
- 認識docker
- docker 基本指令
- nginx實作
- 使用docker compose架設Mysql
---
### 前言
什麼是docker
----
### docker的架構及原理
https://philipzheng.gitbook.io/docker_practice/
(參考文件)
----
### docker的基本概念
- 映像檔(Image)
- 容器(Container)
- 倉庫(Repository)
----
映像檔(Image)
Docker 映像檔就是一個唯讀的模板。
映像檔可以用來建立 Docker 容器。
----
容器(Container)
容器是從映像檔建立的執行實例。
Docker 利用容器來執行應用。
可以被啟動、開始、停止、刪除。
每個容器都是相互隔離的、保證安全的平台。
----
倉庫(Repository)
倉庫是集中存放映像檔檔案的場所。
每個倉庫中又包含了多個映像檔。
每個映像檔有不同的標籤(tag)。
倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。
----
### docker概念圖

----
### docker跟虛擬機的差別

---
### docker基本指令
參考文件:
https://ithelp.ithome.com.tw/articles/10199339
官方資料:
https://docs.docker.com/engine/install/ubuntu/
----
安裝docker(ubuntu)
先更改docker在apt中下載位置
```
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
```
----
使用apt下載官方docker
請不要使用podman會爛掉
```
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```
----
可以打打看,看看裡面有什麼
```
docker images
```
----
### 如果跳出這個就請具續做下去
```
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
```
#### 如果沒有跳出這個問題那請跳到再來的部分
----
### 檢查一下自己的環境是wsl還是wsl2
有可能自己的環境是wsl2但是因為是wsl升上去的有可能要修config
----
在/etc/wsl.conf 裡加上這兩行就會改變原本的執行方式
```
sudo nano /etc/wsl.conf
```
```
[boot]
systemd=true
```
不知道大家還記不記得啊!
~~nano存檔ctrl+s~~
~~nano離開ctrl+x~~
----
再來我們上禮拜是自己寫一個images
那我們這禮拜來架服務
----
首先先到docker hub上找個順眼的images
https://hub.docker.com/
#### 我們這邊就用nginx來做示範
----
到這邊搜尋nginx

----
選個最多人用的

----
點這個tag裡面會有

----
最後一版的images可以使用按旁邊的複製

```
docker pull nginx:stable-alpine3.17-slim
```
----
再回到我們的wsl貼上就能把images pull 進電腦
這時候可以用來檢查裡面有沒成功pull進來
```
docker images
```
----
再來我們要把剛剛pull 的images run起來
```
docker run -d -p 80:80 --name nginx nginx:stable-alpine3.17-slim
```
- -d 是在背景執行
- -p 是指在哪個port運行,左邊是wsl的port,右邊是docker裡的port
- nginx:stable-alpine3.17-slim是images的名稱
----
要看現在有什麼docker在執行可以用這個
```
docker ps -a
```
----
大家可以到自己外面的主機的瀏覽器上看
(http://127.0.0.1/)
----
如果要停一個服務
```
docker stop nginx
```
相對的要繼續就~
```
docker start nginx
```
刪除一個容器
```
docker rm nginx
```
#### 以上的nginx都可以換成CONTAINER ID
---
### Docker compose + mql
----
### 什麼是docker compose
Docker Compose 是用來定義和執行多容器Docker 應用程式的工具。
參考資料1:
https://yhtechnote.com/what-is-docker-compose/
參考資料2:
https://dev.to/devkiran/mysql-phpmyadmin-docker-compose-54h7
SQLkeyword:
https://hub.docker.com/_/mysql
----
### 首先先創一個資料夾
```
mkdir mql
```
----
### cd 進mql資料夾
```
cd ./mql
```
----
### 創一個叫docker-compose.yml的檔案
(名字很重要)
```
nano docker-compose.yml
```
----
### 再把這一串複製進去
```
version: "3"
services:
# Database
db:
platform: linux/x86_64
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: yourdb
MYSQL_PASSWORD: password
networks:
- mysql-phpmyadmin
# phpmyadmin
phpmyadmin:
depends_on:
- db
image: phpmyadmin
restart: always
ports:
- "8090:80"
environment:
PMA_HOST: db
MYSQL_ROOT_PASSWORD: password
networks:
- mysql-phpmyadmin
networks:
mysql-phpmyadmin:
volumes:
db_data:
```
----
### 重要句子解釋
- version: "3" =compose file 的版本
- image: mysql:5.7
=使用什麼image去run(無須自己pull進來在執行docker-compose.yml的檔案時就會自動去下載及pull)
- volumes: - db_data:/var/lib/mysql
= 在wsl端及docker內部的資料夾做映射(左邊是外部右邊是內部,外部資料夾不用自己新增)
- ports:- "3306:3306"
=與之前docker run 的時候一樣要把裡面的port跟外面的port做對接
----
- environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: yourdb
MYSQL_PASSWORD: password
= root的密碼、database的名稱、使用者的密碼
- networks:
- mysql-phpmyadmin
= 要把phpmyadmin跟Mysql放在同一個網路內不然沒辦法互連
- depends_on:- db
= 要關於上面的db資料庫
(不然他不知道要用哪個資料庫)
----
- networks:
mysql-phpmyadmin:
volumes:
db_data:
= 類似於做宣告的部分,有宣告才可以引用網路及不用新增一個新的外部資料夾就可以做到前面提到的映射
----
把docker compose 跑起來
```
docker compose up -d
```
把docker compose 停下來
```
docker compose stop
```
千萬不要打下面這個
```
docker compose down
```
因為這是把docker compose刪了的意思
----
### 大家可以跑跑看
http://127.0.0.1:8090/
帳號:root
密碼:password
----
# 今天就到這
{"title":"docker 基礎課程","contributors":"[{\"id\":\"da71bafc-6321-42d2-9f9c-dcb3ff0372c3\",\"add\":5467,\"del\":266}]"}