Docker 第三章 容器

操做 Docker 容器

 容器是docker 的核心概念,容器是一個或一組獨立運行的應用,以及它們的運行環境。對應的,虛擬機能夠理解爲模擬運行的一整套操做系統(提供了運行態環境和其餘系統環境)和跑在上面的應用。nginx

1.啓動容器web

  啓動容器有兩種方式,一種是基於鏡像新建一個容器並啓動,另一個是將在終止狀態(stopped)的容器從新啓動。docker

2.新建並啓動ubuntu

  所須要的命令主要爲 docker runcentos

 

  

新建並啓動

Unable to find image 'ubuntu:18.04' locally
18.04: Pulling from library/ubuntu
6abc03819f3e: Pulling fs layer 
6abc03819f3e: Pull complete 
05731e63f211: Pull complete 
0bd67c50d6be: Pull complete 
Digest: sha256:f08638ec7ddc90065187e7eabdfac3c96e5ff0f6b2f1762cf31a4f49b53000a5
Status: Downloaded newer image for ubuntu:18.04

root@71f93fa546e3:/# 
root@71f93fa546e3:/# ps
   PID TTY          TIME CMD
     1 pts/0    00:00:00 bash
    10 pts/0    00:00:00 ps
root@71f93fa546e3:/# 

 

 

其中,-t 選項讓Docker分配一個僞終端(pseudo-tty)並綁定到容器的標準輸入上, -i 則讓容器的標準輸入保持打開。bash

 

當利用 docker run 來建立容器時,Docker 在後臺運行的標準操做包括:

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

 

 

啓動已終止容器

能夠利用 docker container start 命令,直接將一個已經終止的容器啓動運行。app

容器的核心爲所執行的應用程序,所須要的資源都是應用程序運行所必需的。除此以外,並無其它的資源。能夠在僞終端中利用 ps 或 top 來查看進程信息。less

root@localhost ~]# docker container ls
CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS                  NAMES
71f93fa546e3        ubuntu:18.04                       "/bin/bash"              2 minutes ago       Up 2 minutes                               silly_gauss
11713cdf0b36        dockerpracticecn/docker_practice   "nginx -g 'daemon of…"   19 minutes ago      Up 19 minutes       0.0.0.0:4000->80/tcp   priceless_borg
[root@localhost ~]# docker container ls

 

 

 

後臺運行

更多的時候,須要讓 Docker 在後臺運行而不是直接把執行命令的結果輸出在當前宿主機下。此時,能夠經過添加 -d 參數來實現。tcp

下面舉兩個例子來講明一下。spa

若是不使用 -d 參數運行容器。

[root@localhost ~]# docker run ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
^C[root@localhost ~]# ^C
[root@localhost ~]# docker run -d  ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
68dd6ebc3dd6d1ff03e551762e5c0b18815e7566ce292795892eccb044370c05
[root@localhost ~]# 
[root@localhost ~]# 

此時容器會在後臺運行並不會把輸出的結果 (STDOUT) 打印到宿主機上面(輸出結果能夠用 docker logs 查看)。

[root@localhost ~]# docker container logs 68dd6ebc3dd6
hello world
hello world
hello world
hello world
hello world
hello world
hello world

 

注: 容器是否會長久運行,是和 docker run 指定的命令有關,和 -d 參數無關。

使用 -d 參數啓動後會返回一個惟一的 id,也能夠經過 docker container ls 命令來查看容器信息。

[root@localhost ~]# docker container ls
CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS                  NAMES
11713cdf0b36        dockerpracticecn/docker_practice   "nginx -g 'daemon of…"   30 minutes ago      Up 30 minutes       0.0.0.0:4000->80/tcp   priceless_borg
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# docker container start 68dd6ebc3dd6
68dd6ebc3dd6
[root@localhost ~]# docker container ls
CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS                  NAMES
68dd6ebc3dd6        ubuntu:18.04                       "/bin/sh -c 'while t…"   3 minutes ago       Up 2 seconds                               angry_haslett
11713cdf0b36        dockerpracticecn/docker_practice   "nginx -g 'daemon of…"   30 minutes ago      Up 30 minutes       0.0.0.0:4000->80/tcp   priceless_borg
[root@localhost ~]# docker container stop 68dd6ebc3dd6


