2021年5月24日 星期一

Docker入門教學03_筆記與心得

文章分成

Docker入門教學01_筆記與心得

一、shell快速完成安裝docker
二、建立一個Docker版的Node.js程式,並完成部署與分享
三、利用ENTRYPOINT進行指定的程序
四、建立一個Nginx的Web服務器

Docker入門教學02_筆記與心得

五、建立Python3.8的開發環境
六、建立PostgreSql資料庫
七、使用pgadmin4管理PostgreSQL資料庫
八、建立自己的快取Redis

Docker入門教學03_筆記與心得

九、Docker Compose
十、Flask+Redis多服務開發部署
十一、建立Vue開發環境

九、Docker Compose

觀念:
Docker Compose 的安裝與使用
 
官網:
 
GitHub

實戰:
 
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
 
$ sudo chmod +x /usr/local/bin/docker-compose
$ sudo docker-compose --version

解除安裝
$ sudo rm /usr/local/bin/docker-compose
 
開發Python Web 應用(Flask)
建立資料夾work
$ mkdir work

進入資料夾work
$ cd work

建立main.py
$ pico main.py

檔案名稱:main.py
檔案內容:
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
      return 'How are you! Are you OK?'

if __name__ == "__main__":
     app.run(host="0.0.0.0", debug=True, port=5000)

建立requirements.txt
$ pico requirements.txt

檔案名稱:requirements.txt
檔案內容:
flask==1.1.2

建立 Dockerfile
$pico Dockerfile
 
檔案名稱:Dockerfile
檔案內容:
#使用python:3.8-alpine版本
FROM python:3.8.3-alpine3.12
#將當前目錄映射到容器內/app目錄
ADD . /app
#設置/app為工作目錄
WORKDIR /app
#安裝python 需求包
RUN pip install -r requirements.txt
#啟動flask
CMD python main.py

建立flask image
$sudo docker build -t mark2470mark/myweb:0.1 
$sudo docker image ls
$sudo docker container run --name myweb -d -p 8088:5000 mark2470mark/myweb:0.1

$sudo docker container ls

$curl http://127.0.0.1:8088
打開瀏覽器,並在網址輸入  http://127.0.0.1:8088
 
刪除所有不用的容器
$sudo docker container prune
 $sudo docker container ls
停止容器
 $sudo docker container stop myweb
$sudo docker container prune
整個過程如下:

 接下來要談到 docker-compose.yml
 
文件版本: https://docs.docker.com/compose/compose-file/
現在使用的版本為 3.8
 
建立 docker-compose.yml
$pico docker-compose.yml
 
檔案名稱:docker-compose.yml
檔案內容:
version: '3.8'
services:
   myweb:
       build: .
       ports:
       - "8088:5000"
       volumes:
       - .:/app
 
容器啟動
$sudo docker-compose up
容器重新編譯後啟動
$sudo docker-compose up --build
容器重新編譯後啟動
$sudo docker-compose up -d --build
 
查詢容器狀態
$sudo docker-compose ps
 
執行myweb容器內的命令
$sudo docker-compose run myweb top

查看容器輸出日誌
(1)使用docker-compose
$sudo docker-compose logs -f myweb
 
(2)使用docker
$sudo docker logs -f work_myweb_1
 
容器停止
$sudo docker-compose stop


容器停止+消除(容器+網路)
$sudo docker-compose down
 
 容器停止+消除(容器+網路+image)
$sudo docker-compose down --rmi all 

 

 十、Flask+Redis多服務開發部署

觀念:
Docker Compose多服務開發部署(flask+Redis)
 
