用前端姿式玩docker【一】Docker通俗理解經常使用功能彙總與操做埋坑

目錄

前言

首先一句話表達我的對docker的理解:與傳統虛擬技術基於硬件及物理資源的虛擬化相比,Docker更加輕量化,docker爲基於操做系統或內核級別的虛擬化,而且提供了從各類機制與操做以知足從開發環境到生產環境的各類定製化須要。
我的認爲對前端而言,docker的意義在於:知足了前端環境的構建便利性與一致性的同時,下降了FE上手linux以及虛擬化技術的難度,同時docker借鑑了git的部分優勢,更便於類比進行理解。
Docker爲什麼如此好玩 !!! 自此開始分享前端工程化與docker相結合的各類玩法與姿式!!關於docker的FE相關環境也會及時更新到github上(頂部有傳送門),請持續關注
坑會繼續挖繼續填,持續更新中。。。
首先記錄一下常規操做:html

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的官方源才能夠。
  • 解決慢的問題: 一、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 :臨時數據卷,只存在於內存中linux

數據卷

  • 啓動容器,並將本機目錄掛在到容器的指定目錄 docker run -idt -P --name web --mount type=bind,source=/root/file,destination=/root ubuntu:18.04
  • 多容器共享, 使用數據卷宗器(也是一個容器)供容器與容器間通訊,我的理解相似橋接的模式
  1. 建立數據卷容器,而且在/root/file 建立一個數據卷 docker run -it -v /root/file --name filedata ubuntu:18.04, filedata爲數據卷容器的名字
  2. 在其餘容器中使用 --volumes-from 來掛載 filedata 容器中的數據卷,如建立容器 test_db1並掛載filedata數據卷容器 docker run -it --volumes-from filedata --name test_db1 ubuntu:18.04,進入容器後能夠查看 /root/file是否存在
  3. 同理再建立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,分爲如下幾步:
  1. 使用ubuntu:18.04鏡像,經過上文建立的filedata容器(其實上文中任意一個都ok,filedata,test_db1, test_db2)建立backup-container容器
  2. 將本地的、root/backup 目錄掛載至容器的/root/file
  3. 將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 and docker run -idt --name link2 --link link1:link1-alias ubuntu:18.04, 在進入容器後能夠經過env 查看以link1_alias(連接的別名)
相關文章
相關標籤/搜索