68dd6ebc3dd6
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# docker container ls
CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS                  NAMES
11713cdf0b36        dockerpracticecn/docker_practice   "nginx -g 'daemon of…"   31 minutes ago      Up 31 minutes       0.0.0.0:4000->80/tcp   priceless_borg
[root@localhost ~]# 

 

終止容器

可使用 docker container stop 來終止一個運行中的容器。

此外,當 Docker 容器中指定的應用終結時,容器也自動終止。

例如對於上一章節中只啓動了一個終端的容器,用戶經過 exit 命令或 Ctrl+d 來退出終端時,所建立的容器馬上終止。

終止狀態的容器能夠用 docker container ls -a 命令看到。例如

[root@localhost ~]# docker container ls   #列出活動的容器
CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS                  NAMES
11713cdf0b36        dockerpracticecn/docker_practice   "nginx -g 'daemon of…"   34 minutes ago      Up 34 minutes       0.0.0.0:4000->80/tcp   priceless_borg
[root@localhost ~]# 
[root@localhost ~]# docker container ls -a   #列出全部容器
CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS                       PORTS                  NAMES
68dd6ebc3dd6        ubuntu:18.04                       "/bin/sh -c 'while t…"   7 minutes ago       Exited (137) 3 minutes ago                          angry_haslett
74d05a9b6bfd        ubuntu:18.04                       "/bin/sh -c 'while t…"   7 minutes ago       Exited (0) 7 minutes ago                            objective_chaum
71f93fa546e3        ubuntu:18.04                       "/bin/bash"              17 minutes ago      Exited (0) 8 minutes ago                            silly_gauss
11713cdf0b36        dockerpracticecn/docker_practice   "nginx -g 'daemon of…"   34 minutes ago      Up 34 minutes                0.0.0.0:4000->80/tcp   priceless_borg
6603c0996cb7        nginx                              "nginx -g 'daemon of…"   3 days ago          Exited (255) 4 hours ago     80/tcp                 angry_gates
785c1b8f6469        nginx                              "/bin/bash/echo test"    3 days ago          Created                      80/tcp                 reverent_bassi
517422f3ebb2        nginx                              "nginx -g 'daemon of…"   12 days ago         Exited (255) 10 days ago     80/tcp                 web1
a14868c3b1ec        fce289e99eb9                       "/hello"                 2 weeks ago         Exited (0) 2 weeks ago                              tender_wilbur
[root@localhost ~]# 

 

 

處於終止狀態的容器,能夠經過 docker container start 命令來從新啓動。

此外,docker container restart 命令會將一個運行態的容器終止,而後再從新啓動它。

 

進入容器

在使用 -d 參數時,容器啓動後會進入後臺。

某些時候須要進入容器進行操做,包括使用 docker attach 命令或 docker exec 命令,推薦你們使用 docker exec 命令,緣由會在下面說明。

 

attach 命令

[root@localhost ~]# docker run -dit ubuntu
5da48ce5974710e5bcc173a889d992983b8eb0365cb55210e678d72debfa0553
[root@localhost ~]# docker container ls
CONTAINER ID        IMAGE                              COMMAND                  CREATED              STATUS              PORTS                  NAMES
5da48ce59747        ubuntu                             "/bin/bash"              7 seconds ago        Up 5 seconds                               heuristic_taussig
756e0df1467d        ubuntu                             "/bin/bash"              About a minute ago   Up About a minute                          nifty_shamir
e958909dcdc4        ubuntu                             "/bin/bash"              About a minute ago   Up About a minute                          vigorous_hypatia
11713cdf0b36        dockerpracticecn/docker_practice   "nginx -g 'daemon of…"   About an hour ago    Up About an hour    0.0.0.0:4000->80/tcp   priceless_borg
[root@localhost ~]# docker attach 5da4
root@5da48ce59747:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@5da48ce59747:/# ps
   PID TTY          TIME CMD
     1 pts/0    00:00:00 bash
    11 pts/0    00:00:00 ps
root@5da48ce59747:/# 
#注意: 若是從這個 stdin 中 exit,會致使容器的中止。

 

exec 命令

-i -t 參數

docker exec 後邊能夠跟多個參數,這裏主要說明 -i -t 參數。

只用 -i 參數時,因爲沒有分配僞終端,界面沒有咱們熟悉的 Linux 命令提示符,但命令執行結果仍然能夠返回。

