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查看)
中文意思是附加、貼上、系上等意思,所以dokcer attach主要的作用就是進入容器,這個容器和后面的docker exec類似但是完全不一樣。
使用exit命令或者ctrl+C命令是停止容器,退出容器命令可使用ctrl+P,然后使用ctrl+Q命令,即可退出容器的虛擬終端,此時容器還在運行。
官方不推薦使用docker attach命令進入開啟了交互模式的容器,docker attach的主要功能是查看信息,容器內部操作有更加方便的docker exec命令,將在稍后介紹。
-c :控制cpu使用
-f :選擇dockerfile名稱
-m:設置構建內存上限
-q:不顯示構建過程的一些信息
-t:為構建的鏡像打上標簽
-a:添加作者信息,方便維護
-c:修改dockerfile指令,目前支持的有以下指令
CMD |ENTRYPOINT |ENV |EXPOSE |LABEL |ONBUILD |USER |VOLUME |WORKDIR
-m:類似git commit -m這樣,提交修改信息
-p: 暫停正在commit的操作
命令解釋如下:
docker cp <containerID>:/file/path/within/container /host/path/target
在docker容器狀態中有一種是created,表示容器已經創建,但是沒有啟動,它和stop不同,stop通常都是手動或者外部操作容器停止的,而created有可能是手動創建但是沒有成功啟動,created狀態的容器不占用內存和CPU資源。創建后的容器可以使用docker start containerID的方式啟動容器。
docker diff 的語法如下:
docker diff containerID
docker diff命令主要用于顯示當前運行容器和鏡像的不同,docker diff的運行與容器的狀態無關,只是顯示文件差異
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主要用于進入容器內部進行操作的一個重要命令,比attach功能更強大,通過docker exec可以像使用ssh登陸服務器一樣操作容器,所以一般進入容器的命令都是使用docker exec而不是docker attach
常用參數有以下幾個:
-d:分離模式,在后臺運行的命令
-i:交互模式
-t:分配一個TTY
-u:指定用戶和用戶組,格式:<name|uid>[:<group|gid>]
使用exec命令進入容器內部就如同進入另一個機器一樣,并且使用exit命令,不會像attach那樣導致容器停止,所以非常適合容器內部操作
docker export命令用于導出本地存儲的容器和docker save類似(用于導出本地鏡像),docker export導出的容器通常為tar包,方便傳輸到其他地方
使用方法有兩種:
docker export -o containerName.tar containerName
docker export containerName > containerName.tar
使用docker export命令導出的容器并不會壓縮容器大小
以ubuntu:14.04為例,查看鏡像歷史
docker history ubuntu:14.04
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 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
這個大概是這么多命令中最簡單易懂的命令了,-D參數顯示docker system的debug信息
docker info -D
inspect有檢閱,檢查的意思,該命令的用途是檢查容器或者鏡像詳細信息的一個命令
stop和kill的區別在于docker stop命令給容器中的進程發送SIGTERM信號,默認行為是會導致容器退出,當然,容器內程序可以捕獲該信號并自行處理,例如可以選擇忽略。而docker kill命令則是給容器的進程發送SIGKILL信號,該信號將會使容器必然退出。
docker load命令的作用是導入使用docker save導出的鏡像,和export、import負責容器的導出導入類似,save、load負責鏡像的導出導入。
-i:指定導出文件
例如: docker load -I ubuntu.tar
-q:可以不顯示導入的一些信息,在一些腳本中可有效減少輸出干擾
還可以通過<符號導入,下面以一個之前導出的鏡像busybox為例
docker load < busybox.tar.gz
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命令是登出命令,使用該命令可以登出倉庫,如果使用第三方證書存儲,只需要刪除證書文件以及config.json即可。
docker logs用于顯示容器的日志,這一點和attach有點類似,不同的地方在于attach可以相對輸出更自由,用戶可以定制輸出內容,而logs則是根據容器命令輸出信息,是無交互的
主要參數如下
--details:顯示更詳細的日志
-f:持續輸出日志
--since<string>:顯示某字符串開始的日志
--tail<string>:顯示某字符串之前的日志
-t:顯示時間戳
docker network命令說明
命令 說明
network connect 連接一個容器到指定網路
network create 創建一個網路
network disconnect 指定一個網路斷開一個容器
network inspect 顯示指定網絡詳細信息
network ls 顯示全部docker網絡
network rm 刪除指定網絡
例如:docker netowork ls
docker node命令
命令 說明
node demote 將集群中的指定manager節點降權
node inspect 顯示節點的詳細信息
node update 更新節點屬性
node ps 顯示正在運行的節點
node ls 顯示集群的全部節點
node rm 從集群中刪除指定節點
docker pause命令會暫停容器內的所有進程,此時,通過docker stats可以觀察到此時的資源使用情況是固定不變的,通過docker logs -f 也觀察不到日志的進一步輸出
命令格式如下:
docker pause <container>
docker port命令用來輸出容器的端口信息,與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 hub的鏡像,還可以通過指定倉庫地址拉取私有倉庫鏡像
使用docker pull -a 會把所有標簽都拉取到本地,使用—disable-content-trust=false會在拉取時校驗鏡像,保證傳輸安全,默認是關閉的
docker push命令的作用是把本地的鏡像推送到鏡像倉庫,和docker pull一樣,使用—disable-content-trust=false會在拉取時校驗鏡像,保證傳輸安全,默認是關閉的
使用此命令時,如果不指定tag會默認把該鏡像的全部鏡像都推送到倉庫。例如本地存在ubuntu:14.04和ubuntu:16.04兩個鏡像,如果使用docker push ubuntu命令推送會把這兩個鏡像都推送到倉庫
該命令可以在不改變容器狀態的情況下重命名容器,格式為:docker rename<舊容器名><新容器名>,該命令一次只能更改一個容器名稱
該命令只能更改容器名稱,鏡像重命名會用docker tag命令
此命令用來重啟容器(不是重啟docker,重啟docker可以使用systemctl restart docker命令或者service docker restart命令重啟docker),使用docker restart <Contailner1> <Contailner2>命令可以重啟多個容器
-t參數可以在重啟設置等待容器停止的時間,如果容器在指定秒數之內沒有停止,docker就會執行docker kill操作殺死容器,以便完成重啟操作
docker rm <Container Name / Container ID>命令可以刪除已經停止的容器,可以刪除一個或多個容器
-f:直接刪除一個正在運行的容器
-l:刪除容器與其他容器的關聯,但是會保留容器
-v:刪除容器的數據卷
此命令時刪除鏡像的命令,刪除鏡像時最好指定鏡像的tag,如果不指定會默認刪除鏡像的latest標簽。該命令同樣可以在后面接上多個鏡像名稱,刪除多個鏡像
使用docker rmi命令刪除鏡像時,要確保沒有容器使用該鏡像也就是沒有容器是使用該鏡像啟動的,才可以刪除,否則會報錯
-f:強制刪除鏡像,即便有容器正在使用該鏡像,但是這樣只會刪除鏡像標簽,不會影響正在運行的容器,實際上只有容器還在運行,鏡像就不會被真正刪除,用戶使用docker commit操作提交容器為鏡像,可以恢復鏡像。
此命令參數超級多,可docker run –help查看
此命令是用來導出鏡像的,后面可以連接多個鏡像,默認輸出是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
-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 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命令后邊可以是容器名稱也可以是容器ID
-a:顯示STDOUT/STDERR信息
-i:顯示STDIN信息
此命令可以查看任何狀態下的容器狀態,該命令輸出的內容是實時更新的,取消查看時使用Ctrl+c即可
不使用任何參數,會顯示所有正在運行的容器狀態,要顯示全部(包括非運行狀態)的容器狀態,可以添加-a參數
只想查看某一時刻的狀態,可以使用--no-stream參數,這樣終端輸出結束后會自動返回可交互shell界面
例:docker stats –-no-stream nginx
此命令會停止一個或者多個正在運行的容器,docker stop命令會向容器發送正常的信號,而docker kill命令會強制終止容器進程,后者可能造成數據丟失
docker swarm與前面的docker node,docker service命令共同組成集群管理編排的“三劍客”
操作 詳細說明
init 初始化集群
join 以node(worker)或者manager的身份加入集群
join-token 管理join-token
update 更新集群
leave 退出集群
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
此命令與linux下的top命令一樣,使用docker top <Container ID/Name>可以查看指定容器內正在運行的進程
這個與前面的docker pause命令是相對的
對容器的是指額更新時可以使用docker update命令,使用時容器不需要停止或者重啟。需要注意的是,這里說的容器設置是指容器啟動時添加的參數,例如:使用docker run命令時設置cpu限制,可以使用docker update命令取消
在docker update命令的參數中,大部分與docker run命令的參數相同,唯一不同的是—restart參數,添加該參數是不會立刻修改容器配置,而是在未來容器重啟時生效
查看docker版本,使用-f參數可以格式化輸出,例如:docker version -f '{{.Server}}'
常用的是docker version
此命令是用來管理數據卷,數據卷是容器數據持久化的一個組件。
ls:可以查看本機的全部數據卷
rm:刪除不需要的數據卷(數據卷與容器的生命周期完全獨立,所以容器刪除后數據卷并不會刪除,時間久了數據卷就會越來越多)
inspect:查看數據卷的詳細信息
create:創建一個數據卷
prune:刪除所有未使用的卷
執行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:
(amd64)
executable that produces the output you are currently reading.
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
如此就完成了一個鏡像的構建與運行
轉載于:https://blog.51cto.com/12943999/2073654
總結
以上是生活随笔為你收集整理的Docker从入门到实战(四)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: svnsync备份
- 下一篇: 如何成为一个Java高薪架构师?