一步一步走,寫小白都能看懂的文章,將持續更新中,敬請期待!php
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查看)node
- 依附容器的docker attach命令
中文意思是附加、貼上、繫上等意思,因此dokcer attach主要的做用就是進入容器,這個容器和後面的docker exec相似可是徹底不同。
使用exit命令或者ctrl+C命令是中止容器,退出容器命令可以使用ctrl+P,而後使用ctrl+Q命令,便可退出容器的虛擬終端,此時容器還在運行。
官方不推薦使用docker attach命令進入開啓了交互模式的容器,docker attach的主要功能是查看信息,容器內部操做有更加方便的docker exec命令,將在稍後介紹。
- 構建鏡像的docker build 命令
-c :控制cpu使用
-f :選擇dockerfile名稱
-m:設置構建內存上限
-q:不顯示構建過程的一些信息
-t:爲構建的鏡像打上標籤
- 提交容器的docker commit命令
-a:添加做者信息,方便維護
-c:修改dockerfile指令,目前支持的有如下指令
CMD |ENTRYPOINT |ENV |EXPOSE |LABEL |ONBUILD |USER |VOLUME |WORKDIR
-m:相似git commit -m這樣,提交修改信息
-p: 暫停正在commit的操做
- 複製文件到宿主機的docker cp 命令
命令解釋以下:
docker cp <containerID>:/file/path/within/container /host/path/target
- 建立容器的docker create 命令
在docker容器狀態中有一種是created,表示容器已經建立,可是沒有啓動,它和stop不一樣,stop一般都是手動或者外部操做容器中止的,而created有多是手動建立可是沒有成功啓動,created狀態的容器不佔用內存和CPU資源。建立後的容器可使用docker start containerID的方式啓動容器。
- 查看容器變化的docker diff命令
docker diff 的語法以下:
docker diff containerID
docker diff命令主要用於顯示當前運行容器和鏡像的不一樣,docker diff的運行與容器的狀態無關,只是顯示文件差別
- 查看事件的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>
- 進入容器的docker exec命令
docker exec主要用於進入容器內部進行操做的一個重要命令,比attach功能更強大,經過docker exec能夠像使用ssh登錄服務器同樣操做容器,因此通常進入容器的命令都是使用docker exec而不是docker attach
經常使用參數有如下幾個:
-d:分離模式,在後臺運行的命令
-i:交互模式
-t:分配一個TTY
-u:指定用戶和用戶組,格式:<name|uid>[:<group|gid>]
使用exec命令進入容器內部就如同進入另外一個機器同樣,而且使用exit命令,不會像attach那樣致使容器中止,因此很是適合容器內部操做
- 導出容器的docker export命令
docker export命令用於導出本地存儲的容器和docker save相似(用於導出本地鏡像),docker export導出的容器一般爲tar包,方便傳輸到其餘地方
使用方法有兩種:
docker export -o containerName.tar containerName
docker export containerName > containerName.tar
使用docker export命令導出的容器並不會壓縮容器大小
- 查看鏡像歷史的docker history命令
以ubuntu:14.04爲例,查看鏡像歷史
docker history ubuntu:14.04
- 查看本地鏡像的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
- 導入容器的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
- 查看docker信息得docker info命令
這個大概是這麼多命令中最簡單易懂的命令了,-D參數顯示docker system的debug信息
docker info -D
- 查看各項詳細信息的docker inspect命令
inspect有檢閱,檢查的意思,該命令的用途是檢查容器或者鏡像詳細信息的一個命令
- 殺死容器的docker kill命令
stop和kill的區別在於docker stop命令給容器中的進程發送SIGTERM信號,默認行爲是會致使容器退出,固然,容器內程序能夠捕獲該信號並自行處理,例如能夠選擇忽略。而docker kill命令則是給容器的進程發送SIGKILL信號,該信號將會使容器必然退出。
- 導入鏡像的docker load命令
docker load命令的做用是導入使用docker save導出的鏡像,和export、import負責容器的導出導入相似,save、load負責鏡像的導出導入。
-i:指定導出文件
例如: docker load -I ubuntu.tar
-q:能夠不顯示導入的一些信息,在一些腳本中可有效減小輸出干擾
還能夠經過<符號導入,下面以一個以前導出的鏡像busybox爲例
docker load < busybox.tar.gz
- 登錄倉庫的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」
}
- 登出倉庫的docker logout命令
docker logout命令是登出命令,使用該命令能夠登出倉庫,若是使用第三方證書存儲,只須要刪除證書文件以及config.json便可。
- 查看容器日誌的docker logs命令
docker logs用於顯示容器的日誌,這一點和attach有點相似,不一樣的地方在於attach能夠相對輸出更自由,用戶能夠定製輸出內容,而logs則是根據容器命令輸出信息,是無交互的
主要參數以下
--details:顯示更詳細的日誌
-f:持續輸出日誌
--since<string>:顯示某字符串開始的日誌
--tail<string>:顯示某字符串以前的日誌
-t:顯示時間戳
- 管理網路的docker network命令
docker network命令說明
命令 說明
network connect 鏈接一個容器到指定網路
network create 建立一個網路
network disconnect 指定一個網路斷開一個容器
network inspect 顯示指定網絡詳細信息
network ls 顯示所有docker網絡
network rm 刪除指定網絡
例如:docker netowork ls
- 管理節點的docker node命令
docker node命令
命令 說明
node demote 將集羣中的指定manager節點降權
node inspect 顯示節點的詳細信息
node update 更新節點屬性
node ps 顯示正在運行的節點
node ls 顯示集羣的所有節點
node rm 從集羣中刪除指定節點
- 暫停容器的docker pause命令
docker pause命令會暫停容器內的全部進程,此時,經過docker stats能夠觀察到此時的資源使用狀況是固定不變的,經過docker logs -f 也觀察不到日誌的進一步輸出
命令格式以下:
docker pause <container>
- 查看容器端口的docker port命令
docker port命令用來輸出容器的端口信息,與docker ps 的顯示不一樣,該命令只會顯示」暴露」的端口,對於未指定的暴露端口不會顯示
- 查看本地容器信息的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)
- 拉取鏡像的docker pull命令
docker pull命令爲拉取鏡像的命令,經過該命令不只能夠拉取docker hub的鏡像,還能夠經過指定倉庫地址拉取私有倉庫鏡像
使用docker pull -a 會把全部標籤都拉取到本地,使用—disable-content-trust=false會在拉取時校驗鏡像,保證傳輸安全,默認是關閉的
- 推送鏡像的docker push命令
docker push命令的做用是把本地的鏡像推送到鏡像倉庫,和docker pull同樣,使用—disable-content-trust=false會在拉取時校驗鏡像,保證傳輸安全,默認是關閉的
使用此命令時,若是不指定tag會默認把該鏡像的所有鏡像都推送到倉庫。例如本地存在ubuntu:14.04和ubuntu:16.04兩個鏡像,若是使用docker push ubuntu命令推送會把這兩個鏡像都推送到倉庫
- 重命名容器的docker rename命令
該命令能夠在不改變容器狀態的狀況下重命名容器,格式爲:docker rename<舊容器名><新容器名>,該命令一次只能更改一個容器名稱
該命令只能更改容器名稱,鏡像重命名會用docker tag命令
- 重啓容器的docker restart命令
此命令用來重啓容器(不是重啓docker,重啓docker可使用systemctl restart docker命令或者service docker restart命令重啓docker),使用docker restart <Contailner1> <Contailner2>命令能夠重啓多個容器
-t參數能夠在重啓設置等待容器中止的時間,若是容器在指定秒數以內沒有中止,docker就會執行docker kill操做殺死容器,以便完成重啓操做
- 刪除容器的docker rm 命令
docker rm <Container Name / Container ID>命令能夠刪除已經中止的容器,能夠刪除一個或多個容器
-f:直接刪除一個正在運行的容器
-l:刪除容器與其餘容器的關聯,可是會保留容器
-v:刪除容器的數據卷
- 刪除鏡像的docker rmi命令
此命令時刪除鏡像的命令,刪除鏡像時最好指定鏡像的tag,若是不指定會默認刪除鏡像的latest標籤。該命令一樣能夠在後面接上多個鏡像名稱,刪除多個鏡像
使用docker rmi命令刪除鏡像時,要確保沒有容器使用該鏡像也就是沒有容器是使用該鏡像啓動的,才能夠刪除,不然會報錯
-f:強制刪除鏡像,即使有容器正在使用該鏡像,可是這樣只會刪除鏡像標籤,不會影響正在運行的容器,實際上只有容器還在運行,鏡像就不會被真正刪除,用戶使用docker commit操做提交容器爲鏡像,能夠恢復鏡像。
- 運行容器的docker run命令
此命令參數超級多,可docker run –help查看
- 導出鏡像的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
- 搜索鏡像的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個結果
- 管理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
- 啓動容器的docker start命令
此命令是啓動一個或多箇中止狀態的容器,docker start命令後邊能夠是容器名稱也能夠是容器ID
-a:顯示STDOUT/STDERR信息
-i:顯示STDIN信息
- 查看容器的docker stats命令
此命令能夠查看任何狀態下的容器狀態,該命令輸出的內容是實時更新的,取消查看時使用Ctrl+c便可
不使用任何參數,會顯示全部正在運行的容器狀態,要顯示所有(包括非運行狀態)的容器狀態,能夠添加-a參數
只想查看某一時刻的狀態,可使用--no-stream參數,這樣終端輸出結束後會自動返回可交互shell界面
例:docker stats –-no-stream nginx
- 中止容器的docker stop命令
此命令會中止一個或者多個正在運行的容器,docker stop命令會向容器發送正常的信號,而docker kill命令會強制終止容器進程,後者可能形成數據丟失
- 管理集羣的docker swarm命令
docker swarm與前面的docker node,docker service命令共同組成集羣管理編排的「三劍客」
操做 詳細說明
init 初始化集羣
join 以node(worker)或者manager的身份加入集羣
join-token 管理join-token
update 更新集羣
leave 退出集羣
- 設置鏡像標籤的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
- 查看容器進程的docker top命令
此命令與linux下的top命令同樣,使用docker top <Container ID/Name>能夠查看指定容器內正在運行的進程
- 恢復暫停容器的docker unpause命令
這個與前面的docker pause命令是相對的
- 更新容器的docker update命令
對容器的是指額更新時可使用docker update命令,使用時容器不須要中止或者重啓。須要注意的是,這裏說的容器設置是指容器啓動時添加的參數,例如:使用docker run命令時設置cpu限制,可使用docker update命令取消
在docker update命令的參數中,大部分與docker run命令的參數相同,惟一不一樣的是—restart參數,添加該參數是不會馬上修改容器配置,而是在將來容器重啓時生效
- 查看docker版本的docker version命令
查看docker版本,使用-f參數能夠格式化輸出,例如:docker version -f '{{.Server}}'
經常使用的是docker version
- 管理數據卷的docker volume命令
此命令是用來管理數據卷,數據卷是容器數據持久化的一個組件。
ls:能夠查看本機的所有數據卷
rm:刪除不須要的數據卷(數據卷與容器的生命週期徹底獨立,因此容器刪除後數據卷並不會刪除,時間久了數據卷就會愈來愈多)
inspect:查看數據卷的詳細信息
create:建立一個數據卷
prune:刪除全部未使用的卷
- 設置等待的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
- The Docker client contacted the Docker daemon.
- The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
- The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
- 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
如此就完成了一個鏡像的構建與運行
shell