當 -i -t 參數一塊兒使用時,則能夠看到咱們熟悉的 Linux 命令提示符。

[root@localhost ~]# docker exec -i 756e bash   #不顯示登陸終端
df  
Filesystem              1K-blocks    Used Available Use% Mounted on
overlay                   9959424 2368420   7591004  24% /
tmpfs                       65536       0     65536   0% /dev
tmpfs                      498980       0    498980   0% /sys/fs/cgroup
/dev/mapper/centos-root   9959424 2368420   7591004  24% /etc/hosts
shm                         65536       0     65536   0% /dev/shm
tmpfs                      498980       0    498980   0% /proc/asound
tmpfs                      498980       0    498980   0% /proc/acpi
tmpfs                      498980       0    498980   0% /proc/scsi
tmpfs                      498980       0    498980   0% /sys/firmware
exit
[root@localhost ~]# docker exec -it 756e bash   #顯示登陸終端
root@756e0df1467d:/# df
Filesystem              1K-blocks    Used Available Use% Mounted on
overlay                   9959424 2368420   7591004  24% /
tmpfs                       65536       0     65536   0% /dev
tmpfs                      498980       0    498980   0% /sys/fs/cgroup
/dev/mapper/centos-root   9959424 2368420   7591004  24% /etc/hosts
shm                         65536       0     65536   0% /dev/shm
tmpfs                      498980       0    498980   0% /proc/asound
tmpfs                      498980       0    498980   0% /proc/acpi
tmpfs                      498980       0    498980   0% /proc/scsi
tmpfs                      498980       0    498980   0% /sys/firmware
root@756e0df1467d:/# 

 

若是從這個 stdin 中 exit,不會致使容器的中止。這就是爲何推薦你們使用 docker exec 的緣由。

更多參數說明請使用 docker exec --help 查看。

 

導出和導入容器

導出容器

若是要導出本地某個容器,可使用 docker export 命令。

[root@localhost ~]# docker container ls -a
CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS                         PORTS                  NAMES
3b176a3a61d5        dockerpracticecn/docker_practice   "nginx -g 'daemon of…"   17 minutes ago      Up 17 minutes                  0.0.0.0:4000->80/tcp   xenodochial_mcclintock
5da48ce59747        ubuntu                             "/bin/bash"              18 minutes ago      Exited (0) 14 minutes ago                             heuristic_taussig
756e0df1467d        ubuntu                             "/bin/bash"              19 minutes ago      Exited (0) 4 minutes ago                              nifty_shamir
e958909dcdc4        ubuntu                             "/bin/bash"              19 minutes ago      Up 19 minutes                                         vigorous_hypatia
68dd6ebc3dd6        ubuntu:18.04                       "/bin/sh -c 'while t…"   About an hour ago   Exited (137) 44 minutes ago                           angry_haslett
74d05a9b6bfd        ubuntu:18.04                       "/bin/sh -c 'while t…"   About an hour ago   Exited (0) About an hour ago                          objective_chaum
71f93fa546e3        ubuntu:18.04                       "/bin/bash"              About an hour ago   Exited (0) About an hour ago                          silly_gauss
6603c0996cb7        nginx                              "nginx -g 'daemon of…"   3 days ago          Exited (255) 5 hours ago       80/tcp                 angry_gates
785c1b8f6469        nginx                              "/bin/bash/echo test"    3 days ago          Created                        80/tcp                 reverent_bassi
517422f3ebb2        nginx                              "nginx -g 'daemon of…"   12 days ago         Exited (255) 10 days ago       80/tcp                 web1
a14868c3b1ec        fce289e99eb9                       "/hello"                 2 weeks ago         Exited (0) 2 weeks ago                                tender_wilbur
[root@localhost ~]# docker export 5da > ubuntu.tar
[root@localhost ~]# ls
anaconda-ks.cfg  ubuntu.tar
[root@localhost ~]# ll ubuntu.tar 
-rw-r--r-- 1 root root 72332800 May 27 03:37 ubuntu.tar
[root@localhost ~]# #導出容器快照到本地文件

 

 

導入容器快照

可使用 docker import 從容器快照文件中再導入爲鏡像,例如

