今天的学习任务是承接昨天所学的容器管理部分,然后再学习了docker的数据卷相关的使用方法。
昨天我们学习了容器的开启、删除等操作。今天继续学习容器的启停、进入容器内部等。
attach
比如我们需要进入一个名为c1
的centos
的容器,我们可以使用以下命令:
docker attach c1
exec
attach
命令并不是对任何容器都有效,仅对提供了终端的容器有效。比如nginx
,mysql
等应用容器是无法进入的。
但是我们想要在容器中执行命令,比如重启nginx
容器中的nginx
,或者在该容器中创建test
目录该如何做呢?
docker提供了exec
指令实现该功能:
docker exec n1 nginx -s reload
docker exec n1 midir test
如果我们必须要进入到正在运行的容器,但是attach
又不能进入该怎么办呢?
其实这个问题也可以使用前面介绍的-it
来分配一个终端。
docker exec -it n1
这个命令在很多时候都非常有用,特别是需要自己制作一些公用镜像的时候。前段时间公司出现了一个问题,就是需要为一个镜像安装字体。从概念上讲,安装字体后的镜像就已经不是原来的进行了,这时候我们相当于是要在原有镜像的基础上创建新的镜像。
我们可以将原来的镜像启动起来,实例化一个容器,然后进入到该容器,再安装字体,安装完后可以使用docker export n1
的方式将容器导出生成镜像。
docker stop n1
这个地方有一点需要注意,该镜像在创建的时候使用了--restart=always
选项不会影响手动停止操作。
docker start n1
在看到这个命令的时候,可以和docker run nginx
对比一下。
docker run nginx | docker start n1 | |
---|---|---|
作用 | 创建并运行一个容器 | 开启一个容器 |
参数 | 景象名称 | 容器名称或者ID |
docker top n1
该命令相当于执行了一次ps
指令。
docker inspect n1
该命令会展示关于容器的一些参数信息,包括网络、数据卷等。
从第一天的学习中,我们知道了docker的底层接口是分层的。镜像是一些的只读层组成,容器在镜像的基础上加了一个可读写层,我们称之为容器层。
由于这个容器层的原因,所以容器在停止、重启操作过程中,数据不会丢失。一旦我们删除了容器,那么容器层也会被删除。就像windows的C盘一样,一旦重装系统C盘的数据就会被损坏。为了让容器中的数据能给容器的保存下来,docker提供了数据卷,通过在物理机上创建一个目录,然后与容器中的目录建立映射关系,来保存容器中的数据。这个操作与我们给windows分配D、E....等盘一样,不受系统重装损坏等影响。
docker run -v /test nginx
这条指令会在nginx容器中创建一个 /test
目录,然后在物理机的指令目录下创建一个随机名称的目录与之对应。
当然可以生成多个数据卷,比如:
docker run -v /test1 -v /test2 -v /test3 nginx
docker run -v /data:/test nginx
冒号前面的是物理机中的目录, 冒号后面的是容器中的目录。
而且这些目录不需要事先创建好,容器在使用这些目录的时候会自动创建。
docker run -v /data:/test:rw -v /data1:/test1:r -v /data2:/test2:w nginx
这条指令创建了三个数据卷:
以上所有的权限均是针对容器而言的,对于物理机这些目录的读写权是不受限制的。
明天将学习docker中的网络知识,将可以是容器与容器实现网络互通。
全部评论