Docker 第三章 容器

操作 Docker 容器

 容器是docker 的核心概念,容器是一个或一组独立运行的应用,以及它们的运行环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。

1.启动容器

  启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。

2.新建并启动

  所需要的命令主要为 docker run

  

新建并启动

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 则让容器的标准输入保持打开。

当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:

检查本地是否存在指定的镜像,不存在就从公有仓库下载
利用镜像创建并启动一个容器
分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
从地址池配置一个 ip 地址给容器
执行用户指定的应用程序
执行完毕后容器被终止

启动已终止容器

可以利用 docker container start 命令,直接将一个已经终止的容器启动运行。

容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必需的。除此之外,并没有其它的资源。可以在伪终端中利用 ps 或 top 来查看进程信息。

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 参数来实现。

下面举两个例子来说明一下。

如果不使用 -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 /]# 

 

原文地址:https://www.cnblogs.com/zy09/p/10913304.html