Docker從入門到實戰(四)

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

Docker從入門到實戰(四)

Docker基礎

一:Docker基本操做

通常狀況安裝Docker以後系統會自動建立一個Docker的用戶組,若是沒有建立能夠手動建立
groupadd docker
把當前非root用戶加入group內,而後退出從新登錄就生效了(本例是新建了一個用戶cheng)
gpasswd -a cheng docker
service docker restart
Docker從入門到實戰(四)
切換當前會話到新group或者重啓X會話
newgrp – docker 或者 pkill X
注意這一步是必須的,不然由於groups命令獲取到的是緩存的組信息,剛添加的組信息未能生效,因此docker images 執行時一樣有錯,而後在終端中運行docker後按回車鍵,能夠看到輸出的關於docker的使用基本說明。
Docker從入門到實戰(四)
Docker命令分爲管理命令、鏡像命令、容器命令、倉庫命令、網路命令、數據卷命令、編排命令等,命令的分類在每次版本發佈時都有調整,不過大同小異(下面以26個英文字母排序,幫助文檔請-h或者—help查看)node

  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. 導出容器的docker export命令
    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.linux

To generate this message, Docker took the following steps:nginx

  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 bashgit

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

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

三:構建第一個docker鏡像

vi Dockerfile
FROM alpine
CMD "echo" "Hello World !」
保存文件,打開終端,使用docker build命令構建第一個鏡像
docker build -t hello .
-t 參數表示給構建的鏡像打上名爲hello的標籤,構建完成後直接運行
docker run –-rm hello
如此就完成了一個鏡像的構建與運行
Docker從入門到實戰(四)shell

相關文章
相關標籤/搜索