Docker容器的使用与操作

1、什么是容器

        镜像和容器的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义容器是镜像运行时的实体,基于同一镜像可以创建若干个不同的容器。

        每个容器都有一个软件镜像。可以将容器看作一个将应用程序及其依赖环境打包而成的集装箱。容器可以被创建、启动、停止、删除、暂停等。

        容器的实质是进程,容器进程在属于自己的独立的命名空间内进行。

2、容器的基本信息

使用docker ps -a命令可以输出本机上的全部容器列表

 [root@docker-2322030238 ~]# docker ps -aCONTAINER ID   IMAGE         COMMAND       CREATED       STATUS                   PORTS     NAMESd0ba3b089e49   ubuntu        "/bin/bash"   5 weeks ago   Exited (0) 5 weeks ago             elastic_kepler446cd6f8f8cc   hello-world   "/hello"      5 weeks ago   Exited (0) 5 weeks ago             brave_swartz

上述列表反映了容器的基本信息。CONTAINER ID列表示容器ID,IMAGE列表示容器所用镜像的名称,COMMAND列表示启动容器时执行的命令,CREATED列表示容器的创建时间,STATUS列表示容器运行的状态(UP表示运行中,Exited表示已停止),POPTS列表示容器对外发布的端口号,NAMES列表示容器名称

容器ID能保证唯一性,但难于记忆,因此可以通过容器名称来代替容器ID引用容器。可以在执行docker run命令时通过--name选项自行指定。还可以使用docker rename命令为现有容器重命名。

 docker rename d0ba3b089e49 ubuntu_server

3、可写的容器层

        容器与镜像的主要不同之处是容器顶部的可写层。一个镜像由多个可读的镜像层组成,正在运行的容器会在这个镜像上面增加一个可写的容器层,所有写入容器的数据(包括添加的新数据或修改的已有数据)都保存在这个可写层中。当容器被删除时,这个可写层也会被删除,但是底层的镜像层保持不变。因此,任何对容器的操作均不会影响到其镜像。 ​

        由于每个容器都有自己的可写容器层,所有的改变都存储在这个容器层中,因此多个容器可以共享访问同一个底层镜像,并且仍然拥有自己的数据状态。

4、磁盘上的容器大小

使用docker ps -s 命令查看一个运行中的容器的大小,SIZE 列会显示两个不同的值

 [root@docker-a ~]# docker run -d httpd495355dcccdb5ff7f0a52a1dd3ff231daa590b7cd16b99911a5bec6b64a88975# 查看该容器的大小CONTAINER ID   IMAGE     COMMAND    ...      NAMES           SIZE495355dcccdb   httpd     "httpd-foreground" ...  peaceful_pike   2B (virtual 148MB)

SIZE列第1个值表示每个容器的可写层当前所用的数据大小。第2个值是虚拟大小,表示该容器所用只读镜像的数据量加上容器可写层大小的和。

磁盘上正在运行的容器所用的磁盘空间每个容器大小和虚拟大小值的总和

5、写时复制策略

写时复制是一个高效率的文件共享复制策略。共享有助于减小镜像大小。复制使容器效率更高

大致步骤:

        1、从镜像各层中搜索要修改的文件,从最新的层开始直到最底层,一次一层,被找到的文件将被添加到缓存中以加速后续操作。

        2、对找到文件的第1个副本执行copy up操作,将其复制到容器的可写层中。

6、容器操作指令

        Docker 提供了相当多的容器操作命令,既包括创建、启动、停止、删除、暂停等容器生命周期管理操作。

Docker还提供了一个统一的容器管理命令docker container,基本语法如下:

docker container 子命令

