容器是Docker的另外一個核心概念。
簡單地說,容器是鏡像的一個運行實例,所不一樣的是,它帶有額外的可寫文件層。
若是認爲虛擬機是模擬運行的一整套操做系統(提供了運行態環境和其餘系統環境)和跑在上面的應用。那麼Docker容器就是獨立運行的一個或一組應用,以及它們的必需運行環境。
本文將具體介紹圍繞容器的重要操做,包括建立一個容器、啓動容器、終止一個容器、進入容器內執行操做、刪除容器和經過導入導出容器來實現容器遷移等。docker
Docker的容器十分輕量級,用戶能夠隨時建立或刪除容器。ubuntu
可使用Docker create命令新建一個容器,例如:bash
[root@gavin ~]# sudo docker create -it ubuntu Unable to find image 'ubuntu:latest' locally latest: Pulling from library/ubuntu 5b7339215d1d: Pull complete 14ca88e9f672: Pull complete a31c3b1caad4: Pull complete b054a26005b7: Pull complete Digest: sha256:9b1702dcfe32c873a770a32cfd306dd7fc1c4fd134adfb783db68defc8894b3c Status: Downloaded newer image for ubuntu:latest c03bb46b440ca9c6b5fe9b941f38005ad08558497cb6f3e6613ccfcdadc7dd5a
當鏡像不存在時會先下載鏡像再建立容器。
使用docker create命令新建的容器處於中止狀態,可使用docker start命令來啓動它。工具
啓動容器有兩種方式,一種是基於鏡像新建一個容器並啓動,另一個是將在終止狀態(stopped)的容器從新啓動。所須要的命令主要爲docker run,等價於先執行docker create命令,再執行docker start命令。
例如,下面的命令輸出一個「Hello World」,以後容器自動終止:學習
[root@gavin /]# sudo docker run ubuntu /bin/echo 'Hello World'
Hello World
這跟在本地直接執行/bin/echo 'Hello World'幾乎感受不出任何區別。
當利用docker run來建立並啓動容器時,Docker在後臺運行的標準操做包括:spa
下面的命令則啓動一個bash終端,容許用戶進行交互:操作系統
[root@gavin /]# sudo docker run -t -i ubuntu /bin/bash
root@5380e1ecc9c8:/#
其中,-t選項讓Docker分配一個僞終端(pseudo-ty)並綁定到容器的標準輸入上,-i則讓容器的標準輸入保持打開。
在交互模式下,用戶能夠經過所建立的終端來輸入命令,例如:3d
root@5380e1ecc9c8:/# pwd / root@5380e1ecc9c8:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@5380e1ecc9c8:/# ps PID TTY TIME CMD 1 pts/0 00:00:00 bash 11 pts/0 00:00:00 ps
在容器內用ps命令查看進程,能夠看到,只運行了bash應用,並無運行其餘不須要的進程。
用戶能夠按Ctrl+d或輸入exit命令來退出容器:rest
root@5380e1ecc9c8:/# exit
exit
對於所建立的bash容器,當使用exit命令退出以後,該容器就自動處於終止狀態了。這是由於對於Docker容器來講,當運行的應用(此處例子中爲bash)退出後,容器也就沒有繼續運行的必要了。code
更多的時候,須要讓Docker容器在後臺以守護態(Daemonized)形式運行。用戶能夠過添加-d參數來實現。
例以下面的命令會在後臺運行容器:
[root@gavin /]# sudo docker run -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"
1cdff0f459ad8f8e5a3de5603bbd14ea09a152ca430a5528e344c4254197f550
容器啓動後會返回一個惟一的ID,也能夠經過docker ps命令來查看容器信息:
[root@gavin /]# sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1cdff0f459ad ubuntu "/bin/sh -c 'while t…" 11 seconds ago Up 9 seconds keen_perlman
要獲取容器的輸出信息,能夠經過docker logs命令:
[root@gavin /]# docker logs 1cdff0f459ad
hello world
hello world
hello world
...
可使用docker stop來終止一個運行中的容器,命令的格式爲docker stop [-t l --time[=10]]。它會首先向容器發送SIGTERM信號,等待一段時間後(默認爲10秒),再發送SIGKILL信號終止容器。
此外,當Docker容器中指定的應用終結時,容器也自動終止。例如對於上面演示中只啓動了一個終端的容器,用戶經過exit命令或Ctrl+d來退出終端時,所建立的容器馬上終止。
另外,可使用docker stop來終止一個運行中的容器:
[root@gavin /]# sudo docker stop 1cdff0f459ad
1cdff0f459ad
可使用docker ps -a -q命令看處處於終止狀態的容器的ID信息。例如:
[root@gavin /]# sudo docker ps -a -q
1cdff0f459ad
5380e1ecc9c8
e6e0a53c33c4
c03bb46b440c
處於終止狀態的容器,能夠經過docker start命令來從新啓動:
[root@gavin /]# sudo docker start 1cdff0f459ad
1cdff0f459ad
此外,docker restart命令會將一個運行態的容器終止,而後再從新啓動它:
[root@gavin /]# sudo docker restart 1cdff0f459ad
1cdff0f459ad
在使用-d參數時,容器啓動後會進入後臺,用戶沒法看到容器中的信息。某些時候若是須要進入容器進行操做,有多種方法,包括使用docker attach命令、docker exec命令,以及nsenter工具等,博主這裏只說下docker exec命令。
Docke自1.3版本起,提供了一個很是方便的工具exec,能夠直接在容器內運行命令。
例如進入到剛建立的容器中,並啓動一個bash:
[root@gavin /]# sudo docker exec -ti 1cdff0f459ad /bin/bash
root@1cdff0f459ad:/#
可使用docker rm命令刪除處於終止狀態的容器,命令格式爲docker rm [OPTTONS] CONTAINER [CONTAINER...]。支持的選項包括:
例如,查看處於終止狀態的容器並刪除以下所示:
[root@gavin /]# sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1cdff0f459ad ubuntu "/bin/sh -c 'while t…" 19 minutes ago Up 10 minutes keen_perlman 5380e1ecc9c8 ubuntu "/bin/bash" 26 minutes ago Exited (0) 23 minutes ago practical_snyder e6e0a53c33c4 ubuntu "/bin/echo 'Hello Wo…" 31 minutes ago Exited (0) 31 minutes ago lucid_robinson c03bb46b440c ubuntu "/bin/bash" About an hour ago Created practical_volhard [root@gavin /]# sudo docker rm 5380e1ecc9c8 5380e1ecc9c8
若是要刪除一個運行中的容器,能夠添加-f參數。Docker會發送SIGKILL信號給容器,終止其中的應用:
[root@gavin /]# sudo docker rm 1cdff0f459ad Error response from daemon: You cannot remove a running container 1cdff0f459ad8f8e5a3de5603bbd14ea09a152ca430a5528e344c4254197f550. Stop the container before attempting removal or force remove [root@gavin /]# sudo docker rm -f 1cdff0f459ad 1cdff0f459ad
導出容器是指導出一個已經建立的容器到一個文件,無論此時這個容器是否處於運行狀態,可使用docker export命令,該命令格式爲docker export CONTAINER。
查看全部的容器以下所示:
[root@gavin /]# sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2e003db2a309 ubuntu "/bin/sh -c 'while t…" 14 seconds ago Up 12 seconds keen_nobel e6e0a53c33c4 ubuntu "/bin/echo 'Hello Wo…" 39 minutes ago Exited (0) About a minute ago lucid_robinson
分別導出2e003db2a309容器和e6e0a53c33c4容器到test_for_run.tar文件和test_for_stop.tar文件:
[root@gavin test]# sudo docker export 2e003db2a309 > test_for_run.tar [root@gavin test]# ls test_for_run.tar [root@gavin test]# sudo docker export e6e0a53c33c4 > test_for_stop.tar [root@gavin test]# ls test_for_run.tar test_for_stop.tar
可將這些文件傳輸到其餘機器上,在其餘機器上經過導入命令實現容器的遷移。
導出的文件又可使用docker import命令導入,成爲鏡像,例如:
[root@gavin test]# cat test_for_run.tar | sudo docker import - test/ubuntu:v1.0 sha256:5b8050c321636ec1814fd0927a5044aed089df8641d32ea4442c75a71ad3e596 [root@gavin test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE test/ubuntu v1.0 5b8050c32163 3 seconds ago 64.2MB
讀者可能會記得,博主在以前博文中曾介紹過使用docker load命令來導入一個鏡像文件。
實際上,既可使用docker load命令來導人鏡像存儲文件到本地的鏡像庫,又可使用docker import命令來導人一個容器快照到本地鏡像庫。這二者的區別在於容器快照文件將丟棄全部的歷史記錄和元數據信息(即僅保存容器當時的快照狀態),而鏡像存儲文件將保存完整記錄,體積也要大。此外,從容器快照文件導入時能夠從新指定標籤等元數據信息。
這篇文章是我學習 Docker 的記錄,內容參考自《Docker技術入門與實戰》