Docker容器

簡介 

  容器是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

  • 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載。
  • 利用鏡像建立並啓動一個容器。
  • 分配一個文件系統,並在只讀的鏡像層外面掛載一層可讀寫層。
  • 從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去。
  • 從地址池配置一個IP地址給容器。
  • 執行用戶指定的應用程序。
  • 執行完畢後容器被終止。

  下面的命令則啓動一個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...]。支持的選項包括:

  • -f,--force=false強行終止並刪除一個運行中的容器。
  • -l,--link=false 刪除容器的鏈接,但保留容器。
  • -v,--volumes=false 刪除容器掛載的數據卷。

  例如,查看處於終止狀態的容器並刪除以下所示:

[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技術入門與實戰》
相關文章
相關標籤/搜索