Docker基本指令
Docker優點:一次建立, 處處部署, 降低程式部署時, 部署環境常與開發環境不同或套件版本不同, 造成開發環境正確, 部署環境錯誤的狀況, 開發時裝了一次, 部署就不再一個一個裝了, 使用image build即可
VM是帶環境安裝的一種解決方案, 連硬件一起模擬, 直接運行機器的內核, 但佔資源過多, 步驟多啟動慢, Docker是一種container技術不是模擬一個完整的操作系統, 軟體工作所需要的資源打包成container就好
以Linux為基底的image 為例, container會共用宿主機上的kernel也就是Linux層, 再安裝centos or ubuntu, 再安裝其他工具套件, 會比整個OS的VM輕量許多
Docker組成:image container registry
本篇列出常用Docker指令集, 實際上還是會搭配管理介面例如Portainer
image
- image名稱:dock0/ssh:lastest [Namespace/Repository:Tag]
- Namespace:用來辨識image的組織或個人
- Repository:image檔名 Tag:區分版本
# 下載上傳映像檔到倉庫 docker pull/push # 看目前有哪些映像檔 docker images # 刪除映像檔 docker rmi # 可將之前建立的container並且有異動過的建立一個先的image docker commit [containerID] # 持久化image docker save charles/flaskapi:production > flaskapi.tar # 將映像檔load到本機repository docker load < flaskapi.tar
container
# 建立容器與執行指令, (-d)讓程式執行於後台, 關閉終端機後還會繼續執行 docker run -d # 將容器run起來並進入此container的終端(container stop+退出: exit, 單純退出終端: ctrl+p+q) docker run -name my-nginx -it nginx # 將容器命名以及指定nginx port 80對應對外port 8080 格式 [hostIP:hostPort:contanerPort] docker run -name my-nginx -p 0.0.0.0:8080:80 nginx # 操作容器 docker start/stop/restart # 刪除容器(可直接打ID部份開頭就可以) docker rm # 強制停止容器 docker kill # 看目前有哪些容器執行 docker ps # 看所有容器與ID, 包含關掉的 , -f用來過濾("name=nginx", "status=running"), -l 最後建立的, -n 列出最近n個 docker ps -l(-n 3) -a -f "name=nginx" # -it 可在container執行指令(-t不進去但執行指令) ,指令為php -v, --rm執行完就刪除, -w更改下指令的路徑 docker run --rm -it -w /usr/local/ php php -v # 將container資料/檔案夾掛載到本機資料/檔案夾當中, 本機沒裝軟體透過container產生資料丟到本機的技巧, rw是存取權限 docker run -v /host:/container:rw # 匯出匯入container, 容器所有檔案都包含於匯出的資料當中 docker export [containerID] > nginx.tar docker import nginx.tar (ymd/web:1.0) # build image .= 在當前目錄下面 docker build -f /mydocker/dockerfile -t charles/nginx .
監控容器
# 進到容器裡執行bash, 已經run起來 想進去執行指令或直接執行指令不進去終端(有指令就會進去)
docker -it exec my-nginx bash(其他指令如ps)
# 看裡面的log, 限制數量
docker logs --tail 50 [containerID]
# 顯示container內的處理程序(PID列表...), -x不顯示tty虛擬控制台資訊
docker (top (-x) or ps) nginx[container別名]
# 取得容器環境變數.執行命令.網路配置等 -f可過濾
docker inspect (-f) nginx
# 取得容器環境內的檔案 複製到本機
docker cp nginx:/tmp/yml.log /root
資料卷與資料卷容器
提供container檔案持久化和共享機制, container volumn 與外面的file連結, 資料就不會隨著container消失而消失
資料卷
docker run -v ~/app:/app --workdir /app node yarn init -y
run container時指定宿主機目錄~/app與container裡面的目錄/app連結
資料卷容器建立方式(建議使用, 用於container之間資料共享)
如果利用資料卷將組態.程式碼.日誌直加掛載到container, 打破了docker的封裝性, 對日後維護造成麻煩
使用資料卷容器(data container) 的方式更能輕鬆歸類和匯總資料卷,data container專門放資料卷, 當其他容器也須使用資料卷時, 就從data container直接掛載, 當有其他試圖刪除資料卷時, data container不會刪除資料卷的資料, 保證其安全, 也可透過data container了解資料卷狀況
但data container也有缺點, 不能方便存取data container資料, 可將data container中的資料卷掛載到另一個container, 再透過container修改內容, 一般會使用SSH修改資料卷的資料
docker create --name data_contaner -v /html ubuntu
data container獨立於container之外, 不需run起來, 減輕主機效能, 一個data container建議繫結一個資料卷
docker inspact data_contaner
查詢資訊
docker run -d --name web --volumn-from data_contaner nginx
建立container連結data_container, 可連結多個, 實現多個container對多個相同檔案夾進行操作(資料共享)
data_contaner如果砍掉了, container web資料不受影響, 共享的資料會一直到沒容器使用他們為止
docker run -it --volumn-from data -v $(pwd):/backup --name exporter(importoer) --rm ubuntu /bin/bash tar cf/backup/data.tar /data(tar xf /baskup/data.tar)
exit
移植資料卷(備份container裡面的資料卷), 匯出資料前必須建立新的容器, 並將其連結到正確的data container, 進入容器進行封裝(cf 壓縮), 再將資料掛載本機目錄, data.tar存於本機當中, --rm會自行刪除剛剛建立的container, 復原匯出的資料使用xf解壓縮
docker run -it -v /host1:/datavolume01 -v /host2:/datavolume02 nginx /bin/bash
以上操作可以改為dockerfile啟動, 如下方dockerfile
FROM nginx
VOLUME ["datavolume01", "datavolume02"] 會在container裡面生成兩個資料夾, host1資料夾預設在/var/lib/volumes/xxxxxxxxx/_data裡面, 可使用docker inspace AAA 去看宿主機volume位置在哪
CMD echo "success"
CMD /bin/bash
網路
網路存取和容器之間建立網路連結
docker run -d -p 80:80 -p 443:443 nginx
container與本機的網路連結, 開放container裡面的port, nginx使用的是80與443, 對應container外的80與443, -p <本機port>
安全性
安全性可以透過限制存資源.網路存取權限(設定唯讀, 不同container配置不同網路)來調整
安全性可以透過限制存資源.網路存取權限(設定唯讀, 不同container配置不同網路)來調整
docker run -d -m 512M -m-swap 1024M nginx:satble
Linux的記憶體分為實體記憶體和交換區記憶體, 當記憶體不夠時會把部分資料移到交換區中
docker run -d -c 500 nginx
docker run -d -c 1000 php:7-fpm
nginx與php佔CPU比重為1:2
docker run --device-read-bps /dev/sha:50mb ubuntu:lastest
限制指定硬碟的存取速度
docker run -d --name nginx --ulimit cpu=1000 nginx:stable
docker run -d --name nginx --default-ulimit cpu=1000 nginx:stable
也可以透過與linux指令相同的語法ulimiy限制容器資源
或直接在docker daemon中設定
DockerFile
注意
- CMD: dockerfile可以有很多CMD 但只有最後一個生效, CMD會被docker run之後的參數替換(run後面又自己加了其他指令, 因為等於在dockerfile最後面又加了CMD)
- ENTRYPOINT: docker run之後的參數會被加入參數組合當中一起執行
image一層一層組合方式如下圖
Ref:
Ref:
- 熊昌隆著 , Docker專業養成 , 博碩
- Docker線上讀書會,
- ha_weii的博客
Docker 實戰系列(三):使用 Volume 保存容器內的數據,
【尚硅谷】Docker全套教程 by周阳
Docker – Dockerfile 指令教學,含範例解說https://www.jinnsblog.com/2018/12/docker-dockerfile-guide.html
正確撰寫Dockerfile 製作最好用容器映像檔
https://www.netadmin.com.tw/netadmin/zh-tw/technology/7BD73E2A172C4847A3F72D238ACA5148?page=3
沒有留言:
張貼留言