docker container子命令docker子命令功能
docker container attachdocker attach进入容器
docker container commitdocker commit从当前容器创建新的镜像
docker container cpdocker cp在容器和本地文件系统之间复制文件和目录
docker container createdocker create创建新的容器
docker container diffdocker diff检查容器创建以来其文件系统上文件或目录的更改
docker container execdocker exec从正在运行的容器中执行命令
docker container exportdocker export将容器的文件系统导出为一个归档文件
docker container inspectdocker inspect显示一个或多个容器的详细信息
docker container killdocker kill杀死”一个正在运行的容器
docker container logsdocker logs获取容器的日志信息
docker container lsdocker ps输出容器列表
docker container pausedocker pause暂停一个或多个容器内的所有进程
docker container portdocker port列出容器的端口映射或特定的映射
docker container prune删除所有停止执行的镜像
docker container renamedocker rename对容器重命名
docker container restartdocker restart重启一个或多个容器
docker container rmdocker rm删除一个或多个容器
docker container rundocker run创建一个新的容器并执行命令
docker container startdocker start启动一个或多个已停止的容器
docker container statsdocker stats显示容器资源使用统计信息的实时流
docker container stopdocker stop停止一个或多个正在运行的容器
docker container topdocker top显示容器正在运行的进程
docker container unpausedocker unpause恢复一个或多个容器内被暂停的所有进程
docker container updatedocker update更新一个或多个容器的配置
docker container waitdocker wait阻塞一个或多个容器的运行,直到容器停止运行,然后输出

7、操作

7.1、创建并同时启动容器

使用docker run命令运行一个容器,基本语法:

 docker run[选项]镜像[命令][参数···]

-d(--detach)后台运行容器,并返回容器ID。
-i(--interactive):让容器的标准输入保持打开,通常与-t选项同时使用。
-t(--tty):为容器重新分配一个伪输入终端(Pseudo TTY),通常与-i选项同时使用。
-p(--publish):设置端口映射,格式为“主机端口:容器端口”。
--dns:指定容器使用的DNS服务器,默认和主机上的DNS设置一致。
--name:为容器指定一个名称
--rm容器退出时自动删除

 # 启动容器执行命令后自动终止容器,不常用,主要用来测试[root@docker-a ~]# docker run ubuntu /bin/echo "这是一个自动终止的容器"这是一个自动终止的容器​# 启动容器并允许用户交互# 将-1和-t两个选项合并在一起,-t让Docker分配一个伪终端并绑定到容器的标准输入中,则让容器的标准输入保持打开状态,自动进入容器的交互模式,此时可通过终端执行命令[root@docker-a ~]# docker run -it ubuntu /bin/bashroot@d9778e5b51e2:/# root@d9778e5b51e2:/# ls     # 列出当前目录下的文件bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  varroot@d9778e5b51e2:/# exit   # 退出容器exit​# 启动容器并让其以守护进程的形式在后台运行[root@docker-a ~]# docker run -d -p 80:80 --name testweb httpd  # 启动-个Web服务器的容器8320b75a0036c01bc5d1ffda24fbcaa92ad2f61c0a3d81164fb78b9c0563ce5b# 容器启动后在后台运行,并返回一个唯一的容器ID,可以通过该ID 对容器进行进一步操作。也可以通过docker ps命令来查看正在运行的容器的信息[root@docker-a ~]# docker psCONTAINER ID   IMAGE    ...  STATUS          PORTS                  NAMES8320b75a0036   httpd    ...  Up 48 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   testweb​# 由于在后台运行,容器不会将输出直接显示在主机上,使用 docker logs 命令来获取容器的输出信息[root@docker-2322030238 ~]# docker logs testwebAH00558: httpd: Could...

执行docker run命令创建并启动容器时,Docker在后台运行的操作步骤如下:

  • 检查本地是否存在指定的镜像,如果没有就从镜像仓库自动下载这个镜像。
  • 基于镜像创建一个容器并启动它
  • 为容器分配一个文件系统,并在镜像层顶部增加一个可读写的容器层
  • 从主机配置的网桥接口中将一个虚拟接口桥接到容器。
  • 从网桥的地址池中给容器分配一个IP地址
  • 运行用户指定的应用程序。
  • 根据设置决定是否终止容器运行

这种在后台运行容器的方式又称分离(Detached)模式,与之相对的是前台(Foreground)模式。

7.2、创建容器

使用docker create 命令创建一个新的容器,但不启动它,其基本语法

 docker create[选项] 镜像 [命令][参数···]

 # 基于busybox镜像创建一个容器[root@docker-a ~]# docker create -i -t busyboxUnable to find image 'busybox:latest' locallylatest: Pulling from library/busybox7b2699543f22: Pull complete Digest: sha256:c3839dd800b9eb7603340509769c43e146a74c63dca3045a8e7dc8ee07e53966Status: Downloaded newer image for busybox:latestdb0b8744590de26b9c4df8ea942fc06d2499770314dc7c44541687c082749208

