# Docker Linux 學習筆記
## 使用標準輸出到後面的標準輸入 , import 後面要有地址,因此我們用標準輸入的符號( - )來去引導地址
```c
unzip -p cv2-ocr-lcd-gpio-fr.zip | docker import - cv2-ocr-lcd-gpio-fr:cv3.3
```
## docker run 的附屬設定
-d 是背景執行
-e 是環境設定
-p 是Port設定
-v 是地址設定 ( 可以進行磁碟對應 ) //只有在寫入資料時才會創建資料
-w 是工作目錄夾設定
```c
-v /etc/localtime:/etc/localtime:ro (ro是 read only,就是指令)
```
## pwd 指令
`pwd` 是表示當前目錄在哪裡的意思,此外再撰寫bash程式時,指令若不在開頭,那就需要用
`` ` ` ``包起來Linux才看得懂
## docker images 執行
```c
pi@raspberrypi:~ 🍓 sudo apt install python3-pigpio
pi@raspberrypi:~ 🍓 sudo pigpiod
pi@raspberrypi:~ 🍓 docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
pi@raspberrypi:~ 🍓 unzip -p cv2-ocr-lcd-gpio-fr.zip | docker import - cv2-ocr-lcd-gpio-fr:cv3.3
sha256:620ede1adaf2fc4bb820c8b1325b8dda00c528564343f6b3d89e3d07dffec8ca
pi@raspberrypi:~ 🍓 docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cv2-ocr-lcd-gpio-fr cv3.3 620ede1adaf2 4 minutes ago 1.05GB
pi@raspberrypi:~ 🍓 docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
pi@raspberrypi:~ 🍓 docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
pi@raspberrypi:~ 🍓 docker run -it -v /dev:/dev --privileged \
-v /etc/localtime:/etc/localtime:ro -e "LANG=C.UTF-8" \
-p 9090:9090 \
-v `pwd`:/mycv2 \
cv2-ocr-lcd-gpio-fr:cv3.3 /bin/bash
pi@raspberrypi:~ 🍓 docker ps
pi@raspberrypi:~ 🍓 docker ps -a
docker start -ai CONTAINER_ID_前幾碼
# CONTAINER_ID 啟動之後,另一終端機再登入 CONTAINER :
docker exec -it CONTAINER_ID_前幾碼 bash
# ==========================================================================================
cd; docker run --restart unless-stopped -it -v /dev:/dev --privileged \
-v /etc/localtime:/etc/localtime:ro -e "LANG=C.UTF-8" \
-p 5000:5000 -p 8880:8888 -p 9090:9090 \
-v `pwd`:/mycv2 \
cv2-ocr-lcd-gpio-fr:cv3.3 bash /mycv2/w10/search.sh 12
# ==========================================================================================
# "1: 'aeroplane', 2: 'bicycle', 3: 'bird', 4: 'boat', 5: 'bottle', 6: 'bus', 7: 'car', 8: 'cat', 9: 'chair', 10: 'cow', 11: 'diningtable', 12: 'dog', 13: 'horse', 14: 'motorbike', 15: 'person', 16: 'pottedplant', 17: 'sheep', 18: 'sofa', 19: 'train', 20: 'tvmonitor'"
# ==========================================================================================
```
## Docker對外機制
只要運行Docker的主機( Host )有對外的窗口,那Docker就能對外,並且設定Port就能利用該ip加端口進入與操作,因為Docker是利用主機的OS基礎上來建置容器,因此只要Host能對外,那容器就能對外(Windows系統有些不一樣,因為他關閉了很多功能,Linux則沒關,所以一切正常),不過為了怕駭客入侵,會把Docker設為 read only 因此只有主機能對它改動,而Docker本身與外部連入的裝置都不能改動它
## Docker exec ( docker 執行 )
-it 告訴它要與你的裝置互動 ( 在你裝置畫面互動 )
```bash
docker exec -it [id] bash [想執行的指令]
docker exec -it [id] bash ( 這可以直接進入容器的bash介面 )
```
## docker-compose
docker-compose是一種連鎖啟動容器的方案,它使用 `docker-compose.yml` 檔來去設定所有容器的連鎖設定
```bash
安裝 docker-compose
sudo apt install docker-compose
```
```yaml
version: "3"
services:
iot_mongo:
image: iot_mongo:111
restart: unless-stopped
build: ./iot_mongo
ports:
- '172.17.0.1:21617:27017'
volumes:
- ./mongo_db:/data/db
iot_data:
image: iot_data:111
restart: unless-stopped
build: ./iot_data
ports:
- '12111:12321'
volumes:
- ./iot_data:/x
- ./log_data:/xlog_data
depends_on: //這個容器會等 iot_mongo 啟動完畢再啟動
- iot_mongo
iot_www:
image: iot_www:111
restart: unless-stopped
build: ./iot_www
ports:
- '8111:8000'
volumes:
- ./iot_www:/x
- ./log_www:/xlog_www
depends_on:
- iot_mongo
```