目錄
- 用前端姿勢玩docker【一】Docker通俗理解常用功能匯總與操作埋坑
- 用前端姿勢玩docker【二】dockerfile定制鏡像初體驗
- 用前端姿勢玩docker【三】基於nvm的前端環境構建技巧
- 用前端姿勢玩docker【四】基於docker快速構建webpack的開發與生產環境
- 用前端姿勢玩docker【五】快速構建中類Unix系統與Windows系統的差異化處理
前言
首先一句話表達個人對docker的理解:與傳統虛擬技術基於硬件及物理資源的虛擬化相比,Docker更加輕量化,docker為基於操作系統或內核級別的虛擬化,並且提供了從各種機制與操作以滿足從開發環境到生產環境的各種定制化需要。
個人認為對前端而言,docker的意義在於:滿足了前端環境的構建便利性與一致性的同時,降低了FE上手linux以及虛擬化技術的難度,同時docker借鑒了git的部分優點,更便於類比進行理解。
Docker為何如此好玩 !!! 自此開始分享前端工程化與docker相結合的各種玩法與姿勢!!關於docker的FE相關環境也會及時更新到github上(頂部有傳送門),請持續關注
坑會繼續挖繼續填,持續更新中。。。
首先記錄一下常規操作:
Docker主要圍繞倉庫、鏡像、容器三者展開,容器為核心。實際使用的時候也是主要與容器打交道。
linux基礎,docker的安裝等等非干貨內容請自行學習,在此不做贅述。
鏡像操作
- 查看本地主機上已有鏡像
docker images
- 為本地鏡像添加標簽
docker tag ubuntu:18.04 myubuntu
- 查看詳細信息
docker inspect ubuntu:18:04
- 查看json中的具體項
docker inspect -f {{".Architecture"}} ubuntu:18.04
- 查看鏡像歷史
docker history ubuntu:10.04
- 搜尋鏡像
docker search [option] keywords
- 刪除鏡像
docker rmi 鏡像名或id
或者docker image rm 鏡像名或id
- 清理鏡像
docker image prune -f
- 刪除名稱為none的鏡像
docker rmi $(docker images | awk '/^<none>/ { print $3 }')
創建鏡像
基於容器創建
- 首先創建容器
docker run -it ubuntu:18.04
- 在容器中自定義操作
- 根據指定容器的containerID創建鏡像 ,指定作者,提交信息,新鏡像名稱以及tag
docker commit -a pomelott -m 'test commit' 9a9283d556f6 newubunto:v1
基於本地模板導入
- 通過本地已有鏡像導入
cat ubuntu-18.04-x86_64-minimal.tar.gz I docker import - ubuntu:l8.04
基於dockerfile創建
- 在根目錄下創建dockerfile,並寫入dockerfile相關腳本(具體細節下文詳解)
- 在當前目錄下執行
docker build -t 創建的鏡像名稱 dockerfile存放目錄
鏡像存出 & 導入
- 將本地鏡像存儲文壓縮文件以拷貝給他人使用
docker save -o ubuntu_18_04.tar ubuntu:18.04
- 將壓縮文件導入
docker load -i ubuntu_18_04.tar
上傳鏡像
- 為鏡像修改標簽
docker tag myubuntu:latest pomelott/myubuntu:18.04
- 推送至遠程docker Hub
docker push pomelott/myubuntu:18.04
注意:push需要推送至國外dockerHub源,會異常緩慢。修改鏡像源只能解決pull的問題,就像npm,publish的時候也只能切回npm的官方源才可以。 - 解決慢的問題: 1、docker私庫 2. github 基於dockerfile進行build 3. 解決網絡問題(_)
容器
- 創建容器
docker create -it ubuntu:18.04
, 可以通過docker ps -a
查看 - 啟動容器
docker start [containerID]
可以通過docker ps
查看 - 創建並啟動
docker run [containerID/鏡像名]
- 通過交互式bash啟動(啟動后不會立即停止)
docker run -itd ubuntu:18.04 /bin/bash
- 某些時候,執行 docker run 時候因為命令無法正常執行容器會出錯直接退出, 此時可以查看退出錯誤代碼,命令執行后出錯,會默認返回命令。
125 : Docker daemon 執行出錯,例如指定了不支持的 Docker 命令參數;
126 :所指定命令無法執行,例如權限出錯
127: 容器內命令無法找到 - 查看容器的輸出值
docker logs [containerID/name]
- 暫停容器
docker pause [containerID/name]
, 取消暫停docker unpause [containerID/name]
- 終止容器
docker stop [containerID/name]
,此時通過docker ps
無法看到已終止的容器 - 終止所有容器
docker stop $(docker ps -aq)
- 重啟容器(將一個運行狀態的容器先終止,再啟動)
docker restart [containerID/name]
- 強行終止容器
docker kill [containerID/name]
- 清除掉所有處於停止狀態的容器
docker container prune
- 進入容器(與本機的標准輸入輸出綁定)
docker attach [containerID/name]
,通過exit退出后,容器即終止。 - 進入容器(類似ssh遠程登錄)
docker exec -it [containerID/name] /bin/bash
, 通過exit退出后,容器不會終止。 - 刪除處於終止或退出狀態的容器
docker rm [containerID/name]
- 導出容器為tar文件
docker export -o export_ubuntu.tar ce5
- 導入容器為鏡像
docker import export_ubuntu.tar tate-ubuntu:v1.0
- 查看容器詳情
docker inspect [containerID/name]
- 查看容器內進程
docker top [containerID]
- 查看容器統計信息
docker stats [containerID]
- 復制文件,在容器與宿主機之間傳遞文件:將本機當前目錄的test.js復制到容器的/root/ 目錄下
docker cp test.js 385e9dfbf889:/root/
- 查看變更: 查看在原容器基礎之上的操作
docker diff [containerID]
- 查看容器的端口映射
docker port [conainerID]
- 更新容器:更新容器的一些運行時配置,主要是一些資源限制份額
docker update [container]
— blkio-weight uintl6 :更新塊 IO 限制, 10 1000 ,默認值為 ,代表着無限制;
— cpu-period int :限制 CPU 調度器 CFS (Completely Fair Scheduler )使用時間,單位為微秒,最小 1000;
— cpu-quota int :限制 CPU 調度器 CFS 配額,單位為微秒,最小 1000;
— cpu-rt period int :限制 CPU 調度器的實時周期,單位為微秒
— cpu-rt runtime int :限制 CPU 調度器的實時運行時,單位為微秒;
— c, -cpu-shares in 限制 CPU 使用份額;
— cpus decimal :限制 CPU 個數;
— cpuset-cpus string :允許使用的 CPU 核,如 0-3, 0,1;
— cpuset mems string :允許使用的內存塊,如 0-3' 0, 1;
— kernel-memor bytes :限制使用的內核內存;
— m, -memory bytes 限制使用的內存;
— memory-reservation bytes :內存軟限制;
— memory-swap bytes :內存加上緩存區的限制, 表示為對緩沖區無限制;
— restart string 容器退出后的重啟策略
數據管理
主要做本地與容器、容器與容器之間的數據通信
— mount 項支持三種類型的數據卷,包括
volume 普通數據卷,映射到主機/var/ lib /docke /volumes 徑下;
bind :綁定數據卷,映射到主機指定路徑下;
tmpfs :臨時數據卷,只存在於內存中
數據卷
- 啟動容器,並將本機目錄掛在到容器的指定目錄
docker run -idt -P --name web --mount type=bind,source=/root/file,destination=/root ubuntu:18.04
- 多容器共享, 使用數據卷宗器(也是一個容器)供容器與容器間通信,個人理解類似橋接的模式
- 創建數據卷容器,並且在/root/file 創建一個數據卷
docker run -it -v /root/file --name filedata ubuntu:18.04
, filedata為數據卷容器的名字 - 在其他容器中使用 --volumes-from 來掛載 filedata 容器中的數據卷,如創建容器 test_db1並掛載filedata數據卷容器
docker run -it --volumes-from filedata --name test_db1 ubuntu:18.04
,進入容器后可以查看 /root/file是否存在 - 同理再創建test_db2
docker run -it --volumes-from filedata --name test_db2 ubuntu:18.04
, 進入任意容器后,在掛載點/root/file
下做部分操作,然后再其他容器中看是否做出響應
數據遷移、備份與恢復
- 數據備份:同樣是通過新創建容器對指定掛載點的數據做備份。拿此命令(可能比較長,請細品)來說
docker run --volumes-from filedata -v /root/backup:/root/file --name backup-container ubuntu:18.04 tar cvf /root/file/backup.tar /root/file
,分為以下幾步:
- 使用ubuntu:18.04鏡像,通過上文創建的filedata容器(其實上文中任意一個都ok,filedata,test_db1, test_db2)創建backup-container容器
- 將本地的
、root/backup
目錄掛載至容器的/root/file
- 將backup-container容器下的
/root/file
目錄壓縮為backup.tar並輸入至 容器的/root/file/
目錄下
結果: 本機的/root/backup
與數據卷容器 filedata 的/root/file
與 備份容器的/root/file
三者相互掛載,至此本地的/root/backup
目錄下就會出現backup.tar文件了,備份完成!
- 數據的遷移與恢復同理備份,都是通過數據卷或者數據卷容器進行掛載實現的。
容器間訪問
端口映射
- 指定本機端口8888訪問容器9999
docker run -idt -p --name testport2 8888:9999 ubuntu:18.04
- 映射到指定地址的指定端口 IP:HostPort:ContainerPort
docker run -itd -p 127.0.0.1:8888:9999 --name specific-map ubuntu:18.04
- 映射指定地址的任意端口 IP::ContainerPot, 映射本機的任意端口至容器的8899
docker run -idt -p 127.0.0.1::8899 --name any-map ubuntu:18.04
容器互聯
- link1 與link2 互聯
docker run -idt --name link1 ubuntu:18.04
anddocker run -idt --name link2 --link link1:link1-alias ubuntu:18.04
, 在進入容器后可以通過env 查看以link1_alias(鏈接的別名)