docker基礎命令之容器篇

什麼是容器?
就是鏡像的運行時對象

如何創建容器
$ sudo docker create -it ubuntu:latest
7a0c26f96889de46b6276608501b7e8f99e4e31e42ec4a288a1f8e7644316637
$sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7a0c26f96889 ubuntu:latest "/bin/bash" 6 seconds ago stoic_albattani
使用docker create命令新建的容器處於停止狀態,可以使用docker start命令來啓動它。

啓動容器有兩種方式,一種是基於鏡像新建一個容器並啓動,另外一個是將在終止狀態(stopped)的容器重新啓動。所需要的命令主要爲docker run,等價於先執行docker create命令,再執行docker start命令。

例如,下面的命令輸出一個“Hello World”,之後容器自動終止:
$ sudo docker run ubuntu /bin/echo 'Hello world'
Hello world
這跟在本地直接執行/bin/echo'hello world'幾乎感覺不出任何區別。
當利用docker run來創建並啓動容器時,Docker在後臺運行的標準操作包括:
  1. 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載。
  2. 利用鏡像創建並啓動一個容器。
  3. 分配一個文件系統,並在只讀的鏡像層外面掛載一層可讀寫層。
  4. 從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去。
  5. 從地址池配置一個IP地址給容器。
  6. 執行用戶指定的應用程序。
  7. 執行完畢後容器被終止。

下面的命令則啓動一個bash終端,允許用戶進行交互:
$ sudo docker run -t -i ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/#
其中,
-t選項讓Docker分配一個僞終端(pseudo-tty)並綁定到容器的標準輸入上,
-i則讓容器的標準輸入保持打開
在交互模式下,用戶可以通過所創建的終端來輸入命令,例如:
root@af8bae53bdd3:/# pwd
/
root@af8bae53bdd3:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@af8bae53bdd3:/# ps
PID TTY TIME CMD
1 ? 00:00:00 bash
11 ? 00:00:00 ps
在容器內用ps命令查看進程,可以看到,只運行了bash應用,並沒有運行其他不需要的進程。
用戶可以按Ctrl+d或輸入exit命令來退出容器:
root@af8bae53bdd3:/# exit
exit


守護態運行
更多的時候,需要讓Docker容器在後臺以守護態(Daemonized)形式運行。用戶可以通過添加-d參數來實現。
例如下面的命令會在後臺運行容器:
$ sudo docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
ce554267d7a4c34eefc92c5517051dc37b918b588736d0823e4c846596b04d83
容器啓動後會返回一個唯一的ID,也可以通過docker ps命令來查看容器信息:
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce554267d7a4 ubuntu:latest "/bin/sh -c 'while t About a minute ago
Up About a minute determined_pik
要獲取容器的輸出信息,可以通過docker logs命令:
$ sudo docker logs ce5
hello world
hello world
hello world
. . .

4.2 終止容器
可以使用docker stop來終止一個運行中的容器,命令的格式爲docker stop[-t|--time[=10]]。它會首先向容器發送SIGTERM信號,等待一段時間後(默認爲10秒),再發送SIGKILL信號終止容器。
此外,當Docker容器中指定的應用終結時,容器也自動終止。例如對於上一節中只啓動了一個終端的容器,用戶通過exit命令或Ctrl+d來退出終端時,所創建的容器立刻終止。
另外,可以使用docker stop來終止一個運行中的容器:
$ sudo docker stop ce5
ce5
⚠️注意 docker kill命令會直接發送SIGKILL信號來強行終止容器。
可以使用docker ps-a-q命令看到處於終止狀態的容器的ID信息。例如:
$ sudo docker ps -a -q
ce554267d7a4
d58050081fe3
e812617b41f6
處於終止狀態的容器,可以通過docker start命令來重新啓動:
$ sudo docker start ce5
ce5
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce554267d7a4 ubuntu:latest "/bin/sh -c 'while t 4 minutes ago
Up 5 seconds determined_pike
此外,docker restart命令會將一個運行態的容器終止,然後再重新啓動它:

$ sudo docker restart ce5
ce5
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce554267d7a4 ubuntu:latest "/bin/sh -c 'while t 5 minutes ago
Up 14 seconds determined_pike

導出容器
導出容器是指導出一個已經創建的容器到一個文件,不管此時這個容器是否處於運行狀態,可以使用docker export命令,該命令格式爲docker export CONTAINER。
查看所有的容器如下所示:
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce554267d7a4 ubuntu:latest "/bin/sh -c 'while t" 3 minutes ago Exited (-1) 13 seconds ago determined_pike
d58050081fe3 ubuntu:latest "/bin/bash" About an hour ago Exited (0) About an hour ago berserk_brattain
e812617b41f6 ubuntu:latest "echo 'hello! I am h" 2 hours ago Exited (0) 3 minutes ago silly_leakey
分別導出ce554267d7a4容器和e812617b41f6容器到test_for_run.tar文件和test_for_stop.tar文件:
$ sudo docker export ce5 >test_for_run.tar
$ ls
test_for_run.tar
$ sudo docker export e81 >test_for_stop.tar
$ ls
test_for_run.tar test_for_stop.tar
可將這些文件傳輸到其他機器上,在其他機器上通過導入命令實現容器的遷移。
導入容器
導出的文件又可以使用docker import命令導入,成爲鏡像,例如:
$ cat test_for_run.tar | sudo docker import - test/ubuntu:v1.0
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB
讀者可能會記得,筆者在之前章節曾介紹過使用docker load命令來導入一個鏡像文件。
實際上,既可以使用docker load命令來導入鏡像存儲文件到本地的鏡像庫,又可以使用docker import命令來導入一個容器快照到本地鏡像庫。這兩者的區別在於容器快照文件將丟棄所有的歷史記錄和元數據信息(即僅保存容器當時的快照狀態),而鏡像存儲文件將保存完整記錄,體積也要大。此外,從容器快照文件導入時可以重新指定標籤等元數據信息。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章