• Docker:容器



    容器

    Docker的核心功能,是基于容器化技术提供的环境隔离以及资源控制,容器就是一个个具体的隔离环境。当用户把镜像拉取到本地后,就可以使用镜像实例化出一个具体的容器,随后在容器内部进行操作。

    在这里插入图片描述

    如图,当容器实例化完成时,会在镜像上面添加一个容器层,容器在容器层内部进行操作,不会影响镜像层。当一个镜像实例化出多个容器,所有容器共用镜像层。


    容器命令

    docker ps

    • 功能:查看已经实例化的容器

    语法:

    docker ps [option]
    

    选项 :

    • -a:显示所有容器,包括未运行的
    • -n:显示最近创建的n个容器

    docker create

    • 功能:创建一个容器,但是不启动

    语法:

    docker create [option] image [command]
    

    选项:

    • -i:以交互模式运行
    • -t:为容器重新分配一个伪终端
    • -P:随机端口映射
    • -p:指定端口映射,格式:-p 宿主机端口:容器端口
    • --name:为容器指定一个名称
    • -e:设置环境变量
    • --cpuset-cpus:指定容器可以使用的CPU核
    • -m:指定容器允许使用的内存最大值
    • --network:指定容器网络类型
    • --volume -v:绑定一个存储卷
    • --rm:在shell退出时,自动删除容器
    • --restart:容器崩溃时,自动重启

    创建一个nginx容器:

    在这里插入图片描述

    可以通过docker ps -a查看容器,由于容器还没有启动,要加上-a

    这里参数比较多,在docker run部分讲解。


    docker start

    • 功能:启动一个暂停的容器

    语法:

    docker start [option] container [container ...]
    

    其可以一次启动多个容器,只需要把容器名或者容器ID追加到指令末尾即可。

    启动刚才创建的容器:

    在这里插入图片描述

    此时不再需要-a选项,就可以查看到容器,并且容器获得了一个端口号80


    docker run

    • 功能:创建一个新的容器并运行

    语法:

    docker run [option] image [command]
    

    选项:

    • -i:以交互模式运行
    • -t:为容器重新分配一个伪终端
    • -P:随机端口映射
    • -p:指定端口映射,格式:-p 宿主机端口:容器端口
    • --name:为容器指定一个名称
    • -e:设置环境变量
    • --cpuset-cpus:指定容器可以使用的CPU核
    • -m:指定容器允许使用的内存最大值
    • --network:指定容器网络类型
    • --volume -v:绑定一个存储卷
    • --rm:在shell退出时,自动删除容器
    • --restart:容器崩溃时,自动重启
    • -d:后台运行容器

    docker rundocker createdocker start的结合体,同时完成创建容器和启动容器的过程。并且docker run的选项和docker create高度重合,功能也是一致的,只多出一个-d选项。

    首先是交互界面,常常使用-it配合完成,使用-i选项后,容器会读取输入流,解析用户从键盘输入的指令,但是不会返回结果。而-t选项会创建一个伪终端,这个终端会返回容器内指令的输出结果。

    创建一个centos容器:

    在这里插入图片描述

    一开始,宿主机的版本是Ubuntu 24.04,随后通过docker run创建并运行容器,并且使用-it选项进入容器终端。进入容器终端后,发现当前操作系统的版本已经变成了CentOS

    最后通过exit命令退出容器终端。可以看出,容器确实可以在一个操作系统上运行另一个操作系统,实现隔离。

    直接运行一个nginx容器:

    在这里插入图片描述

    运行后,发现进入了一个奇怪的终端,这些内容其实是nginx的日志文件,因为没有指定-it选项,所以没有进入一个可操作的终端,此时可以通过ctrl+ c终止容器并退出。

    对于这种情况,也可以使用-d直接让其在后台运行:

    在这里插入图片描述

    这样就不会出现刚才的日志终端了。另外的,此处还指定了一个-P选项,这代表随机端口映射。nginx使用80端口进行服务,但是最后还是要宿主机的端口与外界通信,此时就要存在一个宿主机与容器端口的映射关系,宿主机接收到来自32769端口的所有数据,都交给容器内部的80端口处理。

    从容器往外看,就好像是自己收到了来自80端口的数据。此处的-P,是随机指定端口,也就是说32769->80是操作系统随机指派的,如果想要自己指定,需要用-p选项。

    在这里插入图片描述

    此处test5容器指定了端口映射6666:80,此后宿主机就会把来自6666端口的消息,转发到容器内的80端口处理。

    通过curl测试本机6666端口:

    在这里插入图片描述

    此时返回了一个nginxhtml页面,说明nginx服务启动成功了,也说明6666端口的消息,确实会被转发到容器内进行处理。

    docker还可以对容器进行资源的限制,其中--cpuset-cpus控制容器可以使用的CPU核:

    在这里插入图片描述

    比如此处--cpuset-cpus "0,1"表示这个容器,只能使用两个CPU核,分别是0 1。也可以指定范围--cpuset-cpus "0-5",表示可以使用0 1 2 3 4 5这六个核。

    再往后的一些参数,比如networkvolumn这些内容,会在其他博客专门讲解。


    docker logs

    • 功能:查看容器日志

    语法:

    docker logs [option] container
    

    选项:

    • -f:跟踪输出日志
    • -n:仅列出最近n条日志

    查看nginx容器的日志:

    在这里插入图片描述

    如果往回看,会发现这和docker run时没有加-it -d选项时,输出的内容一样,其实这就是nginx日志,其包含了nginx从创建开始的所有信息。


    docker exec

    • 功能:在容器中执行命令

    语法:

    docker exec [option] container command [arg...]
    
    • command:要执行的命令
    • arg:执行命令的参数

    参数:

    • -d:在后台运行
    • -i:以交互模式运行
    • -t:为容器分配一个伪终端
    • -e:设置环境变量
    • -u --user:指定用户
    • -w --workdir:指定工作目录

    如果需要在容器内部执行命令,就需要使用exec选项来执行命令。

    查看容器内部nginx版本:

    在这里插入图片描述

    通过exec在容器test9内执行nginx -version得到nginx的版本号。在这之前在宿主机执行同样的命令,发现宿主机没有安装nginx,说明这个命令确实是进入容器内部执行了。

    docker run的时候,可以通过-it选项进入容器自由操作。exec也可以做到,在容器启动后进入容器。

    进入nginx容器:

    在这里插入图片描述

    此处-it要配合bash一起使用,表示进入容器并执行bash进程,这样才会分配终端,否则无法进入容器。

    默认进入容器,是处于根目录的,如果想要在进入容器时处于指定目录,或者说执行指令时处于某条路径,就需要-w选项。

    在这里插入图片描述

    这样一进入容器,就是指定的目录。

    如果在容器内部,有多个用户的话,还可以通过-u指定操作的用户。


    docker stop

    • 功能:停止运行的容器

    语法:

    docker stop [option] container [container...]
    

    参数:

    • -s:发送的信号

    docker stop可以停止正在运行的容器。

    在这里插入图片描述

    停止的容器,可以通过docker ps -a查看:

    在这里插入图片描述

    查看test9的日志:

    在这里插入图片描述

    可以看到,这个容器收到了信号3 SIGQUIT导致退出,可以使用-s选项。

    对于docker stop,其默认使用SIGTERM信号进行关闭容器,如果超出一定时间还没有关闭容器,那么发送SIGQIT强制退出。

    docker stop的关闭方式比较柔和,会给容器一定时间进行资源的保存,日志中也可以看到gracefully shutting down,表示优雅地退出。


    docker restart

    • 功能:重启容器

    语法:

    docker restart [option] container [container...]
    

    在这里插入图片描述

    只需要指定容器名或者容器ID,就可以把暂停的容器重新启动。


    docekr rm

    • 功能:删除停止的容器

    语法:

    docker rm[option] container [container...]
    

    选项:

    • -f:强制删除一个运行中的容器

    默认情况下,docker rm只能删除已经停止的容器,如果容器正在运行,那么不允许删除。

    在这里插入图片描述

    test8是暂停的容器,成功删除了,但是test9正在运行,删除失败。

    此时可以通过-f选项强制删除正在运行的容器。

    在这里插入图片描述


    docker kill

    • 功能:强制停止运行的容器

    语法:

    docker kill [option] container [container...]
    

    参数:

    • -s:发送的信号

    docker kill可以停止正在运行的容器,其和docker stop的功能是一样的,但是docker kill是更加激进的做法。

    在这里插入图片描述

    这里重启了一个test6容器,并用docker kill杀掉,再查看日志。奇怪的事情是,输出日志中没有退出信息,反而是一些重启的信息,难道没有杀掉吗?

    其实不是的,docker kill直接给容器发送SIGQUIT信号,导致容器直接退出,根本来不及写日志。相反的docker stop退出时,容器不仅有时间回收资源,保存信息,还可以顺手写一个日志。


    docker pause

    • 功能:暂停容器内部的所有进程

    语法:

    docker pause container [container...]
    

    此处的pausestopkill不同,后两者是直接关掉容器,而这个pause只暂停容器内部的进程,容易不会被关闭。

    创建一个redis容器:

    在这里插入图片描述

    进行5555:6379的端口映射,此时就可以通过5555端口访问到容器中的reids

    暂停容器:

    在这里插入图片描述

    此时再访问redis客户端,陷入了阻塞,因为虽然容器依然启动着,但是容器内部的redis进程已经停止了。


    docker unpause

    • 功能:恢复容器内部暂停的所有进程

    语法:

    docker unpause container [container...]
    

    docker commit

    • 功能:将容器提交为一个镜像

    语法:

    docker commit [option] container [image[:tag]]
    

    选项:

    • -a:备注提交镜像的作者
    • -c:使用Dockerfile创建镜像
    • -m:备注

    创建一个centos为基础的镜像:

    在这里插入图片描述

    首先创建了一个cantos容器,随后在容器内部写一个log.txt文件,退出后把这个容器提交为镜像。

    镜像的备注为centos with log,作者是myself,镜像名称是test并且标签为v1.0

    此时查看镜像,就多出了一个test镜像,并且testcentos两个镜像的大小都是231m,因为创建的那个log.txt太小了,所以看上去两者一样大。

    查看镜像信息:

    在这里插入图片描述

    此时Comment内部就是备注,Author是作者。


    docker cp

    • 功能:在容器和宿主机之间拷贝文件

    语法:

    docker cp [option] [container:]src_path [container:]dest_path
    

    此处container:表示这个路径在容器中,如果不带这个说明是宿主机的路径。

    在这里插入图片描述

    首先创建一个nginx容器,在容器内部创建一个nginx.txt文件,退出容器回到宿主机。先通过docker cp test12:/nginx.txt ./,把容器内部的文件拷贝到宿主机。这样宿主机中就得到了从容器内部的文件。

    在这里插入图片描述

    再在宿主机创建一个ubuntu.txt,通过docker cp ./ubuntu.txt test12:/拷贝到容器内部,让容器执行ls /时,就多出了拷贝过去的新文件。


    docker diff

    • 功能:检查容器文件结构的更改

    语法:

    docker diff container
    

    尝试检查刚才的test12文件:

    在这里插入图片描述

    每一行的前缀,A表示add添加文件,C表示change修改文件。其中就包含A /ubuntu.txtA nginx.txt,表示添加了这两个文件,其它的都是nginx容器启动时的一些相关文件。


    docker export

    • 功能:导出容器为一个压缩包

    语法:

    docker export [option] container
    

    选项:

    • -o:将导出到指定文件

    test12容器打包:

    在这里插入图片描述


    docker import

    • 功能:从压缩包中创建镜像

    语法:

    docker import [option] file [image[:tag]]
    

    选项:

    • -m:备注

    导入刚才的test.tar

    在这里插入图片描述

    这样就可以拿到镜像了。

    这里的导入导出流程是:容器 -> 压缩包 -> 镜像,一般用于直接把容器内容打包传递给其它主机时使用,其他主机拿到镜像后,就可以实例化出一样的容器。


    docker rename

    • 功能:重命名容器

    语法:

    docker rename container newname
    

    docker stats

    • 功能:显示容器资源的使用情况

    语法:

    docker stats [option] [container...] 
    

    选项:

    • -a:显示所有容器,包括未运行的容器
    • --no-stream:显示当前情况后直接退出
    • --no-trunc:不截断输出

    直接执行docker stats

    在这里插入图片描述

    此时显示所有正在运行的容器的情况,并且每秒钟都会刷新一次,如果只希望输出一次,加上--no-stream选项。


    docker top

    • 功能:查看容器内部的进程信息

    语法:

    docker top container [option]
    

    选项:
    相当于Linuxps命令,只要是ps可以使用的参数,都可以作为docker top的参数。

    查看test12容器内部的进程:

    在这里插入图片描述

    test12内部运行了三个进程,此处的参数-aux,就是ps -aux的参数。


    docker port

    • 功能:查看容器的端口映射

    语法:

    docker port container [option]
    

    查看test9的端口映射:

    在这里插入图片描述


    docker update

    • 功能:更新容器配置

    语法:

    docker update [option] container
    

    选项:

    • --cpus:CPU的数量
    • --cpuset-cpus:允许使用哪些CPU的核
    • -m:内存限制

    docker container inspect

    • 功能:查看容器的详细信息

    语法:

    docker container inspect
    

    查看test9的详细信息:

    在这里插入图片描述

    此时可以看到test9容器的一些内容,比如当前运行状态,创建时间,是否重启等等。

    此处使用的命令是docker inspect,而不是docker container inspect

    还有一个命令docker image inspect,它和docker container inspect都可以简写为docker inspect,此时docker会自动识别目标是一个容器还是镜像。


    docker container prune

    • 功能:删除所有已经停止的容器

    语法:

    docker container prune [option]
    

    选项:

    • -f:不再进行确认

    删除当前已经停止的容器:

    在这里插入图片描述

    首先通过ps -a查询,此时可以看到很多已经停止的容器,执行docker container prune后,进行了一次确认[y/N],如果不想询问可以加上-f选项,随后已经停止的容器就被删除了。


    容器模式

    attach

    当运行容器时,docker run不加-it或者-d选项,会进入attach模式。

    创建一个nginx容器:

    在这里插入图片描述

    这个情况之前已经讲解过,此时终端会一直阻塞,并且会输出容器的日志信息,这种模式称为attach模式。这种模式下,可以通过ctrl + c终止,但是容器也会一起退出,开发环境是不会使用这个模式的,就算要看日志,也可以通过docker log


    deatached

    当使用-d或者--detach选项,让容器在后台运行,称为detached模式。

    创建一个后台nginx容器:

    在这里插入图片描述

    这种模式下,容器会一直运行,不会因为一个ctrl + c就退出。如果想要进入容器执行命令,可以通过docker exec命令。


    interactive

    当创建好一个容器后,可能需要进入容器内部进行复杂的操作,此时docker exec用起来就很麻烦。

    为此,可以使用docker exec -it ... bash的组合,此时就可以进入容器内部,通过bash终端操作容器,此时称为interactive模式。

    在这里插入图片描述

    如果想要退出这个终端,输入exit即可,但是不能输入ctrl + c,否则容器也会退出。


  • 相关阅读:
    添加spark的相关依赖和打包插件(第六弹)
    招投标系统简介 企业电子招投标采购系统源码之电子招投标系统 —降低企业采购成本
    YOLO_v6讲解
    computed和watch的区别
    java使用poi、itextpdf将word、ppt转为pdf文件,并对pdf文件加盖签章
    spring源码 - bean的实例化过程
    Linux文件系统
    springboot网上投资借贷中介服务毕业设计-附源码221506
    《uni-app》一个非canvas的飞机对战小游戏实现-子弹模型的实现
    运放的基础知识
  • 原文地址:https://blog.csdn.net/fsdfafsdsd/article/details/143260061