服務接構設計:
client<----> web(flask:myweb<---->db(redis:myredis)
 
實戰:
 
0.建立工作目錄並進入工作目錄
$mkdir work10
$cd work10

1.建立main.py
$pico  main.py
 
檔案名稱:main.py
檔案內容:
from flask import Flask
from redis import Redis
 
app=Flask(__name__)
redis=Redis(host='myredis',port=6379)
 
@app.route('/')
def hello():
      redis.incr('hits')
      return 'How are you!! We have met %s times. ' % redis.get('hits')
 
if __name__=="__main__":
     app.run(host="0.0.0.0", debug=True, port=5000)
 
2.建立 requirements.txt
$pico  requirements.txt
 
檔案名稱:requirements.txt
檔案內容:
flask==1.1.2
redis==3.5.3
 
3.建立Dockerfile
$pico Dockerfile
 
檔案名稱:Dockerfile
檔案內容:
#使用python:3.8-alpine版本
FROM python:3.8.3-alpine3.12
#將當前目錄映射到容器內/app目錄
ADD . /app
#設置/app為工作目錄
WORKDIR /app
#安裝python 需求包
RUN pip install -r requirements.txt
#啟動flask
CMD python main.py
 
4.建立docker-compose.yml
$pico docker-compose.yml
 
檔案名稱:docker-compose.yml
檔案內容:
version: '3.8'
services:
   myweb:
       build: .
       ports:
       - "8088:5000"
       volumes:
       - .:/app
       depends_on:
       - myredis
   myredis:
       image: redis:6.0.5-alpine 

5.容器重新編譯後啟動
容器啟動
$sudo docker-compose up
容器重新編譯後啟動
$sudo docker-compose up --build
容器重新編譯後啟動
$sudo docker-compose up -d --build
檢查image
$sudo docker image ls
查詢容器狀態
$sudo docker-compose ps

確認localhost打開的port
$netstat -nltp

測試web
$curl http://127.0.0.1:8088
 執行myweb容器內命令
$sudo docker-compose run myweb top

查看容器輸出日誌
(1)使用docker-compose
$sudo docker-compose logs -f myweb

(2)使用docker
$sudo docker logs -f work10_myweb_1
 
容器停止
$sudo docker-compose stop
容器停止+消除(容器+網路)
$sudo docker-compose down
容器停止+消除(容器+網路+image)
$sudo docker-compose down --rmi all

十一、建立Vue開發環境

 觀念:
1.Docker Node.js image的使用
2.安裝Vue Cli4等工具包
 
官網:
 
實戰:
0.建立工作目錄並進入工作目錄
$mkdir work11
$cd work11
 
1.取得Ubuntu image
$sudo docker pull node:12.20.1-buster
$sudo docker image ls

$mkdir src

2.建立Dockerfile
$pico Dockerfile
 
檔案名稱:Dockerfile
檔案內容:
FROM node:12.20.1-buster
ADD ./src /app
WORKDIR /app
ENV DEBCONF_NOWARNINGS yes
RUN apt-get update -y && \
         apt-get upgrade -y && \
         apt-get install -y \
                     build-essential -y \
                     curl \
                     nmap \
                     git \
                     nano \
         && rm -rf /var/lib/apt/lists/*
RUN npm install -g @vue/cli
 
3.建立image並啟動container
$sudo docker image build -t mark2470mark/vuecli4:0.1 .
$sudo docker image ls
$sudo docker container run -it -d mark2470mark/vuecli4:0.1 --name vuecli4 -v `pwd` /src:/app -p 8080:8080 
$sudo docker container ls
$sudo docker exec -it vuecli4 /bin/bash       



資料來源:

Docker入門教學02_筆記與心得

 文章分成

Docker入門教學01_筆記與心得

一、shell快速完成安裝docker
二、建立一個Docker版的Node.js程式,並完成部署與分享
三、利用ENTRYPOINT進行指定的程序
四、建立一個Nginx的Web服務器

Docker入門教學02_筆記與心得

五、建立Python3.8的開發環境
六、建立PostgreSql資料庫
七、使用pgadmin4管理PostgreSQL資料庫
八、建立自己的快取Redis

Docker入門教學03_筆記與心得

九、Docker Compose
十、Flask+Redis多服務開發部署
十一、建立Vue開發環境

五、建立Python3.8的開發環境

觀念:

1.建立Python3.8的開發環境

實戰:

1.到Docker Hub,找所需的image

2.下載到本機
$sudo docker pull python:3.8.0-alpine3.10

3.進入 python 3.8.0 互動式視窗
$sudo docker container run --rm -it python:3.8.0-alpine3.10
>>> exit()

4.確認linux版本、pip與python 版本
$sudo docker container run --rm -it python:3.8.0-alpine3.10 cat /etc/os-release
$sudo docker container run --rm -it python:3.8.0-alpine3.10 pip -V
$sudo docker container run --rm -it python:3.8.0-alpine3.10 python -V

5.執行本機的python程式
$mkdir docker
$cd docker
$pico test.py
其內容為:
import numpy as np
myarray = np.array([1,2,3,4,5])
print(myarray)

(1)執行test.py
$sudo docker container run --rm -it -v /home/webadmin/docker:/workfolder:ro python:3.8.0-alpine3.10 python /workfolder/test.py
現在出現問題:ModuleNotFoundError: No module named 'numpy'
因為python:3.8.0-alpine3.10這個image功能有限,所以改用python:3.8.0
如何做?
A.建立Dockerfile
$pico Dockerfile
內容為
FROM python:3.8
 
RUN pip3 install numpy
RUN mkdir -p /workfolder
COPY ./test.py /workfolder/
 
CMD [ "python","/workfolder/test.py" ]
B.建立image
$sudo docker image build -t testpython:v01 .
$sudo docker image ls
C.容器運行  
$sudo docker container run --rm -it testpython:v01

六、建立PostgreSql資料庫

觀念:
利用 docker image 建立PostgreSql資料庫,使用版本9.6.20
實戰:



3.指令:
安裝postgres:9.6.20-alpine
$ sudo docker pull postgres:9.6.20-alpine

啟動PostgresSql資料庫 - webdb 帳號:webadmin 密碼:demo1234
$ sudo docker run --name webdb -p 5432:5432 -e POSTGRES_USER=webadmin -e POSTGRES_PASSWORD=demo1234 -d  postgres:9.6.20-alpine
Docker container 列表
$ sudo docker container ls 
檢查本機開放那些port
$ nmap 127.0.0.1
連接PostgreSql
$ psql -h localhost -U webadmin
查詢有多少資料表
webadmin=# select * from pg_tables;

離開PostgreSQL
webadmin=# \q
停止資料庫
$ sudo docker stop webdb
檢查本機開放那些port
$ nmap 127.0.0.1
Docker container 列表
$ sudo docker container ls 
 Docker container 列表
$ sudo docker container ls -a

啟動資料庫
$sudo docker start webdb
執行資料庫的bash
$sudo docker exec -it webdb /bin/bash
bash-5.0# cd /var/lib/postgresql/data
bash-5.0# ls
bash-5.0# cat pg_hba.conf

bash-5.0# cat postgresql.conf
bash-5.0# exit
                      
接下來,要提到的是資料庫文件脫離Docker Container 永久保存
建立專用的獨立使用的Volume
$sudo docker volume create --name v_webdb_data
$sudo docker volume ls
$sudo docker volume inspect v_webdb_data
          
清除舊的webdb
$sudo docker stop webdb
$sudo docker container rm webdb
$sudo docker container ls -a
建立新的webdb
$sudo docker run --name webdb -v v_webdb_data:/var/lib/postgresql/data -p 5432:5432 -e POSTGRE_USER=webadmin -e POSTGRE_PASSWORD=demo1234 -d postgres:9.6.16-alpine

如何檢查綁定的volume
$sudo docker inspect webdb
......
"Mounts": [
            {
                "Type": "volume",
                "Name": "v_webdb_data",
                "Source": "/var/lib/docker/volumes/v_webdb_data/_data",
                "Destination": "/var/lib/postgresql/data",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ],
........
        值得注意的是...當未來postgres:9.6.16-alpine更新到postgres:9.6.17-alpine,只要資料庫格式不變的條件下,可直接將其綁定volume,即可完成更新。


七、使用pgadmin4管理PostgreSQL資料庫

觀念:
pgadmin4 Docker image的基本使用(postgre資料庫管理工具)

官網:

Docker Hub
https://hub.docker.com/r/dpage/pgadmin4 (此image非官方認證的image)

實戰演練:
安裝
$sudo docker pull dpage/pgadmin4:4.29
$sudo docker image ls

啟動資料庫
$sudo docker pull postgres:9.6.20-alpine
$sudo docker volume create --name v_webdb_data
$sudo docker run --name webdb -v v_webdb_data:/var/lib/postgresql/data -p 5432:5432 -e POSTGRES_USER=webadmin -e POSTGRES_PASSWORD=demo1234 -d postgres:9.6.20-alpine
啟動pgadmin4
$sudo docker run --name pgadmin4 --rm -p 8080:80 \
      -e 'PGADMIN_DEFAULT_EMAIL=mark2470mark@skjh.chc.edu.tw' \
      -e 'PGADMIN_DEFAULT_PASSWORD=demo1234' \
      -d dpage/pgadmin4:4.29

$sudo docker container ls
此時開啟網頁http://IP:8080,即可看到

停止pgadmin4、 webdb
$sudo docker stop pgadmin4
$sudo docker stop webdb
顯示系統內的container
$sudo docker container ls -a
顯示運行中的container
$sudo docker container ls 

八、建立自己的快取Redis

觀念:
建立自己的快取Redis

官網:
Docker Hub
實戰:
$ sudo docker pull redis:6.0.9-alpine
$ sudo docker image ls

建立永久性的Volume
$ sudo docker volume create --name v_redis_data
$ sudo docker volume ls
$ sudo docker run --name redis1 -v v_redis_data:/data -p 6379:6379 -d redis:6.0.9-alpine redis-server --appendonly yes --requirepass demo1234
$ sudo docker container ls

確認本地打開的TCP port
$ netstat -nltp
$ sudo docker exec -it redis1 top

啟用client 連接redis1
$ sudo apt-get install redis-tools

$ redis-cli -h 127.0.0.1 -p 6379 -a demo1234
127.0.0.1:6379> ping
127.0.0.1:6379> info

127.0.0.1:6379> set data01 "hello, redis."
127.0.0.1:6379> get data01
127.0.0.1:6379> set data02 "mark2470mark"
127.0.0.1:6379> get data02  
127.0.0.1:6379> keys *

127.0.0.1:6379> exit


Laravel 12 Model 資料庫中的資料表,並提供與資料庫互動的介面

相關系列文章: 1. 在 windows 10 安裝 laravel 12 studentManagement環境與設定 2. laravel 12 route 路由 3. laravel 12 Blade Templates 網頁模版 4. laravel 12 Control...