这个容器处于已创建(Created)但未启动的状态,最后一行返回的是容器ID,可以使用docker start命令启动容器

7.3、启动容器

使用docker start命令启动一个或多个处于停止状态的容器,其基本语法

docker start[选项]容器[容器…]

# 启动上述容器
[root@docker-a ~]# docker start db0b8744...
db0b8744...

运行中的容器,可以使用docker restart命令重新启动它。

7.4、停止容器

使用docker stop命令停止一个或多个处于运行状态的容器,其基本语法

docker stop [选项]容器[容器···]

# 停止上述容器
[root@docker-a ~]# docker stop db0b8744...
db0b8744...

也可以使用 docker pause命令暂停容器中所有的进程

docker unpause命令,恢复容器中被暂停的所有进程

还可以使用docker kill命令“杀死(强制停止)”一个或多个容器。

docker kill [选项]容器[容器…]

7.5、重命名容器

使用docker rename命令为现有的容器重新命名,以便于后续的容器操作,基本语法

docker rename 容器 容器名称

[root@docker-a ~]# docker run -d httpd
36801b2a29907a711eb89affbdc28d8c4f5111ea53eadffcc14829f940f71390
[root@docker-a ~]# docker rename 36801b2a29907a711 myweb
[root@docker-a ~]# docker ps -l
CONTAINER ID   IMAGE     ...    STATUS          PORTS     NAMES
36801b2a2990   httpd     ...    Up 31 seconds   80/tcp    myweb

7.6、显示容器列表

使用docker ps命令显示容器列表,基本语法

docker ps [选项]

主要选项说明如下。
-a(--all)显示所有的容器,包括未运行的容器
-f(--filter):根据条件过滤显示的容器。
-l(--latest):显示最近创建的容器。
-n(--lastint):列出最近创建的n个容器。
--no-trunc不截断输出,显示完整的容器信息
-q(--quiet):采用静默模式,只显示容器ID
-s(--size):显示总的文件大小

不带任何选项执行该命令会列出所有正在运行的容器信息。可以使用-a选项列出所有的容器

[root@docker-a ~]# docker ps -a
CONTAINER ID   IMAGE      STATUS       ...    PORTS            NAMES
36801b2a2990   httpd      Up 2 minutes   ...  80/tcp           myweb
...

