欢迎您, 来到 宁时修博客.^_^

Docker系列6--操作容器

2018/11/18 言则行 Docker 473
Docker容器技术

一、Docker容器基础

    镜像( Image  )和容器( Container  )的关系,就像是面向对象程序设计中的类  和  实例  一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

    容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的  root  文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性,很多人初学Docker 时常常会混淆容器和虚拟机。

    前面讲过镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层。

    容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。

    按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。

    数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。




二、启动容器

    启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止

状态( stopped  )的容器重新启动。

    因为 Docker 的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器。



    1、新建并启动

    docker run 运行容器,docker run --help查看更多命令帮助。

    例如,以下输出一个 “Hello World”,之后终止容器。

$ docker run centos /bin/echo "hello world"
hello world


    启动一个 bash 终端,允许用户进行交互。

$ docker run -it centos /bin/bash
[root@c6f927515ff7 /]#


    -t  选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上;

    -i  则让容器的标准输入保持打开。

    在交互模式下,用户可以通过所创建的终端来输入命令。


    

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

        1)检查本地是否存在指定的镜像,不存在就从公有仓库下载;

        2)利用镜像创建并启动一个容器;

        3)分配一个文件系统,并在只读的镜像层外面挂载一层可读写层;

        4)从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去;

        5)从地址池配置一个 ip 地址给容器;

        6)执行用户指定的应用程序;

        7)执行完毕后容器被终止。


    2、启动已终止容器

    docker container start  命令将一个已经停止的容器启动运行。


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

[root@docker ~]# docker run -it centos /bin/bash
[root@abca42a66a69 /]# ps
   PID TTY          TIME CMD
     1 pts/0    00:00:00 bash
    13 pts/0    00:00:00 ps
[root@abca42a66a69 /]# top

    容器中仅运行了指定的 bash 应用。这种特点使得 Docker 对资源的利用率极高,是货真价实的轻量级虚拟化。



三、容器后台运行

    更多的时候,需要让 Docker 在后台运行而不是直接把执行命令的结果输出在当前宿主机下。通过添加  -d  参数来实现。

$ docker run -d centos /bin/echo "hello world"
827cb313d5da9854d13b8dccabb715f8f9d2627fa2c12b2cef3df56706158d85

    此时容器会在后台运行并不会把输出的结果 (STDOUT) 打印到宿主机上面(输出结果可以用  docker logs  CONTAINER 查看)。

    容器是否会长久运行,是和  docker run  指定的命令有关,和  -d  参数无关。

    使用  -d  参数启动后会返回一个唯一的 id,也可以通过  docker container ls 命令来查看容器信息。

    要获取容器的输出信息,可以通过  docker container logs  [CONTAINER ID or NAMES]命令。



四、终止容器

    使用  docker container stop  来终止一个运行中的容器。

    当 Docker 容器中指定的应用终结时,容器也自动终止。

    用 -it 启动了一个交互终端的容器,通过  exit  命令或  Ctrl+d来退出终端时,所创建的容器立刻终止。

    终止状态的容器可以用  docker container ls -a  命令看到。例如:

$ docker container ls -a

    处于终止状态的容器,可以通过  docker container start  命令来重新启动。

    docker container restart  命令会将一个运行中的容器终止,然后再重新启动它。



五、进入容器

    使用  -d  参数时,容器启动后会进入后台。

    有时需要进入容器进行操作,使用  docker attach  命令或  docker exec  命令,推荐大家使用  docker exec  命令。


    1)attach  命令

    docker attach使用示例:

$ docker run -dit ubuntu:17.10
17972bae0a52e9ef8324a7b4e6c6951c07eb20d389c10f5dad7286736d6e126c


$ docker attach 179
root@17972bae0a52:/#

    从这个 stdin 中 exit,会导致容器停止。


    2)exec命令

    docker exec  后边可以跟多个参数,主要说明  -i 、-t  参数。

    只用  -i  参数时,由于没有分配伪终端,界面没有我们熟悉的 Linux 命令提示符,但命令执行结果仍然可以返回。

    当  -i  、-t  参数一起使用时,则可以看到Linux 命令提示符。

$ docker run -dit ubuntu


$ docker exec -i ab3 bash
ls
bin
boot
dev
etc
....

$ docker exec -it ab3 bash
root@ab3e252ea7a8:/# ls
bin   dev  home  lib64 ......


    从这个 stdin 中 exit,不会导致容器停止。这就是为什么推荐大家使用docker exec  的原因。



六、导出和导入容器

    1)导出容器

    使用  docker export  命令导出本地的某个容器快照到本地文件:

$ docker container ls -a

$ docker export 17972bae0a52 > ubuntu_17.10.tar
$ ls
anaconda-ks.cfg  ubuntu_17.10.tar



    2)导入容器

    使用  docker import  从容器快照文件中再导入为镜像:

$ docker import ubuntu_17.10.tar test/ubuntu:v1.0
sha256:cd366d573eafca68948bee63ec9de2d1456979133215a4e4fa3a92be08c267d9

$ docker image ls


    也可以通过指定 URL 或者某个目录来导入,例如:

docker import http://example.com/exampleimage.tgz example/imagerepo


    用户既可以使用  docker load  来导入镜像存储文件到本地镜像库,也可以使用  docker import  来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。



七、删除容器

    使用 docker container rm CONTAINER 来删除一个处于终止状态的容器。

$ docker container ls -a

$ docker container rm afd
afd

    添加  -f  参数,强制删除一个运行中的容器,Docker 会发送 SIGKILL信号给容器。


    清理所有处于终止状态的容器

    用  docker container ls -a  命令可以查看所有已经创建的包括终止状态的容器,如果数量太多要一个个删除可能会很麻烦,用下面的命令可以清理掉所有处于终止状态的容器。

docker container prune


点赞
说说你的看法

所有评论: (0)

# 加入组织

1、用手机QQ扫左侧二维码

2、搜Q群:1058582137

3、点击 宁时修博客交流群