Command
Docker指令關鍵字
- Container:封裝了應用程序及其所有libraries和dependencies,因此它可以在安裝了 Docker 的任何地方運行
- Image: 容器的快照文件,可以通過運行 Docker Image來創建容器
- Docker Hub:供開發人員分發代碼的公共註冊表
- [COMMAND]:要docker執行的命令
- [OPTIONS]:可在docker命令添加選項以獲得不同的結果
- [ARG]:命令的附加參數
Container指令
$ docker run hello-world //執行一個container
$ docker run -dit hello-world //-d detach在背景執行 -i interactive 可以互動 -t TTY 終端模式
$ docker stop <containerID> //停止容器
$ docker inspect <containerID> //檢查容器內容
$ docker exec -it mycontainer bash //用bash進入container
$ docker logs -f myContainer //查看正在運行的容器的日誌文件
$ docker kill myContainer //將停止容器運行
$ docker ps //列出所有容器
$ docker rm //刪除容器
$ docker stop $(docker ps -aq) //列出所有容器的id,並且關掉他們
$ docker container prune -f //清掉已關閉的容器
Image指令
$ docker images //列出所有映像
$ docker rmi //刪除映像
$ docker search flutter //搜尋跟flutter有關的image
$ docker pull node //下載image映像檔
$ docker image ls -a //列出所有image檔
$ docker save python:2.7.17-alpine3.9 > /path/to/save/my-python-container.tar //另存image為壓縮檔
Docker指令
$ docker login //登入到docker registry
$ docker login localhost:8080 //登入到私人的registry
$ docker tag nginx:latest weili0505/myapp //創建一個引用IMAGE的標籤
$ docker build -t mytomcat . --no-cache //建立映像檔
$ docker push maryatdocker/docker-whale //將映像檔上傳到Docker Hub或其他註冊表
Redis
- Redis 是一種開放原始碼、記憶體內資料存放區,回應時間低於一毫秒。熱門使用案例包括:快取、工作階段存放區、排行榜以及發佈/訂閱等
- 情境:電子商務系統,因為資料庫與軟體是不同的機器,所以效能低落,每次都讀取資料的話,費用也會提高,要怎麼解決呢?
- 解決方法:緩存在電子商務系統,或放置緩存在另一個容器
- 使用Redis來儲存在電子商務系統緩存中
打開docker desktop
進到vscode > TGC102資料夾
> docker pull redis
> docker images
> docker create -it --name myRedis redis //對容器命名為myRedis 建立的映象檔redis
> docker ps -a //顯示所有容器
> docker cotnainer start myRedis //啟動docker
> docker exec -it myRedis redis-cli //容器去執行redis-cli
127.0.0.1:6379> set userName Jack //建立一個變數
127.0.0.1:6379> get userName //取得變數值
127.0.0.1:6379> quit //退出
> docker rm -f myRedis //刪除容器
> docker ps -a //查看結果
建立ubuntu容器
- 查看exec與attach的分別
- attach:主線,將終端的標準輸入、輸出和錯誤附加到正在運行的容器
- exec:副線,在正在運行的容器中運行另一個新的執行緒
- log:會去抓取第一個執行緒的log
- 如果有服務是不希望關掉的,就採取exec的方式進入容器
建立ubuntu容器
> docker pull ubuntu //下載映像檔
> docker images //看有沒有下載成功
> docker create -it --name myUbuntu ubuntu //建立容器-i是interactive -t是tty互動介面
> docker ps -a //看看容器的狀態
> docker start myUbuntu //啟動容器
> docker ps -a //看看有沒有啟動
> docker exec -it myUbuntu bash //執行容器並且用bash
# pwd //測試一下ubuntu的環境
# ls
# whoami
# exit //退出ubuntu
> docker ps- a //查看容器狀態,容器還是執行中的狀態
> docker logs myUbuntu //查看不到指令記錄檔
> docker stop myUbuntu //停用容器
> docker start myUbuntu //容器啟動
> docker attach myUbuntu //前台執行容器
# pwd //測試一下ubuntu的環境
# ls
# whoami
# exit
> docker s -a //可以看到attach的容器退出時會同時會關掉的容器
> docker logs myUbuntu //可以看到剛剛執行得指令紀錄
> docker rm myUbuntu //刪掉容器
inspect 容器的詳細資訊
- docker inspect 檢視容器的詳細資訊,內容以json格式顯示
> docker inspect myUbuntu //查看容器的資訊
stats 容器運行中的指標
- docker stats 可以查看每個 Container 使用掉多少的系統資源
- 有目前 Docker Container 所使用的 CPU、記憶體、網路I/O、BLOCK I/O 等等的資源使用量
> docker stats myUbuntu //容器運行中的指標
用+另外開一個終端機terminal
> docker exec -it myUbuntu bash //進入容器
# apt-get update
# api-get install -y stress-ng //-y直接執行 stress-ng壓力測試套件
# stress-ng --cpu 4 --timeout 60s //產生 CPU 滿載狀況(4 CPU stressors、持續 60 秒)
運行nginx容器
- 用另一個port來執行網頁伺服器
方法1:
> docker pull nginx //拉入image
> docker create -p 7999:80 --name myNginx nginx //-p port對應端口
> docker start myNginx //啟動container
打開瀏覽器輸入localhost:7999 ,就會看到nginx的預設頁面
> docker rm -f myNginx //清除容器
> docker rmi nginx //清除映像檔
方法2:
> docker run -d -p 7999:80 --name my2Nginx nginx //也可以用run的方式(取代pull+create+start)
打開瀏覽器輸入localhost:7999 ,就會看到nginx的預設頁面
> docker ps -a //查看容器狀態
> docker exec -it my2Nginx bash //進入容器
# cd /usr/share/nginx/html //到nginx的網頁根目錄位置
# cat index.html //查看index.html
# echo "<h1>Hello Docker</h1>" > index.html //修改index.html
# exit //退出容器
線在我們想要把目前的狀態保存下來
> docker commit my2Nginx mynginximage:0.0.1 //保存為映像檔,命名必須小寫,最後是image名稱:版本
> docker images //查看映像檔
> docker run -d -it -p 7000:80 mynginximg:0.0.1 //用映像檔重新跑一次
清空所有容器
- 先列出並停止所有容器
- 用prune的方式清掉所有容器
> docker stop $(docker ps -aq) //列出所有容器的id,並且關掉他們
> docker container prune -f //清掉已關閉的容器
使用Bind mount a volume
- 每次開啟新的container都會變回初始化的狀態
- commit還需要給版本號,這樣不方便
- 可用volume的方式將資料永久保存在本機
- 透過-v(volume)可以將修改資料保留
- 本地綁定的目錄與容器內指定的目錄會雙向同步
> mkdir -p nginx/web
> cd nginx
> docker run -itd -v $pwd/web:/usr/share/nginx/html -p 7999:80 nginx //-d 背景執行 -v volume資料卷 要綁定的路徑, 端口對應, 要執行的image
> echo "Hello, Bind Mount" > web/index.html
> docker exec -it 68e bash //進行任何的修改都會改到volume中的值

