2020年1月19日 星期日

[Docker] Docker基本指令


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配置不同網路)來調整
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 
基本上Dockerfile是由一行一行的指令列所組成,一行指令對Image來說就是一層的資料層(Layer),一個Image就是靠這樣一層一層的資料累加上去,最後才編譯出自己想要的映像檔 DockerFile寫法篇幅過大, 可以找網路上有很多資源可以看

注意
  • CMD: dockerfile可以有很多CMD 但只有最後一個生效, CMD會被docker run之後的參數替換(run後面又自己加了其他指令, 因為等於在dockerfile最後面又加了CMD)
  • ENTRYPOINT: docker run之後的參數會被加入參數組合當中一起執行







image一層一層組合方式如下圖




Ref:

沒有留言:

張貼留言