-f选项可以通过多种条件过滤容器,如id(容器ID)、name(容器名称)、label(由键值对定义的元数据)、status(状态,可用值有created、restarting、running、removing、paused、exited、dead等。

# 列出了已停止的容器
[root@docker-2322030238 ~]# docker ps --filter status=exited
CONTAINER ID   IMAGE     ...      STATUS        PORTS     NAMES
db0b8744590d   busybox    ...  Exited (137) 10 minutes ago      modest_feistel
...

通过shell命令替换docker ps命令可以完成容器的批量操作。

# 暂停正在运行的所有容器
docker pause $(docker ps -f status=running -q)

7.7、查看容器详细信息

使用docker inspect命令来查看容器的详细信息,也就是元数据。

[root@docker-a ~]# docker inspect --format='{{.Name}}' 36801b2a2990
/myweb

通过JSON格式的State子节获取容器的状态元数据。

[root@docker-a ~]# docker inspect --format='{{json .State}}' myweb
{"Status":"paused","Running":true...

7.8、进入容器

方法一:使用docker attach命令连接到正在运行的容器,其语法格式

docker attach [选项] 容器

# 连接到一个运行中的容器并从中退出的过程
[root@docker-a ~]# docker run -d --name topdemo ubuntu /usr/bin/top -b
73c97d3a43c30c0c4b03574c3a79a56e5da66d372c36427769eaf5c5db9026d3
[root@docker-2322030238 ~]# docker attach topdemo 
...
top - 10:07:41 up
...
[root@docker-a ~]# docker ps -a | grep topdemo
73c97d3a43c3   ubuntu        "/usr/bin/top -b"       39 seconds ago   Exited (0) 13 seconds ago                                         topdemo

Ctrl+C 组合键不仅会从容器退出(脱离容器),而且会导致容器停止。要使容器依然运行,就需要在执行Docker run 命令运行容器时加上--sig-proxy=false 选项,确保按 Ctrl+C 组合键或Ctrl+D组合键不会停止容器

docker attach --sig-proxy=false topdemo

这个命令比较过时,更多的Docker用户会考虑使用docker exec命令来实现相同的功能

方法二:使用docker exec命令在正在运行的容器中执行命令,其语法格式

docker exec [选项]容器 命令[参数···]

-d选项表示分离模式, 在后台运行命令;-i选项表示即使没有连接上也保持标准输入处于打开状态是一种交互模式-t选项用于分配一个伪终端

# 进入一个运行中的容器,交互执行命令,并从容器中退出的过程
[root@docker-2322030238 ~]# docker start topdemo
topdemo
[root@docker-2322030238 ~]# docker exec -it topdemo /bin/bash
root@73c97d3a43c3:/# psPID TTY          TIME CMD7 pts/0    00:00:00 bash15 pts/0    00:00:00 ps
root@73c97d3a43c3:/# exit
exit
[root@docker-2322030238 ~]# 

7.9、删除容器

使用docker rm命令删除一个或多个容器,基本语法

docker rm [选项] 容器 [容器…]

默认情况下,只能删除没在运行的容器。要删除正在运行的容器,需要使用-f(--force)选项通过SIGKILL信号强制删除:

[root@docker-2322030238 ~]# docker rm -f topdemo
topdemo

还有两个选项与网络连接数据卷有关:-l(--link)选项设置是否删除容器的网络连接,而保留容器本身;-v(--volumes)选项设置是否删除与容器关联的卷。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/1723.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用vue3+ts+vite从零开始搭建bolg(二)

二、全局变量 2.1element-ui集成 pnpm i element-plus pnpm i element-plus element-plus/icons-vue main.ts配置文件 import ElementPlus from element-plus import element-plus/dist/index.css //ts-ignore import zhCn from element-plus/dist/locale/zh-cn.mjsapp.use…

浅说深度优先搜索(中)——回溯

写在最前 相信在你们不懈的努力之下,基本的递归一定可以写出来了,那么我们现在就来看看递归的升级版——回溯怎么写吧! 简说回溯 递归是一种特别重要的解题策略。大部分题目需要找到最优解,而这个求解过程可能存在一定的规律性…

用单片机的矩阵键盘选择显示什么图像

注意行数据不能二进制 #include "reg51.h"typedef unsigned int u16; //对系统默认数据类型进行重定义 typedef unsigned char u8;//定义74HC595控制管脚 sbit SRCLKP3^6; //移位寄存器时钟输入 sbit RCLKP3^5; //存储寄存器时钟输入 sbit SERP3^4; //串行数据输入…

UE5(基础动作)多人游戏制作蹲伏

1.创建输入操作,IA_Crouch 在输入映射中添加 IA_Crouch,在触发器中创建两个索引,已按下已松开来创建蹲伏输入。 蹲伏操作必须要勾选角色-角色移动-crouch勾选可蹲伏否则你的人物无法真正蹲下。 为蹲伏创建函数,创建布尔来判断是否蹲伏。 通过…

CodeGemma初探

什么是 CodeGemma CodeGemma是一系列强大而轻量级的模型的集合,可以执行各种编码任务,包括填充中间代码补全、代码生成、自然语言理解、数学推理和指令跟随。 版本: instruct:7B, 这个版本专门针对自然语言到代码聊天和指令跟随…

day83 AJAX

1什么是AJAX AJAX语法 AJAX Asynchronous JavaScript and XML 异步js和XML 实现页面某一部份更新,无需服务器转发或重定向 1 $.ajax() 语法: $.ajax( { "url" : "url&qu…

数据库主从复制

一、主从复制概述 1、介绍: 主从复制是指将主数据库的 DDL 和 DML 操作写入到二进制日志中,将二进制日志传送到从库服务器,然后在从库上对这些日志重新执行(重做),从而使得从库和主库的数据保持同步。 M…

百面算法工程师 | 分类网络总结

欢迎大家订阅我的专栏一起学习共同进步,主要针对25届应届毕业生 祝大家早日拿到offer! lets go http://t.csdnimg.cn/dfcH3 目录 4. 经典分类网络与发展 4.1 AlexNet 4.2 VGGNet 4.3 GoogLeNet Inception 4.4 ResNet 4.5 DenseNet 4.6 MobileN…

C#中的浅拷贝(Shallow Copy)和深拷贝(Deep Copy),深拷贝的集中实现方式,浅拷贝深拷贝的案例

C#中的浅拷贝(Shallow Copy)和深拷贝(Deep Copy) 拷贝就是创建一个对象,这个对象有着原始对象数据(属性和字段)的一份精确拷贝(只针对Object和Array这样的引用数据类型)…

mysql面试题七(集群)

目录 1.mySQL 中有哪些常见日志 错误日志(Error Log) 二进制日志(Binary Log, Binlog) 重做日志(Redo Log) 回滚日志(Undo Log) 慢查询日志(Slow Query Log&#xf…

截断堆积柱状图

本教程原文链接:截断堆积柱状图绘制教程 欢迎大家转载!!!! 本期教程 写在前面 堆积柱状图是柱状图的常见类型之一,也是平时使用概率较高的图形之一。我们前期发布了很多个柱状图的绘制教程,若你…

java学习笔记4

7. 二维数组 7.1 定义 二维数组及就是数组的嵌套,数组的元素还是数组; 二维数组是一个 元素为一维数组 的一维数组; 语法上Java支持多维数组,但从内存分配原理的角度看,Java中只有一维数组,没有多维数组; 7.2 二维数组的初始化和赋值 7.2.1 长度已知 数据类型[][] 数…

【工厂模式】简单工厂模式-简单例子

目录 一、简单介绍 二、未使用工厂模式之前 三、简单工厂模式 初始 优化 总结 一、简单介绍 工厂模式是一种软件设计模式,用于创建对象的方法。在工厂模式中,创建对象的逻辑被封装在一个单独的类中,该类负责根据特定条件或参数创建合适…

windows下使用命令uvicorn启动fastapi程序有乱码,方框形状奇怪字符

问题简述 执行命令uvicorn main:app --reload后出现的问题如图所示 这个问题非常容易解决! 原因是windows控制台 默认未开启 ANSI颜色的支持 那么我们只需要开启就可以了 轻松解决 1 按下winR 打开运行 2 输入regedit 点击确定编辑注册表 3 新建值 值的名称为…

探索PostCSS:打造定制化、前瞻性的现代CSS开发工作流

PostCSS,作为一个高度可扩展的CSS处理器,以其强大的插件系统和对CSS未来特性的前瞻支持,已经成为现代前端开发中的重要工具。本篇文章将深入探讨PostCSS的核心概念、工作原理、主要优势,以及如何利用它来提升CSS开发效率与代码质量…

vue3组件封装系列-表单请求

我们在开发一些后台管理系统时,总是会写很多的列表查询页面,如果不封装组件,就会无限的复制粘贴,而且页面很冗余,正常情况下,我们都是要把组件进行二次封装,来达到我们想要效果。这里我分享一下…

《中学科技》是什么级别的刊物?如何投稿?

《中学科技》是什么级别的刊物?如何投稿? 《中学科技》创刊于1976年,由上海世纪出版(集团)有限公司主管,上海科技教育出版社有限公司主办的省级学术期刊,《中学科技》以传播科技知识、启迪智慧…

Centos安装软件失败There are no enabled repos.

这个错出现的原因可能是:没有先安装wget源,就把源给备份了 解决方案: 下载对应版本repo文件, 放入/etc/yum.repos.d/里,下载地址:CentOS镜像使用帮助 查看自己CentOS的版本,下载对应的repo文件&#xff…

spring boot中的标注@Component、@Service等

让我告诉你什么叫水货。 一、水货横行 一直以来,我对Spring Boot项目中的标注,像Component啦、Service啦、Configuration啦,甚至Autowired啦,等等,都似懂非懂。Autowired与Resource有什么区别也不清楚。 个中原因&a…

LearnOpenGL(三)之GLSL

一、GLSL 着色器是使用一种叫GLSL的类C语言写成的。 着色器的开头总是要声明版本,接着是输入和输出变量、uniform 和main函数。每个着色器的入口点都是main函数,在这个函数中 我们处理所有的输入变量,并将结果输出到输出变量中。 二、数据…