1. 程式人生 > >Docker實踐(三)容器

Docker實踐(三)容器

Docker中,容器是獨立執行的一個或一組應用,以及應用執行的環境;對應傳統的虛擬化,虛擬機器可以理解為模擬作業系統和執行在上面的應用。

啟動容器

啟動容器一般有兩種方式,一種是新建容器並啟動,一種是將終止狀態的容器重新啟動,Docker容器非常的輕量級,能夠很好的支援使用者隨時刪除和建立容器。

新建並啟動容器

docker使用docker run命令來新建並啟動容器,如:

例如如下命令表示輸出一個HelloWorld,之後終止容器。

[[email protected] ~]# docker run centos:7.2.1511 bin/echo 'helloworld'

helloworld

下面是新建並啟動一個容器,包含bash終端,允許使用者進行互動

[[email protected] ~]# docker run -i -t centos:7.2.1511 bin/bash

[[email protected] /]# uname -a

Linux b3dbe17e8ce4 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

[[email protected] /]# cat /proc/version

Linux version 3.10.0-862.el7.x86_64 ([email protected]) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) ) #1 SMP Fri Apr 20 16:44:24 UTC 2018

[[email protected] /]#

其中-i表示讓容器的標準輸入保持開啟,-t表示讓docker分配一個偽終端給容器,並繫結到容器的標準輸入上

docker run命令的執行步驟是:

  • 檢查本地是否存在映象,如果沒有從共有倉庫下載
  • 利用映象建立並啟動一個容器
  • 分配一個檔案系統,並在只讀映象外面掛在一層可讀寫層
  • 從宿主主機配置的網橋介面中橋接一個虛擬介面到容器中去
  • 從地址池配置一個IP地址給容器
  • 執行使用者指定的應用程式
  • 執行完畢後容器被終止

啟動已終止容器

可以利用docker start命令,將一個已終止容器啟動執行。

容器的核心是所執行的應用程式,所需要的資源都是應用程式所必須的,除此之外沒有其他資源佔用,可以在偽終端中利用top或者ps命令檢視容器中的程序資訊。

[[email protected] /]# ps

  PID TTY          TIME CMD

    1 pts/0    00:00:00 bash

   20 pts/0    00:00:00 ps

可以看到容器中只運行了bash應用,所以docker的虛擬化是非常輕量級的,對資源的利用率非常高。

使用docker ps命令可以檢視docker容器列表,其中

預設,不加引數表示,所有啟動狀態的容器

[[email protected] ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND                 CREATED             STATUS                      PORTS               NAMES

b3dbe17e8ce4        centos:7.2.1511     "bin/bash"              21 minutes ago      Up 9 minutes                                    blissful_proskuriakova

c8485a2e06bd        centos:7.2.1511     "bin/bash"              24 minutes ago     

使用 docker start啟動已終止容器

[[email protected] ~]# docker start c8485a2e06bd

c8485a2e06bd

後臺(background)執行

一般情況下,需要docker容器在後臺執行,而不是將容器的命令執行結果輸出到宿主主機,後臺執行docker容器可以通過-d引數來實現。

執行下面的命令,使用-d,和不適用-d的效果。

[[email protected] ~]# docker run centos:7.2.1511 /bin/sh -c 'for i in `seq 100`; do echo $i; sleep 1; done'

1

2

3

4

5

… …

[[email protected] ~]# docker run -d centos:7.2.1511 /bin/sh -c 'for i in `seq 100`; do echo $i; sleep 1;

48df4126c4a42fb92154812528697ce7438f28f00e669a95e8f4095958736b5d

後臺執行的容器,可以通過docker logs [容器id]命令來檢視容器命令的執行結果,如:

[[email protected] ~]# docker logs 48df4126c4a4

1

2

3

4

… …

終止容器

使用docker stop來終止一個執行中的容器,如:

[[email protected] ~]# docker stop b3dbe17e8ce4

b3dbe17e8ce4

當docker容器中的應用程式終結時,docker容器也會終結,如只啟動/bin/bash終端的容器,當exit或者ctrl+d終結時,容器終止。

docker restart可以重新啟動一個容器

進入容器

使用docker run -d容器啟動的docker容器,可以使用docker attach命令或者nsenter命令進入容器,進行操作。

attach命令

[[email protected] lot]# docker run -itd centos:7.2.1511

f37a4155b59a5814e80f05c6f69876b8c4931bc4d5478084698b14c314ad32ad

[[email protected] lot]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

f37a4155b59a        centos:7.2.1511     "/bin/bash"         4 seconds ago       Up 3 seconds                            relaxed_goldwasser

[[email protected] lot]# docker attach relaxed_goldwasser

[[email protected] /]# uname -a

Linux f37a4155b59a 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

attache命令使用時是有弊端的,當多個終端同事attach到一個容器中的時候,所有的視窗都會同步顯示,當某個視窗的應用阻塞是,所有的終端也都會阻塞。

nsenter命令

通過-d引數啟動容器後,根據容器id查詢容器資訊,容器資訊中包含容器的程序ID

[[email protected] lot]# docker inspect ebc3700aa8b1 | grep Pid

            "Pid": 28210,

            "PidMode": "",

            "PidsLimit": 0

通過這個程序id就可以連線到容器中去

[[email protected] lot]# nsenter --target 28210 --mount --uts --ipc --net --pid

[[email protected] /]#

匯入匯出容器

匯出容器

使用docker export命令匯出容器到本地檔案系統,匯出的檔案稱為容器的快照

[[email protected] lot]# docker export 6e8941b320c4 > centos.tar

[[email protected] lot]# ls

centos.tar

[[email protected] lot]#

匯入容器快照

使用docker import命令匯入本地快照為映象,並制定映象標籤

[[email protected] lot]# docker import - testimport/centos < centos.tar

sha256:55ce6d23ccf360444a1c5e7d610ac03b401281544c4a6b9c21d9866d528b628d

[[email protected] lot]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

testimport/centos   latest              55ce6d23ccf3        7 seconds ago       195MB

使用docker load,docker import,docker save,docker load命令的區別:

  • docker import可以重新指定映象的名字,docker load不可以
  • docker export是儲存容器的當前狀態,會丟失歷史資料和元資料
  • docker save用於持久化映象,不會丟失歷史資料和元資料
  • docker load用於匯入映象,不能指定映象的名稱

刪除容器

可以使用docker rm來刪除一個處於終止狀態的容器,但是不能刪除執行狀態的容器,如

[[email protected] lot]# docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES

6e8941b320c4        centos:7.2.1511     "/bin/bash"         11 minutes ago      Up 11 minutes                                   zen_mirzakhani

ebc3700aa8b1        centos:7.2.1511     "/bin/bash"         21 minutes ago      Exited (0) 11 seconds ago                       eager_roentgen

[[email protected] lot]# docker rm zen_mirzakhani

Error response from daemon: You cannot remove a running container 6e8941b320c4d8a833944888bf421b07deba49d6dc8cdac0293cc7f1d7e91895. Stop the container before attempting removal or force remove

[[email protected] lot]# docker rm eager_roentgen

eager_roentgen

[[email protected] lot]#

如果要刪除執行狀態的容器,需要使用docker rm -f 命令來刪除

清理所有處於終止狀態的容器

刪除所有終止狀態的容器

docker rm $(docker ps -a -q)

刪除所有容器

docker rm -f $(docker ps -a -q)

(完)