[root@localhost ~]# cat ubuntu.tar | docker import - test/ubuntu:v1.0
sha256:fe4eda56cd374133a7f3a6ce6b12bc13d26fe78a5083f63171ecfbd5b005dead
[root@localhost ~]# docker image ls
REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
test/ubuntu                        v1.0                fe4eda56cd37        13 seconds ago      69.9MB
ubuntu                             18.04               7698f282e524        11 days ago         69.9MB
ubuntu                             latest              7698f282e524        11 days ago         69.9MB
dockerpracticecn/docker_practice   latest              b6bfd54275de        13 days ago         41.8MB
nginx                              latest              53f3fd8007f7        2 weeks ago         109MB
iganarix/base-ubuntu-18.04         latest              0ffa5d899369        5 weeks ago         558MB
progrium/busybox                   latest              a67699e37dbd        7 months ago        4.8MB
[root@localhost ~]# 

 

注:用戶既可使用 docker load 來導入鏡像存儲文件到本地鏡像庫,也可使用 docker import 來導入一個容器快照到本地鏡像庫。這二者的區別在於容器快照文件將丟棄全部的歷史記錄和元數據信息(即僅保存容器當時的快照狀態),而鏡像存儲文件將保存完整記錄,體積也要大。此外,從容器快照文件導入時能夠從新指定標籤等元數據信息。

刪除容器

可使用 docker container rm 來刪除一個處於終止狀態的容器。例如

[root@localhost /]# docker container rm 5da4
5da4
[root@localhost /]# docker container ls -a
CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS                           PORTS                  NAMES
3b176a3a61d5        dockerpracticecn/docker_practice   "nginx -g 'daemon of…"   42 minutes ago      Up 42 minutes                    0.0.0.0:4000->80/tcp   xenodochial_mcclintock
756e0df1467d        ubuntu                             "/bin/bash"              44 minutes ago      Exited (0) 30 minutes ago                               nifty_shamir
e958909dcdc4        ubuntu                             "/bin/bash"              45 minutes ago      Up 45 minutes                                           vigorous_hypatia
68dd6ebc3dd6        ubuntu:18.04                       "/bin/sh -c 'while t…"   About an hour ago   Exited (137) About an hour ago                          angry_haslett
74d05a9b6bfd        ubuntu:18.04                       "/bin/sh -c 'while t…"   About an hour ago   Exited (0) About an hour ago                            objective_chaum
71f93fa546e3        ubuntu:18.04                       "/bin/bash"              About an hour ago   Exited (0) About an hour ago                            silly_gauss
6603c0996cb7        nginx                              "nginx -g 'daemon of…"   3 days ago          Exited (255) 5 hours ago         80/tcp                 angry_gates
785c1b8f6469        nginx                              "/bin/bash/echo test"    3 days ago          Created                          80/tcp                 reverent_bassi
517422f3ebb2        nginx                              "nginx -g 'daemon of…"   12 days ago         Exited (255) 10 days ago         80/tcp                 web1
a14868c3b1ec        fce289e99eb9                       "/hello"                 2 weeks ago         Exited (0) 2 weeks ago                                  tender_wilbur
[root@localhost /]# 


清理全部處於終止狀態的容器

用 docker container ls -a 命令能夠查看全部已經建立的包括終止狀態的容器,若是數量太多要一個個刪除可能會很麻煩,用下面的命令能夠清理掉全部處於終止狀態的容器。

[root@localhost /]# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
756e0df1467d54351555c9cd43f061ef653b506b7b9b67b8a320b1398f071a24
68dd6ebc3dd6d1ff03e551762e5c0b18815e7566ce292795892eccb044370c05
74d05a9b6bfd2d6e1bed801b030d2d2c0005096c91f2566fc3ad02ee6117f254
71f93fa546e30f0b6da59015feda84c6d18a0a92fae92984649f196e9ce38a89
6603c0996cb7caae8b8f54900239e2c3f02ec01b23a6c17708739caa0bc5bbfe
785c1b8f6469b44dde63fe153c1888ec927c36bfc29f4d84f58ecf104ab273b7
517422f3ebb2a0b81e1e0fc056caafaee8f886236176cdcbd5aac5d90c044aea
a14868c3b1ec6901f45987ddd2919675b9aa3ee117402a1b2a73ec49d3572dbf

Total reclaimed space: 82B
[root@localhost /]# 
相關文章
相關標籤/搜索