1. 程式人生 > >Docker從入門到實戰(四)

Docker從入門到實戰(四)

Docker 虛擬化

一步一步走,寫小白都能看懂的文章,將持續更新中,敬請期待!

Docker從入門到實戰(四)

Docker基礎

一:Docker基本操作

一般情況安裝Docker之後系統會自動創建一個Docker的用戶組,如果沒有創建可以手動創建
groupadd docker
把當前非root用戶加入group內,然後退出重新登陸就生效了(本例是新建了一個用戶cheng)
gpasswd -a cheng docker
service docker restart
技術分享圖片
切換當前會話到新group或者重啟X會話
newgrp – docker 或者 pkill X
註意這一步是必須的,否則因為groups命令獲取到的是緩存的組信息,剛添加的組信息未能生效,所以docker images 執行時同樣有錯,然後在終端中運行docker後按回車鍵,可以看到輸出的關於docker的使用基本說明。

技術分享圖片
Docker命令分為管理命令、鏡像命令、容器命令、倉庫命令、網路命令、數據卷命令、編排命令等,命令的分類在每次版本發布時都有調整,不過大同小異(下面以26個英文字母排序,幫助文檔請-h或者—help查看)

  1. 依附容器的docker attach命令
    中文意思是附加、貼上、系上等意思,所以dokcer attach主要的作用就是進入容器,這個容器和後面的docker exec類似但是完全不一樣。
    使用exit命令或者ctrl+C命令是停止容器,退出容器命令可使用ctrl+P,然後使用ctrl+Q命令,即可退出容器的虛擬終端,此時容器還在運行。
    官方不推薦使用docker attach命令進入開啟了交互模式的容器,docker attach的主要功能是查看信息,容器內部操作有更加方便的docker exec命令,將在稍後介紹。
  2. 構建鏡像的docker build 命令
    -c :控制cpu使用
    -f :選擇dockerfile名稱
    -m:設置構建內存上限
    -q:不顯示構建過程的一些信息
    -t:為構建的鏡像打上標簽
  3. 提交容器的docker commit命令
    -a:添加作者信息,方便維護
    -c:修改dockerfile指令,目前支持的有以下指令
    CMD |ENTRYPOINT |ENV |EXPOSE |LABEL |ONBUILD |USER |VOLUME |WORKDIR
    -m:類似git commit -m這樣,提交修改信息
    -p: 暫停正在commit的操作
  4. 復制文件到宿主機的docker cp 命令
    命令解釋如下:
    docker cp <containerID>:/file/path/within/container /host/path/target
  5. 創建容器的docker create 命令
    在docker容器狀態中有一種是created,表示容器已經創建,但是沒有啟動,它和stop不同,stop通常都是手動或者外部操作容器停止的,而created有可能是手動創建但是沒有成功啟動,created狀態的容器不占用內存和CPU資源。創建後的容器可以使用docker start containerID的方式啟動容器。
  6. 查看容器變化的docker diff命令
    docker diff 的語法如下:
    docker diff containerID
    docker diff命令主要用於顯示當前運行容器和鏡像的不同,docker diff的運行與容器的狀態無關,只是顯示文件差異
  7. 查看事件的docker events命令
    docker events涵蓋了幾乎全部docker事件,通過-f指定參數,還可以過濾不必要的事件,得到更精簡的事件信息
    使用說明如下:
    docker events -f container=<name or id>
    docker events -f image=<tag or id >
    docker events -f volume=<name or id>
    docker events -f network=<name or id>
    docker events -f daemon=<name or id>
    只有reload一個值,用於監控記錄docker守護進程的狀態
    其他還有
    docker events -f label=<key> or label=<key>=<value>
    docker events -f event=<event action>
    docker events -f type=<container or image or volume or network r daemon>
  8. 進入容器的docker exec命令
    docker exec主要用於進入容器內部進行操作的一個重要命令,比attach功能更強大,通過docker exec可以像使用ssh登陸服務器一樣操作容器,所以一般進入容器的命令都是使用docker exec而不是docker attach
    常用參數有以下幾個:
    -d:分離模式,在後臺運行的命令
    -i:交互模式
    -t:分配一個TTY
    -u:指定用戶和用戶組,格式:<name|uid>[:<group|gid>]
    使用exec命令進入容器內部就如同進入另一個機器一樣,並且使用exit命令,不會像attach那樣導致容器停止,所以非常適合容器內部操作
  9. 導出容器的dockerexport命令
    docker export命令用於導出本地存儲的容器和docker save類似(用於導出本地鏡像),docker export導出的容器通常為tar包,方便傳輸到其他地方
    使用方法有兩種:
    docker export -o containerName.tar containerName
    docker export containerName > containerName.tar
    使用docker export命令導出的容器並不會壓縮容器大小
  10. 查看鏡像歷史的docker history命令
    以ubuntu:14.04為例,查看鏡像歷史
    docker history ubuntu:14.04
  11. 查看本地鏡像的docker images命令
    docker images命令用於查看本地存儲的docker鏡像
    主要參數如下:
    -a:顯示所有鏡像,包括中間鏡像(懸掛鏡像),默認不顯示
    -f:過濾顯示,可選的值有
    docker images -f dangling=[true|false]
    docker images -f label=<key>[=<=value>]
    docker images -f before=(<image-name>[:tag] |<image-id> |<image@digest>)
    docker images -f since=(<image-name>[:tag] |<image-id> |<image@digest>)
    -q:只顯示ID
  12. 導入容器的docker import命令
    docker import命令和docker export命令相對,用於導入容器,導入後會變成鏡像,用法和docker export命令相似
    使用網絡地址導入
    docker import https;//example.com/container.tar
    通過管道導入
    cat exampleContainer.tgz |Docker import –message “New image imported from tarball”- exampleContainerlocal:newtag
    還可以直接導入本地tar包
    docker import /path/to/exapmpleContainer.tgz
    甚至可以從目錄導入
    sudo tar -c . |docker import – exampleContainerdir
  13. 查看docker信息得docker info命令
    這個大概是這麽多命令中最簡單易懂的命令了,-D參數顯示docker system的debug信息
    docker info -D
  14. 查看各項詳細信息的docker inspect命令
    inspect有檢閱,檢查的意思,該命令的用途是檢查容器或者鏡像詳細信息的一個命令
  15. 殺死容器的docker kill命令
    stop和kill的區別在於docker stop命令給容器中的進程發送SIGTERM信號,默認行為是會導致容器退出,當然,容器內程序可以捕獲該信號並自行處理,例如可以選擇忽略。而docker kill命令則是給容器的進程發送SIGKILL信號,該信號將會使容器必然退出。
  16. 導入鏡像的docker load命令
    docker load命令的作用是導入使用docker save導出的鏡像,和export、import負責容器的導出導入類似,save、load負責鏡像的導出導入。
    -i:指定導出文件
    例如: docker load -I ubuntu.tar
    -q:可以不顯示導入的一些信息,在一些腳本中可有效減少輸出幹擾
    還可以通過<符號導入,下面以一個之前導出的鏡像busybox為例
    docker load < busybox.tar.gz
  17. 登陸倉庫的docker login命令
    docker login命令時 一個登陸到Registry的命令,Registry是docker公司為了更方便鏡像流通而設計的一種鏡像倉庫,像手機上的應用商店一樣,用戶可以在上面發布鏡像和拉取鏡像,官方的docker hub還提供更高級的企業服務
    使用docker login命令直接登陸到docker hub
    使用docker login localhost:8080的方式可以登錄到第三方倉庫
    登陸信息均會保存在$HOME/.docker/config.json目錄下
    D-Bus Secret Service網址為https://github.com/docker/docker-credential-helpers/releases
    Apple OS X keychain網址為https://github.com/docker/docker-credential-helpers/releases
    Microsoft Windows Credential Manager網址為https://github.com/docker/docker-credential-helpers/releases
    在config.json中修改
    {
    “credStore”:“osxkeychain”
    }
  18. 登出倉庫的docker logout命令
    docker logout命令是登出命令,使用該命令可以登出倉庫,如果使用第三方證書存儲,只需要刪除證書文件以及config.json即可。
  19. 查看容器日誌的docker logs命令
    docker logs用於顯示容器的日誌,這一點和attach有點類似,不同的地方在於attach可以相對輸出更自由,用戶可以定制輸出內容,而logs則是根據容器命令輸出信息,是無交互的
    主要參數如下
    --details:顯示更詳細的日誌
    -f:持續輸出日誌
    --since<string>:顯示某字符串開始的日誌
    --tail<string>:顯示某字符串之前的日誌
    -t:顯示時間戳
  20. 管理網路的docker network命令
    docker network命令說明
    命令 說明
    network connect 連接一個容器到指定網路
    network create 創建一個網路
    network disconnect 指定一個網路斷開一個容器
    network inspect 顯示指定網絡詳細信息
    network ls 顯示全部docker網絡
    network rm 刪除指定網絡
    例如:docker netowork ls
  21. 管理節點的docker node命令
    docker node命令
    命令 說明
    node demote 將集群中的指定manager節點降權
    node inspect 顯示節點的詳細信息
    node update 更新節點屬性
    node ps 顯示正在運行的節點
    node ls 顯示集群的全部節點
    node rm 從集群中刪除指定節點
  22. 暫停容器的docker pause命令
    docker pause命令會暫停容器內的所有進程,此時,通過docker stats可以觀察到此時的資源使用情況是固定不變的,通過docker logs -f 也觀察不到日誌的進一步輸出
    命令格式如下:
    docker pause <container>
  23. 查看容器端口的docker port命令
    docker port命令用來輸出容器的端口信息,與docker ps 的顯示不同,該命令只會顯示”暴露”的端口,對於未指定的暴露端口不會顯示
  24. 查看本地容器信息的docker ps命令
    docker ps命令顯示當前正在運行的容器
    主要參數如下
    -a:顯示全部容器,包括各種狀態的容器,只要存在就顯示
    -f:添加過濾條件
    -n:顯示最近創建的幾個容器(包括所有狀態的容器,-l顯示最近創建的一個,遇到持續輸出的信息還可以使用—no-trunc進行追加)
    -q:只顯示ID
    -s:顯示容器大小
    例:刪除所有已經停止的容器
    docker rm $(docker ps -a -q)
    刪除所有容器(包括運行中的容器)
    docker kill $(docker ps -q);docker rm $(docker ps -a -q)
    殺死所有正在運行的容器
    docker kill $(docker ps -a -q)
  25. 拉取鏡像的docker pull命令
    docker pull命令為拉取鏡像的命令,通過該命令不僅可以拉取docker hub的鏡像,還可以通過指定倉庫地址拉取私有倉庫鏡像
    使用docker pull -a 會把所有標簽都拉取到本地,使用—disable-content-trust=false會在拉取時校驗鏡像,保證傳輸安全,默認是關閉的
  26. 推送鏡像的docker push命令
    docker push命令的作用是把本地的鏡像推送到鏡像倉庫,和docker pull一樣,使用—disable-content-trust=false會在拉取時校驗鏡像,保證傳輸安全,默認是關閉的
    使用此命令時,如果不指定tag會默認把該鏡像的全部鏡像都推送到倉庫。例如本地存在ubuntu:14.04和ubuntu:16.04兩個鏡像,如果使用docker push ubuntu命令推送會把這兩個鏡像都推送到倉庫
  27. 重命名容器的docker rename命令
    該命令可以在不改變容器狀態的情況下重命名容器,格式為:docker rename<舊容器名><新容器名>,該命令一次只能更改一個容器名稱
    該命令只能更改容器名稱,鏡像重命名會用docker tag命令
  28. 重啟容器的docker restart命令
    此命令用來重啟容器(不是重啟docker,重啟docker可以使用systemctl restart docker命令或者service docker restart命令重啟docker),使用docker restart <Contailner1> <Contailner2>命令可以重啟多個容器
    -t參數可以在重啟設置等待容器停止的時間,如果容器在指定秒數之內沒有停止,docker就會執行docker kill操作殺死容器,以便完成重啟操作
  29. 刪除容器的docker rm 命令
    docker rm <Container Name / Container ID>命令可以刪除已經停止的容器,可以刪除一個或多個容器
    -f:直接刪除一個正在運行的容器
    -l:刪除容器與其他容器的關聯,但是會保留容器
    -v:刪除容器的數據卷
  30. 刪除鏡像的docker rmi命令
    此命令時刪除鏡像的命令,刪除鏡像時最好指定鏡像的tag,如果不指定會默認刪除鏡像的latest標簽。該命令同樣可以在後面接上多個鏡像名稱,刪除多個鏡像
    使用docker rmi命令刪除鏡像時,要確保沒有容器使用該鏡像也就是沒有容器是使用該鏡像啟動的,才可以刪除,否則會報錯
    -f:強制刪除鏡像,即便有容器正在使用該鏡像,但是這樣只會刪除鏡像標簽,不會影響正在運行的容器,實際上只有容器還在運行,鏡像就不會被真正刪除,用戶使用docker commit操作提交容器為鏡像,可以恢復鏡像。
  31. 運行容器的docker run命令
    此命令參數超級多,可docker run –help查看
  32. 導出鏡像的docker save命令
    此命令是用來導出鏡像的,後面可以連接多個鏡像,默認輸出是STDOUT,意味著需要指定一個目標文件,可以通過-o參數來指定
    例:導出一個鏡像
    docker save -o ubuntu.tar ubuntu:14.04
    導出多個容器
    docker save -o nginx_php.tar nginx:1.9 php:7.0-fpm
    除了-o參數,還可以使用>符號導出鏡像
    docker save ubuntu:14.04 > ubuntu.tar
  33. 搜索鏡像的docker search命令
    -f:可以定制返回信息,可選參數有以下三個
    is-automated=(true|false)
    is-official=(true|false)
    stars=<number>
    例如:搜索ubuntu的官方鏡像
    搜索stars超過20並且是官方構建的ubuntu鏡像
    docker search -f stars=20 -f is-official=true ubuntu
    搜索stars超過20並且是自動構建的ubuntu鏡像
    docker search -f stars=20 -f is-automated=true ubuntu
    還有如—limit int這樣的參數用來限制顯示數量,默認是返回25個結果
  34. 管理docker service命令
    docker service命令的作用是管理集群中的服務,需要與docker swarm配合使用。使用docker service時,主機必須是swarm的manager
    命令 說明
    service create 創建service
    service inspect 取得service的詳細信息
    service ps 取得service的任務信息
    service ls 取得service的列表信息
    service rm 刪除service
    service scale 調整service的replicas
    service update 更新service
  35. 啟動容器的docker start命令
    此命令是啟動一個或多個停止狀態的容器,docker start命令後邊可以是容器名稱也可以是容器ID
    -a:顯示STDOUT/STDERR信息
    -i:顯示STDIN信息
  36. 查看容器的docker stats命令
    此命令可以查看任何狀態下的容器狀態,該命令輸出的內容是實時更新的,取消查看時使用Ctrl+c即可
    不使用任何參數,會顯示所有正在運行的容器狀態,要顯示全部(包括非運行狀態)的容器狀態,可以添加-a參數
    只想查看某一時刻的狀態,可以使用--no-stream參數,這樣終端輸出結束後會自動返回可交互shell界面
    例:docker stats –-no-stream nginx
  37. 停止容器的docker stop命令
    此命令會停止一個或者多個正在運行的容器,docker stop命令會向容器發送正常的信號,而docker kill命令會強制終止容器進程,後者可能造成數據丟失
  38. 管理集群的docker swarm命令
    docker swarm與前面的docker node,docker service命令共同組成集群管理編排的“三劍客”
    操作 詳細說明
    init 初始化集群
    join 以node(worker)或者manager的身份加入集群
    join-token 管理join-token
    update 更新集群
    leave 退出集群
  39. 設置鏡像標簽的docker tag命令
    docker tag命令可以給鏡像重命名,在docker中鏡像、容器、網路、數據卷等組件在運行時都會獲取一個ID,這個ID是獨一無二的,但是這個ID太長了,不容易記憶,所以有了tag的概念,給鏡像打上標簽
    例如:給一個沒有打標簽的鏡像打上標簽
    docker tag a70c7fad1812 myusername/images:default
    還可以只修改鏡像標簽,不改動名稱
    docker tag myusername/images:default myusername/images:new
    常用的情況還有修改名稱以及標簽
    docker tagmyusername/images:default myusername/images-new:latest
  40. 查看容器進程的docker top命令
    此命令與linux下的top命令一樣,使用docker top <Container ID/Name>可以查看指定容器內正在運行的進程
  41. 恢復暫停容器的docker unpause命令
    這個與前面的docker pause命令是相對的
  42. 更新容器的docker update命令
    對容器的是指額更新時可以使用docker update命令,使用時容器不需要停止或者重啟。需要註意的是,這裏說的容器設置是指容器啟動時添加的參數,例如:使用docker run命令時設置cpu限制,可以使用docker update命令取消
    在docker update命令的參數中,大部分與docker run命令的參數相同,唯一不同的是—restart參數,添加該參數是不會立刻修改容器配置,而是在未來容器重啟時生效
  43. 查看docker版本的docker version命令
    查看docker版本,使用-f參數可以格式化輸出,例如:docker version -f ‘{{.Server}}‘
    常用的是docker version
  44. 管理數據卷的docker volume命令
    此命令是用來管理數據卷,數據卷是容器數據持久化的一個組件。
    ls:可以查看本機的全部數據卷
    rm:刪除不需要的數據卷(數據卷與容器的生命周期完全獨立,所以容器刪除後數據卷並不會刪除,時間久了數據卷就會越來越多)
    inspect:查看數據卷的詳細信息
    create:創建一個數據卷
    prune:刪除所有未使用的卷
  45. 設置等待的docker wait命令
    執行docker wait命令後,該命令會“hang”在當前終端,直到容器停止,此時會打印出容器的退出碼。該命令一般會用在容器監控、異常捕捉方面。

    二:啟動第一個容器

    第一件事就是打印Hello World,就像我們學Python一樣,先開是學寫Hello World,下面直接運行hello-world鏡像,使用docker run命令是如果本地沒有該鏡像,那麽會自動從Docker Hub中拉取鏡像
    docker run --rm hello-world
    這裏使用的—rm表示容器退出後自動刪除該容器
    運行後信息如下
    Hello from Docker!
    This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:

  1. The Docker client contacted the Docker daemon.
  2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
  3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
  4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
https://cloud.docker.com/

For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/
這就是hello-world輸出的內容,顯示這些信息則說明docker運行正常了

三:構建第一個docker鏡像

vi Dockerfile
FROM alpine
CMD "echo" "Hello World !”
保存文件,打開終端,使用docker build命令構建第一個鏡像
docker build -t hello .
-t 參數表示給構建的鏡像打上名為hello的標簽,構建完成後直接運行
docker run –-rm hello
如此就完成了一個鏡像的構建與運行
技術分享圖片

Docker從入門到實戰(四)