- -p 本機port:容器port -v 本機路徑:容器路徑 -d -it --name --env --link 容器與容器的溝通 --network bridge host linux none 無 overlay 不同主機的容器之間的溝通 macvlan 網卡MAC地址
實作3:將jupyter與mysql串接link
> mkdir -p jupyter_db/sqldb //建立目錄
> cd jupyter_db //cd進去目錄
> mkdir app //建立資料夾
> docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -v $pwd/sqldb:/var/lib/mysql -d -p 306:3306 mysql:latest //-e添加環境變數 -v做資料卷綁定 -d後臺執行
> docker ps -a
> docker run --link mysql --name jupyter -d -p 8888:8888 -p 5000:5000 -v $pwd/app:/home/jovyan/work jupyter/base-notebook start-notebook.sh --NotebookApp.token='' //連到另一個容器
打開瀏覽器到localhost:8888 就會到jupyter的工作區域
下面在work資料夾中新增python3的ipynb文件
!pip install pymysql //安裝套件
import pymysql //引入套件
db = pymysql.connect(host="mysql", user="root", passwd="123456", db="") //建立資料庫連線
cursor = db.cursor() //使用 cursor() 方法建立一個客戶端游標物件 cursor
cursor.execute("SELECT VERSION()") //使用 execute() 方法執行 SQL 查詢
data = cursor.fetchone() //使用 fetchone() 方法獲取單條資料
print("Database version : %s" % data) //印出結果
db.close() //關閉資料庫連線
實作4:建立網路
在jupyter_db資料夾內
> docker network create test-network
> docker network ls
> docker run --network test-network --name mysql -e MYSQL_ROOT_PASSWORD=123456 -v $pwd/sqldb:/var/lib/mysql -d mysql:latest
設定網路是test-network
> docker run --network test-network --name jupyter -d -p 8888:8888 -v $pwd/app:/home/jovyan/work jupyter/base-notebook start-notebook.sh --NotebookApp.token=''
> docker ps -a
> docker rm -f $(docker ps -aq)
> docker network rm test-network
- 打開瀏覽器到localhost:8888 就會到jupyter的工作區域
- 下面在work資料夾中會看到python3的ipynb文件